RabbitMQを準備する101の方法ずパむプラむンアヌキテクチャに぀いお少し

パベル・フィロノフ圌がポゞティブテクノロゞヌズで働いおいたパフォヌマンス䞭



パベル・フィロノフ



このレポヌトでは、RabbitMQずPipelineアヌキテクチャの共通郚分ず、それが圓瀟の業務にどのように関連しおいるかに぀いおお話したいず思いたす。



たず、プロロヌグずしお少し。 これは玠晎らしい郚分です。







オフィスで平日に展開するシヌンは、非垞に楜しい反射に私たちを導きたす。 ゎヌゞャスなタスク、新しいシステムに盎面しおいたす。 新しいシステムを開発する芁求ずしお、゚ンゞニアの心をそれほど興奮させたせん。 叀いものを修埩したり、叀いものを適応させたりするのではなく、ある意味で実質的にれロから䜕かを䜜成するこず。



このタスクには、䞀連の問題が䌎いたす。





問題番号1。 スケッチを続けたす。



これはあなたにもたらされたす







「芁件はどこにありたすか」ず尋ねたす。



圌らはあなたに次のように瀺したす「さお、圌らはここにいる」スラむドを参照。



これは、新しいシステムの芁件である堎合がありたす。 ほずんどすべおの人がそのような凊方で䜜業しなければなりたせんでした、あなたはこれに関連する問題を理解しおいたす。 しかし、時にはあなたはこれから始めなければなりたせん。 始めたしょう。



自然蚀語のNLP凊理に関する玠晎らしいレポヌトがありたした。ここでは倚くの助けになりたす。この䞀貫したテキストからシヌドを遞択する必芁がありたす。 私はこのようにしようずしたす







䜕か重芁なもの、正しい遞択をするのに圹立぀ものを匷調し、求められおいるシステムを正しく構築したす。



私が特に泚目したいのは、「むベント」ずいう蚀葉です。 ある意味では、違いを瀺すために、「リク゚スト」ずいう蚀葉ずリク゚ストを察比したいず思いたす。 リク゚ストに぀いお話すずき、反察偎にいる人は垞にリク゚ストに関連付けられおいたす。リク゚ストを送信した人、非垞に短気な人、ロボット、ブラりザ、プログラム、圌は私たちからの回答を埅っおいたす。 圌はすぐに私たちからの答えを埅っおいたす。 これが圌の最倧の欲求です。答えを手に入れるには、すぐに手に入れたしょう。 これはク゚リに぀いお話すずきです。



むベント凊理に぀いお話すずきは、ここで少し異なるパタヌンが適切です。 このせっかちなロボット、぀たりリク゚ストを送信した人はいたせん。 単にむベント、ログ、メトリック、統蚈を送信するシステムがありたす-かなり倧量のネットワヌクトラフィック...圌らは私たちからの質問に即座に答える必芁はありたせん。 圌らは私たちに、それらをたくさん、そしお迅速に凊理し、それらを異なる方法で凊理できるように頌みたす。 これは最も苊痛な堎所です-䜕が求められるかを事前に予枬できない堎合がありたす-䜕かを集玄し、匷床を蚈算し、䜕かを芁玄し、おそらく最終的にどこかに保存したす。 しかし、最も興味深いのは、倚くの人が問題の解決に着手し、積極的に開発しおいるずいう事実に盎面しおいるこずです。



これが発生するこずをすぐに譊告されたら、これを芁件ずしおシステムのアヌキテクチャに入れるこずをお勧めしたす。そうするこずで、芁求されるこずを柔軟に倉曎および曎新できたす。



「さたざたな゜ヌスから」は非垞に埮劙なため、さたざたな入力プロトコルをサポヌトできる必芁がありたす。



「プロトタむプを䜜る」-圌らはそれをずおも気に入っおいたす。圌らはそれをずおも気に入っおいるので、すぐに䜕かをしお、すぐに䜕かを芋せたす。 プロトタむプを砎棄するこずに同意する人はいたすか そしお、誰が生産にそれらを入れなければならなかったのですか これも問題であり、準備する必芁がありたす。 そしお、そのような機䌚があれば、この問題をすぐに解決するこずをお勧めしたすプロトタむプを䜜成し、それを捚お始めたすが、すぐにそれを行うこずはできたせん-䜕かを取り、すべおをより完党なものにすばやく曞き盎すこずは非垞に困難です。 ほずんどの堎合、それは郚分的に亀換する必芁がありたす-少し無生物のシステムがあり、その䞀郚を匕き裂き、機胜的に完党に同等であるがより完党な他のものず亀換したす...



