Upgrade to Pro — share decks privately, control downloads, hide ads and more …

秒間数十万件のデータをリアルタイムに処理するデータ分析基盤の裏側

 秒間数十万件のデータをリアルタイムに処理するデータ分析基盤の裏側

2024/08/21 に開催された TVer x PIVOT x PLAY合同「メディアをエンジニアリングする裏側大公開」で発表した内容です。
https://pivot-growth-drivers.connpass.com/event/322783/

Avatar for PLAY, inc.

PLAY, inc.

August 21, 2024
Tweet

More Decks by PLAY, inc.

Other Decks in Technology

Transcript

  1. $ whoami ؙࢁ ݈Ұ (Kenichi Maruyama) PLAY CLOUD ຊ෦ ςοΫϦʔυ

    2016 ೥ʹεΩϧΞοϓɾϏσΦςΫϊϩδʔζגࣜձࣾʹ৽ ଔೖࣾɻಈը഑৴ϓϥοτϑΥʔϜ ULIZA ͷ։ൃऀͱͯ͠ɺ ೝূج൫΍σʔλ෼ੳج൫ɺνϟοτػೳ΍Χʔυܾࡁػೳ ͷઃܭ΍࣮૷Λख͕͚Δɻ2022 ೥ʹςοΫϦʔυʹब೚ޙɺ ςοΫϒϩά “PLAY DEVELOPERS BLOG” Λ্ཱͪ͛ɻݱࡏ ͸ࣗࣾͷ։ൃνʔϜ΍άϧʔϓձࣾʹٕज़తͳࢧԉΛߦ͏ɻ
  2. ࢹௌಈ޲σʔλ෼ੳج൫ʹ͍ͭͯ ʮ୭͕ɺ͍ͭɺͲ͜ͰɺͲͷಈըΛɺͲΜͳ୺຤ͰɺͲΕ͘Β͍ݟ͔ͨʯ ͜͏͍ͬͨࢹௌಈ޲σʔλͷ ऩूɺ஝ੵɺ෼ੳɺ͓ΑͼՄࢹԽ Λߦ͏γεςϜ ϢʔβʔIDɿ 123 ίϯςϯπIDɿ ABC ݱࡏͷ࠶ੜঢ়ଶɿ

    ࠶ੜத ݱࡏͷ࠶ੜҐஔɿ 01:31 ఆظతʹσʔλૹ৴ ίϯςϯπʮABCʯ͸ ެ։ॳ೔ͰͲΕ͘Β͍ ࠶ੜ͞Εͨͷ͔ͳʁ ूܭΫΤϦ࣮ߦ ࢹௌऀ༷ ഑৴ࣄۀऀ༷ σʔλ෼ੳج൫
  3. Pre-processor ͷߴ଎Խ 1,500 rps 初期実装では思うようにスループットが出なかったため、性能改善を⾏いました。 1. ARM ベースの CPU(Graviton 2

    プロセッサ)に変更 2. ウェブサーバを Express から μWebSockets.js に変更 ˛ ໨ඪɿ1vCPU ͋ͨΓ 5,000 rps
  4. Pre-processor ͷߴ଎Խ 2,500 rps 初期実装では思うようにスループットが出なかったため、性能改善を⾏いました。 1. ARM ベースの CPU(Graviton 2

    プロセッサ)に変更 2. ウェブサーバを Express から μWebSockets.js に変更 3. バリデーションライブラリを validatorjs から ajv に変更 ˛ ໨ඪɿ1vCPU ͋ͨΓ 5,000 rps
  5. Pre-processor ͷߴ଎Խ 6,000 rps 初期実装では思うようにスループットが出なかったため、性能改善を⾏いました。 1. ARM ベースの CPU(Graviton 2

    プロセッサ)に変更 2. ウェブサーバを Express から μWebSockets.js に変更 3. バリデーションライブラリを validatorjs から ajv に変更 4. プロセスの内部でキューイングを⾏い、Kinesis Data Streams に最⼤ 500 件のデータをまとめて投⼊ ˛ ໨ඪɿ1vCPU ͋ͨΓ 5,000 rps
  6. Pre-processor ͷߴ଎Խ Player Pre-processor Kinesis Data Streams HTTP POST 200

    OK validation, transfrom, etc. 1 Success! PutRecord HTTP POST 200 OK validation, transfrom, etc. Success! PutRecord BEFORE
  7. Pre-processor ͷߴ଎Խ Player Pre-processor Kinesis Data Streams In-memory Queue HTTP

    POST 200 OK validation, transfrom, etc. PutRecords enqueue HTTP POST 200 OK validation, transfrom, etc. enqueue dequeue 100 ms ごとに定期実⾏ 500 Success! AFTER
  8. Pre-processor ͷߴ଎Խ 7,000 rps 初期実装では思うようにスループットが出なかったため、性能改善を⾏いました。 1. ARM ベースの CPU(Graviton 2

    プロセッサ)に変更 2. ウェブサーバを Express から μWebSockets.js に変更 3. バリデーションライブラリを validatorjs から ajv に変更 4. プロセスの内部でキューイングを⾏い、Kinesis Data Streams に最⼤ 500 件のデータをまとめて投⼊ 5. データの圧縮アルゴリズムを gzip から Snappy に変更 ˛ ໨ඪɿ1vCPU ͋ͨΓ 5,000 rps
  9. Pre-processor ͷߴ଎Խ 7,500 rps 初期実装では思うようにスループットが出なかったため、性能改善を⾏いました。 1. ARM ベースの CPU(Graviton 2

    プロセッサ)に変更 2. ウェブサーバを Express から μWebSockets.js に変更 3. バリデーションライブラリを validatorjs から ajv に変更 4. プロセスの内部でキューイングを⾏い、Kinesis Data Streams に最⼤ 500 件のデータをまとめて投⼊ 5. データの圧縮アルゴリズムを gzip から Snappy に変更 6. 圧縮を⾏うメソッドの呼び出しを⾮同期 (async) から同期 (sync) に変更 ˛ ໨ඪɿ1vCPU ͋ͨΓ 5,000 rps
  10. Pre-processor ͷߴ଎Խ 8,000 rps 初期実装では思うようにスループットが出なかったため、性能改善を⾏いました。 1. ARM ベースの CPU(Graviton 2

    プロセッサ)に変更 2. ウェブサーバを Express から μWebSockets.js に変更 3. バリデーションライブラリを validatorjs から ajv に変更 4. プロセスの内部でキューイングを⾏い、Kinesis Data Streams に最⼤ 500 件のデータをまとめて投⼊ 5. データの圧縮アルゴリズムを gzip から Snappy に変更 6. 圧縮を⾏うメソッドの呼び出しを⾮同期 (async) から同期 (sync) に変更 7. 正規表現を極⼒使わない、どうしても使う場合は速度を意識して使う ˛ ໨ඪɿ1vCPU ͋ͨΓ 5,000 rps
  11. Pre-processor ͷߴ଎Խ 8,000 rps 初期実装では思うようにスループットが出なかったため、性能改善を⾏いました。 1. ARM ベースの CPU(Graviton 2

    プロセッサ)に変更 2. ウェブサーバを Express から μWebSockets.js に変更 3. バリデーションライブラリを validatorjs から ajv に変更 4. プロセスの内部でキューイングを⾏い、Kinesis Data Streams に最⼤ 500 件のデータをまとめて投⼊ 5. データの圧縮アルゴリズムを gzip から Snappy に変更 6. 圧縮を⾏うメソッドの呼び出しを⾮同期 (async) から同期 (sync) に変更 7. 正規表現を極⼒使わない、どうしても使う場合は速度を意識して使う 8. Map と Set を効果的に活⽤ ˛ ໨ඪɿ1vCPU ͋ͨΓ 5,000 rps
  12. Pre-processor ͷߴ଎Խ 8,000 rps 初期実装では思うようにスループットが出なかったため、性能改善を⾏いました。 1. ARM ベースの CPU(Graviton 2

    プロセッサ)に変更 2. ウェブサーバを Express から μWebSockets.js に変更 3. バリデーションライブラリを validatorjs から ajv に変更 4. プロセスの内部でキューイングを⾏い、Kinesis Data Streams に最⼤ 500 件のデータをまとめて投⼊ 5. データの圧縮アルゴリズムを gzip から Snappy に変更 6. 圧縮を⾏うメソッドの呼び出しを⾮同期 (async) から同期 (sync) に変更 7. 正規表現を極⼒使わない、どうしても使う場合は速度を意識して使う 8. Map と Set を効果的に活⽤ ˛ ໨ඪɿ1vCPU ͋ͨΓ 5,000 rps ໨ඪΛ্ճΔ 8,000 rps Λୡ੒ !!
  13. Apache Flink ʹΑΔϦΞϧλΠϜ෼ੳ Apache Flink ストリームデータとバッチデータをステートフルに処理する オープンソースのフレームワークおよび分散処理エンジン ▪ ▪ ▪

    ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ INSERT INTO output_stream SELECT window_start, window_end, COUNT(*) AS count FROM TABLE( HOP(TABLE input_stream, DESCRIPTOR(timestamp), INTERVAL '60' SECOND, INTERVAL '20' SECOND) ) GROUP BY window_start, window_end; 12 12 14 16 …… ……