HeadlinesBriefing HeadlinesBriefing.com

インデックスでメッセージバスを拡張

Hacker News •
×

Ariaは、当社の社内メッセージングフレームワークであり、1日に数テラバイトのデータを処理するホスト型システムです。クライアントはAriaを購読してメッセージのライブストリームを受け取ります。利用が急速に拡大したため、Ariaチームはデータ量とスループットの増加に対応するためにシステムを再設計する必要がありました。今夏、インターンのTheodor Totevは、クライアントがメッセージの一部だけを読む場合のコストを下げるという具体的なユースケースに取り組みました。インデックスとツリー分割を用いた彼の作業により、本番ワークロードでのCPU使用率は30%削減され、この重要なシステムに求められる高い正確性の基準も維持されました。

AriaはTCP経由でメッセージを配信する際、ストリームの末尾と呼ばれる最近のメッセージをメモリ内のリングバッファに保持します。遅れたクライアントは、このバッファから最近のメッセージを要求して追いつくことができ、この処理はティップリカバリーと呼ばれます。課題は、Ariaがストリーム全体を保存する一方で、クライアントは多くの場合そのごく一部しか必要としないことです。Ariaはトピックごとにストリームをフィルタリングし、クライアントは個別のトピックまたはトピックサブツリー全体を購読できます。当初の方法は、ストリームを単純に線形走査するものでした。アルゴリズム的には非効率でしたが、CPUキャッシュとの相性が良く、比較的高速でした。ティップリカバリーを行うクライアントが増えると、一部のサーバーはCPU使用率が100%に達し、クライアントがティップから外れて追いつけなくなりました。

Ariaのインスタンスはトピックが百万近くになることもあるため、トピックごとにインデックスを作る案は現実的ではないとして退けられました。代わりにTheodorは、同じ2セグメントの接頭辞を共有するすべてのトピックをまとめたトピックパーティションごとにインデックスを作成しました。各パーティションのインデックスは、そのメッセージのストリーム内の位置を記録します。クライアントがメッセージを要求すると、Ariaは最小ヒープを用いて関連するインデックスのn方向マージを行い、要求されたパーティションに限って順序通りのストリームを再構築します。

この作業ではベンチマークが中心的な役割を果たしました。Theodorはトピックパーティションの数、インターリーブの度合い、リーダーの数などの変数をテストするプロファイリングツールを作成しました。初期実装をプロファイリングしたところ、最小ヒープが最大のボトルネックであることがわかりました。

出典: Hacker News · 要約:HeadlinesBriefing