「それはどこでもうたく機胜するはずです」-私はそれを匷調するこずさえしたせん、それは理解できたす。 「どこでも」に぀いお-難しい瞬間。 異なるオペレヌティングシステムの開発に盎面したのは誰ですか これは倧きな問題であり、意思決定の範囲を倧幅に制限する可胜性がありたす。たた、蚭蚈時にすぐに考慮する必芁がありたす。



私たちは穀物を隔離しようずしたしたが、今では非垞に積極的に䟝存しおいたす。 次の問題が発生するからです。







圌らはしばしば私に駆け寄っお来お、尋ねたす「教えお、どうやっおこれを思い぀いたの」 私は質問者を芋お、次のように蚀いたす。「ご存じのずおり、私はごくわずかなこずを思い぀きたす。実際に圌らが私にもたらすどんな仕事でも、すぐにたくさんの解決策がありたす。 私の䞻な問題は、解決策を考え出すこずではなく、このタスクに最適なものを遞択するこずです。 私は通垞、私たちのためにすべおがすでに発明されおいるずいうゞョヌクで返信したす。゚ンゞニアずしお、私の意芋では、珟代の゚ンゞニアは、正しい情報に基づいた遞択をする必芁があり、それは非垞に最初のステップでも遭遇したす。



システムを䜜りたい。 圌女は建築が必芁です。 いい蚀葉。 通垞は写真で衚珟されるため、ここでは、さたざたなシステムが構築される最も暙準的なアヌキテクチャパタヌンのいく぀かの写真を提瀺しようずしたした。







皆さんそれぞれが、このスキヌムの䞀郚に自分自身を送るず思いたす。 誰かが蚀う私たちは巊䞊隅にあり、私たちは右䞊隅で働いおおり、誰かが䞭倮で働いおおり、誰もが自分自身を1぀たたは別の写真に関連付けおいたす。







特にこのレポヌトでは、むベント凊理の興味深い方法およびアプロヌチずしおパむプラむンアヌキテクチャに぀いお説明したす。 リク゚ストぞの回答に察する他の欲求がなければ、非垞に抜象的な意味で、取る必芁があるのは、䞀連の凊理を通しおデヌタを実行し、最終的にどこかに保存するこずだけです。 そしお、できるだけ早くこれを行うこずをお勧めしたす。 ここでは、「できるだけ早く」詳现な分析が必芁です。



通垞、どこで枛速したすか 通垞、ボトルネックはどこにありたすか 最も基本的な基準は2぀ありたす-CPUバりンドプロセッサずI / Oバりンド出力です。 そしお、驚くべきこずに、私たちはしばしばネットワヌク䞊で䌑たないこずがありたす。時にはギガビット、時には10ギガビットでさえも䌑みたせん。 これは、「リク゚スト/レスポンス」ベヌスで構築されたアヌキテクチャで特に顕著です。リク゚ストを送信し、答えを埅っおいたす。 悪い堎合-良い方法で䌑んでいるだけです-どういうわけか別のタスクに切り替えお、それを実行しおから、戻ろうずしおいたす。 今、あなたが埅぀必芁がなければ、それは玠晎らしいこずです-あなたは別のタスクに切り替える必芁さえありたせん、あなたはあなたの仕事の䞀郚をしお、それを枡しただけです。 これに関連する期埅も遅延もありたせん。すでにプロセッサにできるだけ倚くの䌑息を詊みお、スクランブル゚ッグを調理するためのフラむパンに倉えおください。



それがどこから来たのかを思い出せば...たずえば、同じ考えが存圚する自動車業界からです。 各セクションはその圹割を実行し、結果を枡したす。 あなたがそのような遞択をしたず仮定しお、私たちは問題を解決し、アヌキテクチャを構築するために、このテンプレヌトが最も適しおいるず考えたした。



質問2このアヌキテクチャをどのように実装したすか どういう意味ですか 異皮プロセッサをバンドルするには、どのミドルりェアが必芁ですか。







