問題タブ [rebus]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
rebus - 入力キューから発行されたメッセージを処理し、リモート エンドポイントに発行するにはどうすればよいですか?
現在、 MyMessagesアセンブリ内のすべてのメッセージをプロセス マネージャーの入力キューに送信するように rebus を構成しています。MyMessage アセンブリに、プロセス マネージャー ( DoSomethingElseなど)で他のアクションをトリガーするために使用されるSomethingHappenedというメッセージがあるとします。ただし、 SomethingHappenedをローカル (同じキュー内) でサブスクライブして、データベースを更新することも必要です。したがって、ワークフローは次のようになります。
- ユーザーが UI でアクションDoSomethingをトリガーする
- DoSomethingのハンドラーは、オブジェクトの状態を更新し、イベントSomethingHappenedを内部的に公開します (コミットされていないイベントのメモリ コレクション内)。
- SomethingHappenedイベントは、オブジェクト内のコミットされていないすべてのイベントを通過することにより、rebus によってキューに発行されます。
- SomethingHappenedをローカルで処理してデータベースを更新する
- SomethingHappenedを saga によってリモートで処理して、 SomethingElseHappenedをトリガーする
これを rebus で設定することは可能ですか?
私が現在持っている rebus 構成:
ありがとうございました
陰
rebus - Rebus HTTP ゲートウェイと MSMQ の正常性状態
私たちが持っているとしましょう
- HTTP ゲートウェイ アウトバウンド サービスを使用するクライアント ノード
- HTTP ゲートウェイ インバウンド サービスを備えたサーバー ノード
クライアントノードでMSMQ自体が何らかの理由で停止する状況を考えます。現在の実装では、Rebus HTTP ゲートウェイが例外をキャッチします。
キャッチするだけでなく、MessageQueueException 例外をサーバー ノードに送信してエラー キューに入れるというアイデアについてどう思いますか? (エラーキューの名前はヘッダーから収集できます)
したがって、追加のインフラストラクチャ サーバーがなければ、クライアントに問題があることがわかり、誰かが対応できるようになります。
アップデート:
回答に記載されている問題が発生すると思いました。私のシナリオをもっと詳しく説明するべきでした:)申し訳ありません。ここにあります:
InboundService がメッセージの送信と受信の両方を実行できるように、HTTP ゲートウェイを変更します。そのため、サーバーから新しいメッセージを取得してそのメッセージをサーバーに送信するために、接続を開始するのは OutboundService だけです (定期的に、たとえば 5 分に 1 回)。これは、クライアント ノードがサーバーではなく、NAT の背後にある多くのクライアントの 1 つと見なされるためです。
実際、サーバー自体はクライアントの状態には関心がありませんが、 HTTP ゲートウェイの HTTP ゲートウェイ コードを使用するクライアント側で個別のアラート サービスを作成する代わりに、HTTP ゲートウェイでこれを行うことができると思いました。サイドランニング。
クライアントがサーバーにまったく到達できない場合はどうなりますか?
MSMQ は死んでしまうので、私はhttp://ayende.com/blog/4540/building-a-managed-persistent-transactional-queueのようなインプロセスのスタンドアロンの永続的なキュー オブジェクトを使用することを考えました (単なる実装例です。サーバーに到達できるまでクライアント側で例外を集約するためのライセンスの種類がわからない)。
また、エラーが発生したことをクライアントがサーバーに通知する頻度は?
その部分についてはよくわかりません-5分に1回などのメッセージ同期のスケジュールされた時間に関連している可能性があると思いましたが、現在の実装(while(true)ループ)のようにスケジュールされた時間がない場合はどうなりますか?たぶん、configで設定できますか?
私はエラー処理について一貫した戦略を持ちたいと思っています。これには通常、単純な古い NLog ロギングが含まれます
クライアント ノードは、NAT 標準の監視技術の背後にあるインターネットにあるため、機能しません。キューを NLog トランスポートとして使用することを考えましたが、MSMQ が機能しなくなるため、機能しません。
HTTP を NLog トランスポートとして使用することも考えましたが、サーバー側ではキューが必要になるので (実際にはそうではありませんが、キューに格納したいと思います)、sbus と HTTP ゲートウェイに戻ります...そのような NLog トランスポートはHTTP ゲートウェイの事実上のクローンになります。
更新 2: NLog トランスポートとしての HTTP (トランスポートとはターゲットを意味します) には、「クライアントがサーバーにまったく到達できない場合はどうなりますか?」で説明したように、クライアント側のキューも必要になります。セクション。NLog に埋め込まれた HTTP ゲートウェイのクローンになります。狂気:)
すべてのことは、クライアントが信頼できないということです。そのため、サーバー側でクライアントに関するすべての情報を取得し、そこにログインしたいと考えています。
更新3
別の解決策として、別のサービスを作成することもできますが、これは HTTP ゲートウェイの一部になります (例: OutboundAlertService)。その後、次の 3 つの目標が達成されます。
- 共有送信ループ コード
- 追加のサーバー インフラストラクチャは不要
- OutboundService に悪影響を与えません (インプロセス キューを追加する複雑さはありません)。
OutboundService から例外を受け取ることはありませんが、MSMQ 自体を定期的にチェックします。
さらに他の代替ソリューションは、MSMQ キュー以外を NLog ターゲットとして使用することですが、それは見苦しいやり過ぎです。
rebus - Rebus FileSystemMessageQueue
Rebus に FileSystemMessageQueue が含まれていることを発見しました。それは本当であるには大きすぎるように思えるので、それについていくつか質問したいと思いました:)
スレッドセーフ/プロセスセーフか
トランザクショナルか
シリアライゼーション形式として JSON を使用する理由 (バイナリ シリアライザーと比較して、POCO に制限が追加されませんか?)
バスなしでセパレートとして機能しますか?(サービスではなく、個別のdllとして)
少量のメッセージの場合、MSMQ の代わりになりますか? リソース集約型のメッセージングではなく、ローカル (ネットワーク化されていない) メッセージングについて話す場合、MSMQ とどのように比較できるでしょうか? それはMSMQと同じくらい良いでしょうか?
前もって感謝します
c# - NServiceBus Saga に相当する ReBus ReplyToOriginator
私は ReBus で Sagas に取り組んでおり、NServiceBus での私の経験から、Saga の元の作成者に返信して、次のような更新を提供することができます。
ReBus でこれを行う同等の方法は見当たりません。これを行う方法はありますか? そうでない場合は、同じことを達成するために使用できる良いパターン (オリジネーターのポーリング以外) はありますか? 例として、顧客を作成しようとしていて、クライアントがアドレスを変更しようとする前にいつ作成されたかを知りたい場合があります。
以下は、私が簡単にまとめた顧客シナリオの簡単な例です。
autofac - AutoFac でオブジェクトに登録する
レバスを使用しています。AutofacContainerAdapter ( https://github.com/rebus-org/Rebus/blob/master/src/Rebus.Autofac/AutofacContainerAdapter.cs ) では、次のコード行を呼び出しています。
Autofac がこの型を見つけられるように MessageHandler コンストラクターをセットアップするにはどうすればよいですか? 正しく理解すれば、コンストラクターで使用すると、上記のコードにIMessageContext
ないため、渡されません。.As<IMessageContext>()