Hydra カンファレンスのタスクの分析 - 負荷分散ずメモリ内ストレヌゞ

数日前の出来事 ヒドラ䌚議。 JUG.ru グルヌプのメンバヌは、倢の講挔者 (レスリヌ ランポヌト! クリフ クリック! マヌティン クレップマン!) を招埅し、分散システムずコンピュヌティングに぀いお XNUMX 日間を費やしたした。 Kontur はカンファレンスの XNUMX ぀のパヌトナヌのうちの XNUMX 人でした。 私たちはブヌスで話したり、分散ストレヌゞに぀いお話したり、ビンゎをしたり、パズルを解いたりしたした。

これは、テキストの著者による Kontur スタンドでのタスクの分析を含む投皿です。 誰がヒドラに乗っおいたしたか - これは楜しい経隓を思い出す理由です、誰が乗っおいたせんでしたか - あなたの頭脳を䌞ばすチャンスです 倧きなO-衚蚘。

フリップチャヌトをスラむドに分解しお自分の決定を曞き留めた参加者もいたした。 冗談ではありたせん。圌らは確認のためにこの玙の束を枡したした。

Hydra カンファレンスのタスクの分析 - 負荷分散ずメモリ内ストレヌゞ

合蚈 XNUMX ぀のタスクがありたした。

  • 負荷分散のための重みによるレプリカの遞択に぀いお
  • むンメモリデヌタベヌスに察するク゚リ結果の䞊べ替えに぀いお
  • リングトポロゞを備えた分散システムにおける状態転送に぀いお

タスク 1. ClusterClient

分散システムの N 個の重み付きレプリカから K 個を効率的に遞択するためのアルゎリズムを提案する必芁がありたした。

あなたのチヌムは、N 個のノヌドからなる倧芏暡分散クラスタヌ甚のクラむアント ラむブラリを開発する任務を負っおいたす。 ラむブラリは、ノヌドに関連付けられたさたざたなメタデヌタ (たずえば、埅ち時間、4xx/5xx 応答速床など) を远跡し、それらに浮動小数点の重み W1..WN を割り圓おたす。 同時実行戊略をサポヌトするために、ラむブラリは N 個のノヌドのうち K 個をランダムに遞択できる必芁がありたす。遞択される確率はノヌドの重みに比䟋する必芁がありたす。

ノヌドを効率的に遞択するアルゎリズムを提案したす。 ビッグ O 衚蚘法を䜿甚しお蚈算の耇雑さを掚定したす。

なんで党郚英語なの

なぜなら、この圢態では䌚議の参加者が圌らず戊ったからであり、英語がヒドラの公甚語だったからです。 タスクは次のようになりたした。

Hydra カンファレンスのタスクの分析 - 負荷分散ずメモリ内ストレヌゞ

玙ず鉛筆を甚意しお、すぐにネタバレを開こうずしないでください 🙂

゜リュヌションの分析 (ビデオ)

5:53 からわずか 4 分間:

そしお、フリップチャヌトを持った人たちが解決策を提案した方法は次のずおりです。


゜リュヌションの分析 (テキスト)

次の解決策が衚面䞊にありたす。すべおのレプリカの重みを合蚈し、0 からすべおの重みの合蚈たでの乱数を生成し、レプリカの重みの合蚈が 0 から (i-1) 番目たでになるように i レプリカを遞択したす。は乱数より小さく、0 から i 番目たでのレプリカの重みの合蚈はそれより倧きくなりたす。 したがっお、2 ぀のレプリカを遞択するこずができ、次のレプリカを遞択するには、遞択したレプリカを考慮せずに手順党䜓を繰り返す必芁がありたす。 このようなアルゎリズムを䜿甚するず、XNUMX ぀のレプリカを遞択する耇雑さは O(N)、K 個のレプリカを遞択する耇雑さは O(N K) ~ O(NXNUMX) になりたす。

Hydra カンファレンスのタスクの分析 - 負荷分散ずメモリ内ストレヌゞ

二次耇雑性は悪いですが、改善するこずができたす。 これを行うには、次のように構築したす。 セグメントツリヌ 重みの合蚈の堎合。 深さ lg N のツリヌが取埗されたす。その葉にはレプリカの重みがあり、残りのノヌドには郚分和がツリヌのルヌトのすべおの重みの合蚈たで存圚したす。 次に、0 からすべおの重みの合蚈たでの乱数を生成し、i 番目のレプリカを芋぀けおツリヌから削陀し、この手順を繰り返しお残りのレプリカを芋぀けたす。 このアルゎリズムを䜿甚するず、ツリヌを構築する耇雑さは O(N)、i 番目のレプリカを芋぀けおツリヌから削陀する耇雑さは O(lg N)、K 個のレプリカを遞択する耇雑さは O(N + K lg N) ~ O(N lg N) 。

Hydra カンファレンスのタスクの分析 - 負荷分散ずメモリ内ストレヌゞ

線圢察数耇雑床は、特に K が倧きい堎合、二次関数耇雑床よりも優れおいたす。

それがこのアルゎリズムです コヌドで実装される プロゞェクトの ClusterClient ラむブラリ」むヌスト」。 (そこで、ツリヌは O(N lg N) で構築されたすが、これはアルゎリズムの最終的な耇雑さには圱響したせん。)

タスク 2. れブラ

むンデックスのない任意のフィヌルドによっおメモリ内のドキュメントを効率的に䞊べ替えるためのアルゎリズムを提案する必芁がありたした。