ここで遞択がロヌルオヌバヌしたす。 これだけではありたせん。スラむドに収たるのはそれだけです。



今、これらのシステムのそれぞれの長所ず短所に぀いお話し、RabbitMQの方向で具䜓的に遞択された理由を具䜓的に正圓化する時間がありそうにありたせん。 さたざたなオプション、最も面癜いもの、巊䞊のものも考慮したした-すべおを手動で取埗し、゜ケットだけで曞く-そのような実隓もありたした。 しかし、最終的には、すべおの実隓䞭に、このメッセヌゞブロヌカヌに特化した遞択が行われたした。







メモリヌ内デヌタベヌスを比范したDmitryのレポヌトがずおも気に入りたした。 圌は正しい工孊的アプロヌチに぀いお話した-枬定、広告を信じない、あなたはそれを枬定しなければならない。 圌は別の重芁な事実に蚀及したした。枬定する前に、たずそれを絞り蟌み、自分の䞭から枬定するデヌタベヌスを遞択する必芁がありたす。最初に怜玢を絞り蟌む必芁がありたす。 通垞、圌らは機胜に基づいお、誰が䜕を知っおいるかを反発したす。



ここで別の問題を提起し、泚意を払う䟡倀があるず蚀いたいず思いたす-この技術はどれくらいの期間存続したすか 珟代のテクノロゞヌ垂堎がどのように発展しおいるのかを芋るず、ちょっず怖い気がしたす。ある朝、ニュヌスフィヌドを開き、「今週孊ぶべき7぀の新しいSQLデヌタベヌス」ずいう蚘事を芋るのが怖いです。 圌らは非垞に速く衚瀺される堎合、圌らはほが同じ速床で死に始めたす。 したがっお、遞択する際に、ある皋床の確率で、ある皋床の自信を持っお、もう少し長生きする技術に䟝存したいずいう芁望がありたす。 この芳点から、RabbitMQは補品ずしおではなく、AMQPプロトコルに䟝存するテクノロゞヌずしお興味深いものです。AMQPプロトコルは、既に十分に掻甚されおいる䞋䜍局です。







AMQPプロトコルの公匏Webサむトの公匏ナヌザヌを以䞋に瀺したす。 ここでMicrosoft Azure Service BusずGoogleを芋るのは非垞に興味深いです。



䞀般に、Googleは、RabbitMQに基づいおSQSデヌタベヌスサヌビスを単玔​​に構築するずいう公匏発衚をリリヌスしたす。



Microsoft AzureはAMQPプロトコルを実装するだけで、明らかに独自の実装があるようです。



VMwareはAMQPプロトコルずRabbitMQシステムの創蚭者の1人であり、゜リュヌション内で非垞に積極的に䜿甚しおいたす。



぀たり これはそのような広告スラむドです。 圌がい぀手䌝うか知っおいたすか 私も舞台に立っお、あなたは利害関係者であり、あなたは䌚瀟の所有者であり、投資家であり、あなたは今それのためにお金を䞎えようずしおいる、そしおあなたはお金を䞎えるず確信する必芁があるず想像しおください。 これらのスラむドは倧いに圹立ち、すぐに䜿い慣れた名前が衚瀺され、気に入っおいたす。 したがっお、広告目的で正確に䜿甚できたす。



基本的な定矩ず甚語ずしお、次に必芁になるいく぀かの写真。







最初の図は、AMQPプロトコル内およびRabbitMQシステム内の基本的な゚ンティティを初めお䜿甚するナヌザヌ向けです。 å·Š-パブリッシャヌ-ラむタヌ-このキュヌに䜕かを曞き蟌むシステム。 RabbitMQ内では2぀の別個の゚ンティティが区別されたす。最初の-円-亀換機-亀換-゚ントリポむント。通垞、すべおのシステムメッセヌゞがそこに発行されたす。 2番目の重芁な芁玠は、これらのメッセヌゞが栌玍されるキュヌであり、それらの間のリンクはバむンディングです。これにより、さたざたなキュヌ間でメッセヌゞをかなり柔軟で興味深い方法でルヌティングできたす。



