NewsPicksの広告配信システム(アドサーバー)を構築した際に高速に処理するためにアーキテクチャや設計上工夫したポイントの説明資料です。
ߴͳγεςϜΛߴʹ࡞ͬͨਿӜਖ਼໌
View Slide
NewsPicksͱ
ࠂ৴γεςϜͰߦ͍ͬͯΔ͜ͱࠂओϢʔβʔສࠂ৴γεςϜ広告効果・利益・ユーザー体験のバランスをとりながら最適化/FXT1JDLTܝࡌ
ࠂ৴Ͱߦ͍ͬͯΔ͜ͱɾࠂΩϟϯϖʔϯͷܝࡌظؒνΣοΫ ɾࠂΩϟϯϖʔϯͷ༧ࢉνΣοΫ ɾ༗ޮɺແޮϑϥάఆ ɾࠂจͷࠂࢦఆɾΧςΰϦࢦఆνΣοΫ ɾ࠷ೖࡳֹͷνΣοΫ ɾϑϦʔΫΤϯγʔͷνΣοΫ ɾೖࡳՁ֨ͷൺֱ$1$จͷೖࡳՁ֨Λ$1.ࢉηΧϯυϓϥΠεΦʔΫγϣϯํࣜʹΑΔམࡳՁ֨ܭࢉ ɾೖࡳ݁ՌͷهۃΊ͍ͯ࣌ؒ
ฏۉϨΠςϯγ平均レイテンシは2ms - 5ms
ϨΠςϯγͷ҆NTҎ্ Կ͔͓͔͍͠NT Կߟ͑ͳ࣮ͯ͘ݱͰ͖ΔNT ϓϩϑΣογϣφϧͷඪNT ͕ඞཁNT ൚༻04ͷݶքNT ϦΞϧλΠϜ04'1("ͳͲͷॿ͚͕ඞཁ
Ͳ͏ͬͯߴԽͤ͞Δͷ͔͍ݪҼ*0ɻ*0Λগͳ͘͢ΕߴԽ͢Δɻɾ%#ΞΫηεɾϑΝΠϧΞΫηεɾωοτϫʔΫΞΫηεసૹ.#ඵϝϞϦ44%)%%
Ͳ͏ͬͯߴԽͤ͞Δͷ͔εέʔϧΞτͣ͠Β͘ͳΔプロセス間でキャッシュを同期できない。キャッシュサーバーを⽤意すると、スケールアウトしない。単⼀障害点になりがち。「全ての必要データ」をキャッシュするACIDΛຬͨͤͳ͘ͳΔメモリとDBで不整合が発⽣。複数データソースを使った際にトランザクションが分かれる。େྔͷϝϞϦ͕ඞཁ 全てのデータをメモリに載せるためには多くのメモリ容量が⾜りない。৭ʑͳ՝͕...՝՝՝
Ͳ͏ͬͯߴԽͤ͞Δͷ͔ΠϯϝϞϦΞʔΩςΫνϟ・⾮同期DB書き込み・定期的にメモリとDBを同期させる仕組みDDD ・集約(Aggrigate) 単位にキャッシュ
ΠϯϝϞϦΞʔΩςΫνϟ - αʔόʔஔਤ (؆қ൛)
"Eϓϩηε"Eϓϩηε"EϓϩηεΠϯϝϞϦΞʔΩςΫνϟ - ͞Βʹ؆қ൛/FXT1JDLTαʔόʔϓϩηε%#%#ॻ͖ࠐΈϓϩηεɾ3&%0ϩάʢతͳϑΝΠϧʣΛ4ʹஔɾ%#ॻ͖ࠐΈΛฒྻඇಉظ࣮ߦʹ͢Δɾ%#ॻ͖ࠐΈΛϦϥϯՄೳʹ͢Δʢ͖ͱ͏ੑΛ࣋ͨͤΔʣ4ߋ৽௨3FEJT
ΠϯϝϞϦΞʔΩςΫνϟͱͷ૬ੑͷྑ͞・集約(Aggrigate)をロードすれば後は処理するだけͳͥυϝΠϯۦಈͳͷ͔ۀϩδοΫΛΓग़͍͢͠・アーキテクチャと業務ロジックを分離しやすい・業務ロジック中にキャッシュ等システムを意識するコードを埋め込む必要がない12
ͳͥυϝΠϯۦಈͳͷ͔
ΠϯϝϞϦΞʔΩςΫνϟ・I/Oを少なくする・全ての必要なデータをキャッシュする・⾮同期にDB書き込みを⾏うߴԽ·ͱΊDDD・業務を切り出す・正しい設計を⾏い、適切なサイズでキャッシュ12⾼速なシステムを作るために