問題タブ [nservicebus]
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.
.net - ESBとカスタムソリューション
新しいプロジェクトにnServicebusを使用するかカスタムソリューションを使用するかを調査しています。基本的には、さまざまなソースからメッセージを受信し、これらのメッセージを処理してから、ある宛先に送信する「メッセージングレイヤー」を作成したいと思います。ほとんどの場合、私はメッセージを取得して送信します。場合によっては、メッセージはWebサービスを介して到着します。nServicebusがこのタイプのプロジェクトに適しているかどうか、またはいくつかの汎用インターフェイスを作成してデータベースをメッセージのキューとして使用する必要があるかどうかを知りたいです。
1つの例は、FTP経由でファイルを取得し、これらのファイルを復号化してから、COM呼び出し(ActiveX dll)経由で処理する必要がある場合です。このプロセスはさまざまな時点で失敗する可能性があります。メッセージをいつ再取得、再処理、または再送信する必要があるかを指定できるようにしたいと思います。
workflow - ディストリビューターを使用した NServiceBus パイプライン
NServiceBus を使用して処理パイプラインを構築していますが、プロセスの各ステップをスケーラブルにするためにディストリビューターの構成に問題があります。ここにいくつかの情報があります:
- パイプラインには、WorkItem の「OK、開始時間です」というマスター プロセスがあり、フローチャートのようなプロセスが開始されます。
- フローチャートの各ステップは計算コストがかかる可能性があるため、各ステップをスケールアウトできる機能が必要です。これは、各ステップに Distributor が必要であることを示しています。
- 後で追加のアクティビティをイベントにフックできるようにしたいと考えています。これは、Send() ではなく、完了時にメッセージを Publish() する必要があることを示しています。
- プロセスは、条件に基づいて分岐する必要がある場合があります。これは、プロセスが複数の種類のメッセージを発行できる必要があることを示しています。
- プロセスがフォークに参加する必要がある場合があります。これにはSagasを使用する必要があると思います。
これらの仮定が適切であることを願っています。
簡単にするために、分岐や結合については忘れて、ステップ A の後にステップ B が続き、ステップ C で終わる単純なパイプラインを考えてみましょう。各ステップは独自のディストリビューターを取得し、メッセージを処理する多くのノードを持つことができます。
- NodeA ワーカーには IHandleMessages プロセッサが含まれており、EventA を発行します
- NodeB ワーカーには IHandleMessages プロセッサが含まれており、イベント B を発行します
- NodeC ワーカーには IHandleMessages プロセッサが含まれており、パイプラインは完了しています。
構成ファイルの関連部分を次に示します。# はワーカーの番号を示します (つまり、入力キュー NodeA.1 と NodeA.2 があります)。
そして、ディストリビューター構成の関連部分は次のとおりです。
各ノードの 2 つのインスタンスを使用してテストしていますが、ノード B の途中で問題が発生しているようです。基本的に次の 2 つのことが発生する可能性があります。
- ノード B の両方のインスタンスは、それが EventA をサブスクライブしていること、および NodeC.Distrib.Data@MYCOMPUTER がノード B がパブリッシュする EventB をサブスクライブしていることを報告します。この場合、すべてがうまく機能します。
- ノード B の両方のインスタンスは、EventA をサブスクライブしていると報告しますが、一方のワーカーは NodeC.Distrib.Data@MYCOMPUTER が 2 回サブスクライブしていると言い、もう一方のワーカーはそれについて言及しません。
ディストリビューターがサブスクリプション メッセージをルーティングする方法によってのみ制御されるように見える 2 番目のケースでは、「オーバーアチーバー」ノードが EventA を処理する場合、すべてがうまくいきます。「未達成者」が EventA を処理すると、EventB のパブリッシュにはサブスクライバーがなく、ワークフローは停止します。
だから、私の質問:
- このような設定は可能ですか?
- 構成は正しいですか? 単純な 1 レベルのパブリッシャー/2 ワーカーのセットアップを超えて、ディストリビューターを使用した構成の例を見つけるのは困難です。
- 計算集約型ではないすべてのトラフィック監視操作を実行し、タスクが長時間実行され、負荷分散が必要な場合にのみ、ディストリビューターの背後にあるプロセスにメッセージを送信する 1 つの中央ブローカー プロセスを持つ方が理にかなっていますか?
- そうすれば、負荷分散されたノードは単純に中央ブローカーに返信することができます。これは簡単に思えます。
- 一方で、それはNServiceBusの強みである分散化とは相反するように思えます。
- そして、これが答えであり、長期実行プロセスの完了イベントが応答である場合、発行されたイベントで後で拡張できるようにする発行をどのように保持しますか?
.net - Enterprise Service Bus、.NET Service Bus、NServiceBus、およびバスの車輪
エンタープライズ サービス バス (ESB)、.NET サービス バス (Windows Azure AppFabric サービス バス)、NServiceBus、RhinoServiceBus、MassTransit など。
これらの各テクノロジーに共通する点と共通しない点を理解しようとしています。
私は今日、.NET Service Bus に関する Juval Löwy のプレゼンテーションに出席しました。彼は、.NET Service Bus は ESB の貧弱なバージョンとして使用できると述べました。 ESB、他に真の ESB はありますか?
他のものが真の ESB である場合、.NET Service Bus とは対照的に、それらを真の ESB にするものは何ですか?
object - NServiceBus 送信データの質問
私は NServices を使用して、クラス MyMusicMessage のオブジェクトを次のように送信しています。
MusicBytes のサイズが 200k 程度の場合は、うまく送信できます。
ただし、サイズが 300K を超えると、「MessageQueueException」が発生します。
NServiceBus のオブジェクト サイズに制限はありますか?
ありがとう。
.net - 車両を追跡するための分散アプリケーションの設計と構築に関するアドバイス
私は車両を追跡するためのアプリケーションに取り組んでいます。約10k以上の車両があります。それぞれが毎分最大 250 バイトを送信します。データには、GPS 位置と CAN バスからのすべてのデータが含まれます (車両コンピューターとダッシュボードから読み取ることができるすべてのデータ)。データは GSM/GPRS (UDP プロトコルを使用) によって送信されます。このデータの 1 日あたりの推定行数は、約 2000k です。
3 つのメイン ブロックが表示されます (ブロック -> メイン モジュールを意味します)。
1. マルチスレッド ソケット サーバー (MSS) - 持っています。MSS は、受信したデータを (NServiceBus を使用して) キューに格納します。
2. ルール プロセッサ サーバー (RPS) - これはこのシステムの中核です。このブロックは、受信したデータの解析、データベースへの保存、ルールの処理、Notifier Server へのメッセージの送信 (電子メール/SMS テキストの送信) を担当します。
ルール例。先に述べたように、受信バイトには現在の速度に関する情報があります。速度が 120 を超えると、指定したユーザーに対して Web アプリケーションでアラートを表示し、電子メールを送信し、SMS テキストを送信します。
(同じマシン上に RPS の複数のインスタンスが存在する可能性があります)。
3. Web アプリケーション - ユーザーによるルールのレポートと定義、アラートの監視などを可能にします。
RPS と Web アプリケーション間の通信を設計する方法についてアドバイスを求めています。
いくつかの質問:
Web アプリケーションと RPS はデータベースを分離する必要がありますか、それとも 1 つの中央データベースで十分でしょうか?
Web アプリケーションに 1 つのドメイン モデルがあります。中央データベースが 1 つある場合、RPS で同じモデル (オブジェクト) を使用できますか? では、変更されたルールを RPS に送信するにはどうすればよいでしょうか。
このブロックを可能な限り切り離すようにしています。クライアントごとに異なるアプリケーションのインスタンスを作成する予定です (各クライアントには別々のデータベースがあります)。あるクライアントは 10,000 台の車両を所有し、他のクライアントは 100 台しか所有しません。
linq-to-sql - linqからsqlへのnservicebusテーブルロックの問題
NServiceBusを使用してシステムを構築しており、DataLayerはLinq2SQLを使用しています。
システムは2つのサービスで構成されています。
Service1はNSBからメッセージを受信します。データベース内のTable1にクエリを実行し、Table1にレコードを挿入します。特定の条件が満たされると、新しいNSBメッセージが2番目のサービスに送信されます。
Service2は、Service1からメッセージを受信し、データベースに関連しないその他の作業を行うときに、Table1のレコードも更新します。Service2は長時間実行されるプロセスです。
私が抱えている問題は、Service2がTable1のレコードを更新した瞬間、テーブルがロックされていることです。Service2が処理をすべて完了するまで、ロックは有効になっているようです。つまり、データコンテキストが破棄された後、ロックが解放されません。
これにより、Service1のクエリがタイムアウトします。Service2が処理を完了すると、Service1は問題なく処理を再開します。
したがって、たとえばService1コードは次のようになります。
service2のコードは次のようになります。
DatacontextがService2に配置されているときに、ロックが解放されない理由がわかりません。
私が呼んでいる問題を回避するために:
これは機能しますが、私はそれを使用することに満足していません。この問題をきちんと解決したい。
誰かが以前にこの種の問題を経験したことがあり、誰かがそれを解決する方法を知っていますか?データコンテキストが破棄された後、ロックが解放されないのはなぜですか?
前もって感謝します。
非常に長い投稿でごめんなさい。
編集:
配送などの現実の状況でこれを見ると、次のようになります。
service1は、クレートレコードをデータベースに追加します。特定の数またはクレートレコードが存在する場合、クレートはコンテナレコードに追加されます(コンテナレコードが存在しない場合は作成されます)。次に、出荷レコードを作成し、すべてのコンテナを閉じて、出荷レコードに割り当てます。
次に、service2を呼び出して出荷記録を処理します。service2への呼び出しはBus.Send呼び出しですが、サガの一部である可能性があります。service2は、割り当てられている船の各クレートレコードを更新します。その後、他のいくつかの出荷指示が処理されます。service2が処理している間、次の出荷のためにさらに多くのクレートを受け取ることができますが、現状では、service2が出荷の処理を完了するまで、それらをコンテナに割り当てることはできません。
.net - サービスバスとは何ですか?いつ必要になりますか?
NServiceBusについての話を聞いたことがありますが、それが何であるかはよくわかりません。彼らは、「.net 向けの最も人気のあるオープン ソース サービス バス」であると主張しています。
サービス バスとは何ですか? また、いつ必要になりますか?
asp.net - Web アプリケーションの Application_Start メソッド内で NServiceBus を初期化するときの NullReferenceException
NServiceBus の 2.0 RTM を実行していますが、MessageModule が CurrentSessionContext を NHibernate sessionfactory にバインドすると、NullReferenceException が発生します。
Application_Start 内から、次のメソッドを呼び出します。
バスが開始されると、メッセージ モジュールは次のように始まります。
私のログを見ると、bind メソッドが呼び出されたときに次のエラーが記録されています。
どうやら、HttpContext へのアクセスに問題があるようです。NServiceBus を構成するためのこの呼び出しは、Application_Start よりもライフサイクルの後半に発生する必要がありますか? または、Asp.NET Web アプリケーション内でハンドラーを動作させるために他の人が使用した別の回避策はありますか?
ありがとう、スティーブ
c# - NServiceBus による非常に単純なエラー処理
皆さん、これは簡単なシナリオです
- NServiceBus クライアント/サーバーのセットアップ。
- 「メッセージ」は私が書いたカスタム クラスです。
クライアントはリクエスト メッセージを送信します。サーバーがメッセージを受信すると、サーバーは次のことを行います。
その後、何もありません。クライアントは応答を受け取りません。
例外:
log4net NServiceBus のログを調べてみると、例外が見つかりました。カスタム クラスの "users" がSerializableとしてマークされていないことがわかりました。
さて、そのようなエラーを「スロー」または「処理」するにはどうすればよいでしょうか。
NServiceBus はエラーを処理しないという考えを促進しているように見えますが、このシナリオでは、ある種の「スロー」が明らかになれば、多くの時間を節約できたはずです。
このような例外はどのように処理すればよいですか? どこで発生し、どこに行きますか?
msmq - マシンの場所の NServicebus DNS エントリ
NServicebus キュー エンドポイントに DNS エントリを使用しようとしていますが、メッセージが送信されません。コンピューター名または IP アドレスを入力すると正常に動作します。レコードに ping を実行すると正しく解決されるので、DNS レコードを使用できるかどうか疑問に思っています。これが私の設定です:
ありがとう