将来的には、そこにどのようなルヌティング方法があり、どの方法がどのような堎合に䜿甚できるかに぀いおもう少しお話ししたす。 ずりあえず、このようなリンクが存圚するずいう事実にのみ目を向けおください。 この芳点から、パブリッシャヌは自分がどのキュヌに曞き蟌むかを垞に把握しおいるわけではありたせん。むベントを曞き蟌み、統蚈を曞き蟌み、メトリックを曞き蟌み、ログに実際に存圚するキュヌの数を曞き蟌みたす。圌は本圓に知る必芁はありたせん。 䜜家の芳点からするず、非垞に䟿利です。



䞀方、読者は、どこから具䜓的に読むかを知りたいので、特定のラむンナップに執着したす。



そしお、これらのQキュヌを異なるハンドラヌを盞互に接続するバッファヌずしお䜿甚するず、スラむドの䞋郚に画像が衚瀺されたす。 これは、パむプラむンアヌキテクチャ、パむプラむンタむプのアヌキテクチャを衚す非垞に簡単な方法です。異なるプロセッサを通過する生デヌタのストリヌムがあり、各プロセッサ間で実際にこのキュヌがあり、各䜜業を実行しお、デヌタを実行したす。 、デヌタベヌス。 この写真ずその衚蚘に、私は将来戻りたす。



簡単に歩いおみたしょう。 䜕が埗られたすか





あなたが利害関係者であれば、おそらくこれが私の報告曞の終わりになるでしょう。 私はすべおを話し、私たちが䜕をするかを蚀ったので、数人幎、無制限の量のコヌヒヌ、クッキヌをお願いしたいず思いたす。私たちはあなたのためにそれを䜜りたす。 しかし、ここで、結局のずころ、わずかに異なるタむプの䌚議。 たず第䞀に、゚ンゞニアがここに集たり、前に蚀った蚀葉を泚意深く聞いお考えたす。 問題はどこにありたすか 問題なくしおはいけたせん。」



これらがナヌザヌにずっお本圓に機胜する負荷の高いシステムである堎合、問題があるはずなので、レポヌトの2番目の郚分に進む準備ができおいたす。



圌らが問題を持っおあなたのずころに来たずき、䜕をすべきか。 思い぀いたのはナンセンスです」



たず、パニックにならないでください。 あなたが遞択した堎合、それは最初に認識され、最埌たでそれを維持したす。 お気に入りのコヌヒヌを飲みながら、゚ンゞニアを芋お、問題を解決し始める必芁がありたす。







もちろん、すべおの問題ではないいく぀かの問題に぀いお、私たちが調べお、どの特定の゜リュヌションを遞択したかを説明したいず思いたす。



最初の問題は垯域幅です。 システムのスルヌプットはその構成に䟝存するこずがわかりたした。 異なるルヌティングを提䟛する亀換タむプ







サブスクラむブをパブリッシュするだけで、すべおのキュヌに分散できるものもありたす。 それらのいく぀かは、ルヌティングキヌに応じお、単に行で、「だから、赀-このキュヌに、緑-このキュヌに、デバッグログ-このキュヌに、譊告ログ-​​このキュヌに」などず蚀うこずができたす。 これは、たずえばDirectです。



トピック-より柔軟なルヌティング、より耇雑な、マスクによるルヌティングを可胜にしたす。たずえば、アスタリスク、ラティスを䜿甚したす。 機胜面では非垞にうたく機胜したす。 垯域幅の面ではあたり良くありたせん。 内郚には、より耇雑なデヌタ構造が存圚したす。



RabbitMQの䜜成者による興味深い蚘事がありたす。これは、プレフィクスツリヌたたは非決定的な有限状態マシンを遞択した期間です。 圌らは最良ず考えたものを遞択したしたが、ずにかく、そのような柔軟なルヌティングに焊点を圓おるず、必芁な特性に到達できないため、これを考慮する必芁がありたす。



4番目の亀換はConsistent-Hashです。 圌は他の人よりもさらに良い行動をしたす。 もっず耇雑に思えたすが。 明らかに、ある皮のセグメンテヌション、シャヌディング、キュヌを遞択するための耇雑なアルゎリズムがありたす...利点は、それが数倀で機胜するこずです。 最初の3぀はルヌティングキヌずしお文字列を䜿甚し、最埌の3぀は数字を䜿甚したす。 これにより、圌はいく぀かの䜙分なバヌを獲埗できたす。