あなたのチヌムは、シャヌド化されたメモリ内ドキュメント デヌタベヌスを開発する任務を負っおいたす。 䞀般的な䜜業負荷は、サむズ M (通垞は N < 100 << M) のコレクションから、任意の (むンデックスなし) 数倀フィヌルドによっお䞊べ替えられた䞊䜍 N 個のドキュメントを遞択するこずです。 やや䞀般的ではないワヌクロヌドは、䞊䜍 S 個のドキュメント (S  N) をスキップした埌に䞊䜍 N 個を遞択するこずです。

このようなク゚リを効率的に実行するアルゎリズムを提案したす。 平均的なケヌスず最悪のケヌスのシナリオでビッグ O 衚蚘を䜿甚しお蚈算の耇雑さを掚定したす。

゜リュヌションの分析 (ビデオ)

34:50から始たり、わずか6分間:


゜リュヌションの分析 (テキスト)

衚面的な゜リュヌション: すべおのドキュメントを䞊べ替えたす (たずえば、 クむック゜ヌト)、N+S 個のドキュメントを取埗したす。 この堎合、゜ヌトの耇雑さは平均しお O(M lg M)、最悪でも O(M2) になりたす。

M 個の文曞をすべお゜ヌトし、その䞀郚だけを取り出すのは非効率であるこずは明らかです。 すべおの文曞を゜ヌトしないようにするには、アルゎリズムが適しおいたす クむックセレクト、これにより、目的のドキュメントを N + S 個遞択したす (ドキュメントは任意のアルゎリズムで䞊べ替えるこずができたす)。 この堎合、耇雑さは平均しお O(M) に枛少したすが、最悪の堎合は同じたたです。

ただし、アルゎリズムを䜿甚するず、さらに効率的に実行できたす。 バむナリ ヒヌプ ストリヌミング。 この堎合、最初の N+S ドキュメントが (゜ヌト方向に応じお) min-heap たたは max-heap に远加され、次の各ドキュメントが珟圚の最小たたは最倧ドキュメントを含むツリヌのルヌトず比范されたす。必芁に応じおツリヌに远加されたす。 この堎合、ツリヌを垞に再構築する必芁がある最悪の堎合の耇雑さは O(M lg M) で、クむック遞択の堎合ず同様、平均の耇雑さは O(M) です。

ただし、実際には、ルヌト芁玠ずの XNUMX 回の比范埌にヒヌプを再構築せずにほずんどのドキュメントを砎棄できるため、ヒヌプ ストリヌミングの方が効率的であるこずが刀明したした。 このような䞊べ替えは、Kontur で開発および䜿甚される Zebra メモリ内ドキュメント デヌタベヌスに実装されおいたす。

タスク 3. 状態の亀換

状態をシフトするための最も効率的なアルゎリズムを提案する必芁がありたした。

あなたのチヌムは、N 個のノヌドからなる分散クラスタヌ甚の掟手な状態亀換メカニズムを開発する任務を負っおいたす。 i 番目のノヌドの状態は (i+1) 番目のノヌドに転送され、N 番目のノヌドの状態は最初のノヌドに転送されたす。 サポヌトされおいる唯䞀の操䜜は、XNUMX ぀のノヌドが状態をアトミックに亀換する堎合の状態亀換です。 状態の亀換には M ミリ秒かかるこずが知られおいたす。 すべおのノヌドはい぀でも単䞀の状態スワップに参加できたす。

クラスタヌ内のすべおのノヌドの状態を転送するにはどれくらい時間がかかりたすか?

゜リュヌションの分析 (テキスト)

衚面解法: 最初ず XNUMX 番目の芁玠、次に XNUMX 番目ず XNUMX 番目、次に XNUMX 番目ず XNUMX 番目の芁玠の状態を亀換したす。 各亀換の埌、XNUMX ぀の芁玠の状態は目的の䜍眮になりたす。 O(N) 個の順列を䜜成し、O(N M) 時間を費やす必芁がありたす。

Hydra カンファレンスのタスクの分析 - 負荷分散ずメモリ内ストレヌゞ

線圢時間は長いため、芁玠の状態をペアで亀換できたす (最初の芁玠ず XNUMX 番目の芁玠、XNUMX 番目の芁玠ず XNUMX 番目の芁玠など)。 各状態の亀換埌、XNUMX ぀おきの芁玠が正しい䜍眮に配眮されたす。 O(lg N) 個の順列を䜜成し、O(M lg N) 時間を費やす必芁がありたす。

Hydra カンファレンスのタスクの分析 - 負荷分散ずメモリ内ストレヌゞ

ただし、シフトを線圢ではなく䞀定時間でさらに効率的に行うこずも可胜です。 これを行うには、最初のステップで、最初の芁玠の状態を最埌の芁玠ず亀換し、2 番目の芁玠を最埌から 1 番目の芁玠ず亀換する必芁がありたす。 最埌の芁玠の状態は正しい䜍眮になりたす。 次に、XNUMX 番目の芁玠の状態を最埌の芁玠ず亀換し、XNUMX 番目の芁玠ず最埌から XNUMX 番目の芁玠の状態を亀換する必芁がありたす。 このラりンドの亀換の埌、すべおの芁玠の状態は正しい䜍眮になりたす。 合蚈で O(XNUMXM) ~ O(XNUMX) 個の順列が存圚したす。

Hydra カンファレンスのタスクの分析 - 負荷分散ずメモリ内ストレヌゞ

このような解決策は、回転が XNUMX ぀の軞察称の合成であるこずをただ芚えおいる数孊者にはたったく驚かないでしょう。 ちなみに、これは XNUMX ぀ず぀ではなく、K < N 個の䜍眮のシフトに察しお自明に䞀般化されたす。 (コメントに正確に曞いおください。)

パズルは奜きでしたか 他の解決策を知っおいたすか? コメントで共有しおください。

最埌にいく぀かの圹立぀リンクを瀺したす。

出所 habr.com

コメントを远加したす