2

この質問は数週間私を悩ませてきましたが、私はあまりにも急いで賢明な後知恵でそれに取り組むことができませんでした. 私は最終的に、彼の壊れやすい神経を和らげるために、その神経質な顧客に迅速で汚い解決策を提供しました(結果として、私のものも)。私は今、自由な心でこれを調べる時間をとっています。

基本的に、同期データ (時系列シリーズ) をできるだけ速く (<5ms) 処理するという課題に直面しています。順序付けされたスレッド プールや並列ワーカー キューを含むハイブリッド ソリューションなど、多くの Rube-Goldberg スタイルの設計をいじってみた後、徹底した実践的なベンチワークにより、単純な従来の方法に固執することが証明されました。シングル スレッド チェーン プロセスは、データの整合性とパフォーマンスの面で断然最良の選択でした。

ただし、アプリの下部のある時点で、これは特定の制限に達します。異なるプロセッサに並行してデータをブロードキャストする必要があります。そして、これが私の頭痛が再び始まるところです。データ ハブ (以下を参照) がプロセッサにデータを非同期で (スレッドとバイナリ リング バッファーを介して) 送信するようにすると、受信側でスクランブルされた順序で受信され、データの順序が崩れます。

そのため、データをすべてのプロセッサに並列に送信し、順序を正しく保つ方法を探しています。私の他の懸念は非同期性です。データハブのSendEventデリゲートがプロセスのReceiveメソッドによって単純な古典的な方法で (経由で+=) サブスクライブされている場合、これはどのように動作しますか?
まず、サブスクリプションを「1 つずつ」と呼びたくありません。これを並列化する方法があると確信しています。2 つ目は、プロセッサ A が作業を完了するまでチェーン全体をロックしたくないということです。

ここにいるのは人々です。簡単に言うと、データが処理されるのを待たずにプロセッサにデータを送信し続ける賢明な方法を見つけたいと思っていますが、同時に、各データプロセッサが順序どおりにデータを受信する必要があります。これは互換性がないように聞こえるかもしれませんが、これを行うスマートで非常に簡単な方法があると確信しています (しかし、私はこれに深く入り込み、本当に混乱しました。そのため、善良な人々に助けを求めています)

ここに画像の説明を入力

4

3 に答える 3

1

順序付けられたシリーズを同じマシン上のすべてのプロセッサに配布する必要がある単一のマシンについて話している場合、Data Hubを使用して、単一スレッドのアイデアを続けて、N 個のプライベート キューにシリアルにエンキューします (比較的高速なので、ブロッキングについて心配する必要はありません。また、アイテムがすべてのキューに入れられたことを知っているという利点があります)。

これらのプライベート キューのそれぞれは、唯一のプロセッサからのデキューのみを許可します。おそらく遅い「Data Hub --> Processors」が並行して呼び出されますが、チェーン全体を保持することはできません...

次に、1 プロセッサ/キュー/スレッド (管理が簡単) または 1 キュー/N キュー/同様のステートレス プロセッサを構成できます (これは、並べ替えを行うために追加のダウンストリーム作業が必要になります)。

より分散されたシステム (マルチマシンなど) では、通常、データ ハブのようなものがメッセージング「トピック」にメッセージを送信し、メッセージング インフラストラクチャがすべてのコンシューマに送信できるようにします。

于 2012-07-16T21:23:05.517 に答える
0

サービスバスをお探しのようですね。あなたの図では、それはデータハブになります。Microsoftは、このような用途に使用できるMSMQというサービスを提供しています。私は、 NServiceBusというライブラリを使用して作業を簡素化するのが好きです。

于 2012-07-16T15:34:54.460 に答える
0

それが最適かどうかはわかりませんが、ここではzeromqが役立つかもしれません。すべてインメモリ (高速) のキューを持つことができ、メッセージをファンアウトしてから複数の構成に凝縮することができます (順序などを処理すると思います)。

プロジェクトで zeromq を使用した経験はありませんが、いくつかの魅力的な機能があり、十分にサポートされているようです (多くのクライアント言語、C# を含む)。

マニュアル ページには、このツールで何ができるかを示す優れた紹介ビデオがあります。

于 2012-07-23T21:30:48.243 に答える