私はこれらの枬定倀を取埗したした...それは平均的なマシンであるず考えたす。远加の蚭定はしたせんでした。apt-getをむンストヌルした埌、そのように動䜜したす。 䞀般的に蚀えば、あたり良くありたせん。 1秒あたり35,000メッセヌゞ1秒あたりのメッセヌゞ数、たあ、どういうわけか少し速くしたいず思いたす。



このような䜎い数字に関連するものは䜕ですか 実際、倚くの人が知っおいるテクニックを䜿甚しおいたすが、䜕らかの理由で適甚する人はほずんどいたせん。 バッチ凊理。







同じ䜜業を䜕床も行う必芁があるこずがわかったら、1぀のむベントだけでなく、パケット党䜓、ブロック党䜓、パック党䜓を凊理しおみたせんか たずえば、KafkaがZeroMQから行うように。 このために、圌らは笑いたす。 圌らは玠晎らしいです、圌らは顧客のためにい぀の間にかバッチ凊理をしたす。 䞀床に1぀ず぀メッセヌゞを公開し、それらがデヌタバス䞊をどのように飛んでいるかを芋るず、すでにバッチで飛んでいるず思いたす。 したがっお、すぐにスルヌプットのかなり良い基準が埗られたす。



それは私たちの遞択ではないため、反察方向のスマむリヌ。 私たちは圌らに満足しおいたすが、それは䜕も䞎えおくれたせん。



自分でやっおみたしょう-今回はそれほど難しくありたせん。 2぀目は、パッケヌゞの実装を独自に行ったため、パッケヌゞの管理を開始したす。パッケヌゞに含めるメッセヌゞの数、入力する時間です。 ZeroMQのKafkaの堎合、これがドラむバヌの奥深くにあり、自分で実装するこずが垞に可胜であるずは限らない堎合、独自の実装を行うこずで、非垞に柔軟か぀適切に管理できたす。



そしお非垞に吊定的な笑顔-私たちは私たちの遅延を増やしたす。 , , , , .



, , - . request response critical, 10 , , , , .



, – , , – , .







– , . 35 , , . , . , 256 , 1 , . .



, 30 , - . : , 10- . loopback-, , - . , – . . ぀たり 10 . - , , , . , , , .







. . . , , . ? , , . . , , , ? ? . – . , . , , . - . . , , - , , , , , .. – . , – .



, 
 , , , .. , ? ぀たり .







, :









– ?



  1. : ? . , ?

    , , - , 
 , ,

    . , . .
  2. 第二の瞬間。 . , , ,

    . , , ? -

    2 , , , .
  3. . RabbitMQ flow control. ,

    . «, !».






, , Filter A. . , , 10000 .



, --. 10 – , - - . RabbitMQ flow control . . , , , , , - .



, . . , . , - , . - , , , . , , – . , . UDP, – . TCP, . , – .



. .







2 . – , Stateless filters. Filters – , - . , , , . , – . , , , . , , , . – .



, – Stateful filters, , .



. . , – . , . Round-robin' – – . - , , , , , , , – . - , . -, . , 1 – , 2 – . - – Router, . . , , . . exchange' RabbitMQ , , .







Statefull filters. .



-, , , . - . - - . , . , , - , - , . , , .



, , . – , . , . , . , – . – . , , , , , , .







, (), ?



, , , , .



– m, hash-, N – . , , . . ? N – . . , - . , , , – hash-, hash-. , - , , , .



, . RabbitMQ 2 Sharding plugin'. – , . , , , , .



, – consistent-hash-exchange – , , , , , . , , .



, . 2 , , , :







, , , , . . -, , , .



, . , . , .



— HighLoad++ . 2016 — HighLoad++ , 7 8 .



, , :
  • " ";
  • " ".




もちろん、ニュヌラルネットワヌクはホットトピックですが、時系列を栌玍するための適切なDBMSの抂芁は非垞に貎重です。



たた、これらの資料の䞀郚は、高負荷システムHighLoadの開発に関するオンラむントレヌニングコヌスで䜿甚されたすガむドは、特別に遞択された文字、蚘事、資料、ビデオのチェヌンです。私たちの教科曞にはすでに30以䞊のナニヌクな資料がありたす。接続しおください




All Articles