1

Out バックエンドは、NServiceBus (バージョン 5) を使用して .NET で記述されています。これまで、クライアント (.NET クライアントと c++ クライアントの両方) は、NServiceBus を持つ WCF サービスにメッセージを送信しており、WCF サービスは NServiceBus メッセージを適切なワーカーに送信していました。

現在、アーキテクチャにいくつかの変更を行っており、一部のクライアントにメッセージを直接キューに入れ、WCF をスキップしてもらいたいと考えています。多くのデバイスがあります (ほとんどは c++ で記述されています)。

NServiceBus は、キューに入れられたメッセージを独自のオブジェクトでラップすることを知っています。私の質問は、NServiceBus が IoT 環境で動作する方法があるかどうかです。デバイスがメッセージを直接キューに入れ、中間にアダプターが存在しない場合は? または、サーバー側 (ワーカー) が NServiceBus オブジェクトでラップされていない「通常の」メッセージを処理するには?

4

3 に答える 3

1

目的地にメッセージを送信したり、イベントを発行したりするだけの場合は、トランスポートについて言及していませんか? これらの選択肢のいくつかは、ここでの答えを変えるかもしれませんが、その要点を理解する必要があります.

メッセージをキューに入れることで、NServiceBus と直接統合できます。ドキュメントを見ると、各トランスポートの下に「スクリプト」セクションがあり、メッセージを直接キューに入れる方法が示されています。MSMQ と統合する場合は、こちらのドキュメント ページを参照してください。

NSB メッセージにはヘッダーが付いています。ヘッダーの値のほとんどはオプションであり、適切なデフォルト値が付属しているため、本当に必要なのはメッセージ タイプ (メッセージ ペイロードの実際のタイプ名) だけです。Send を実行すると仮定すると、使用中のすべてのヘッダーがここに表示されます。繰り返しますが、そのすべては必要ありません。

質問に答えるには: C++ コードから NSB と統合するには、この C# コードを C++ に変換できます。必要なのは次のとおりです。

public static void SendMessage(string queuePath, string messageBody, List<HeaderInfo> headers)
{
    using (var scope = new TransactionScope())
    {
        using (var queue = new MessageQueue(queuePath))
        using (Message message = new Message())
        {
            message.BodyStream = new MemoryStream(Encoding.UTF8.GetBytes(messageBody));
            message.Extension = CreateHeaders(headers);
            queue.Send(message, MessageQueueTransactionType.Automatic);
        }
        scope.Complete();
    }
}

public static byte[] CreateHeaders(List<HeaderInfo> headerInfos)
{
    XmlSerializer serializer = new XmlSerializer(typeof(List<HeaderInfo>));
    using (var stream = new MemoryStream())
    {
        serializer.Serialize(stream, headerInfos);
        return stream.ToArray();
    }
}

public class HeaderInfo
{
    public string Key { get; set; }
    public string Value { get; set; }
}

注意事項:

  • MSMQ は TransactionScope で動作します。使用するデバイスによっては、IoT がオプションになるとは思いません。
  • メッセージを MSMQ に入れるには、ライブラリが必要です。

SQL トランスポートを選択した場合は、db にレコードを書き込むだけでよいため、この統合がはるかに簡単になります (ここでスクリプトを見つけることもできます)。

于 2015-08-30T23:56:55.077 に答える
0

アレクセイ、あなたが提案しているのは、メッセージごとに別のホップを追加することではありません。この場合、IoT デバイスからクラウドへの HTTP 呼び出しだけではどうなるのでしょうか。HTTP ハンドラーは、NServiceBus クライアント側ライブラリを使用してキューに入れるだけです。HTTP ハンドラーを使用することで、将来的に内部実装 (したがってキュー) を変更するためのより良いオプションが得られます。

于 2015-08-30T14:06:09.700 に答える
0

トランスポート メッセージの形式を保証する人は誰もいません。メッセージをキューに入れるという考えは避け、NServiceBus がそれらを直接消費することを期待することをお勧めします。

代わりに、必要に応じて NServiceBus にメッセージを再送信する壊れたデバイスからのメッセージを受信するようにします。したがって、そのデバイスは通常、たとえば、可能な限り最小の数の TCP フレームに適合する最適化されたメッセージを送信します。NServiceBus はこれを気にしません。Json および XML シリアライザーでトランスポート メッセージを確認してください。それらは巨大です。

イベント ハブとデバイス間のメッセージ交換に AQMP を使用しています。その後、イベント ハブで、NServiceBus の使用など、自分のやりたいことを実行できます。デバイスに関する業界の提案を検討してください。AQMP はおそらくあなたが望むものです。

于 2015-08-30T12:08:38.973 に答える