3

バックエンドにサービスバスキューワーカーを使用して、Azureで単純なWebAPIRESTサービスを構築しようとしています。WebAPIからワーカーに1つのメッセージを問題なく送信できます。しかし、私はすべてがどのように機能するかを確認するためだけに、より多くのメッセージを送信しようとしていました。そこで、次のような単純なコントローラーを作成しました。

for (int i = 0; i < 100; i++)
{
    var msg = new BrokeredMessage("Ping");
    BioConnector.QueueConnector.OrdersQueueClient.Send(msg);
}

コントローラーを呼び出すと、ワーカーが受信するメッセージの約1/2程度しか受信していません。残りは落とされたようです。

4

4 に答える 4

3

ここに投稿されたサンプル コードを使用して約半分のメッセージしか取得できないという問題があったため、独自のテスト コードを作成しました。100 を超えるキュー メッセージで試してみましたが、常に 100% の送信/受信パリティが得られました。おそらく、コードに同様の問題がありました。

  1. 新しい C# コンソール プロジェクトを作成します。
  2. C:\Program Files\Microsoft SDKs\Windows Azure.NET SDK\2012-06\ref\Microsoft.ServiceBus.dllにある Microsoft.ServiceBus アセンブリへの参照を追加します。
  3. app.config で、独自の値を指定して次のように変更します。

    <appSettings>
        <add key="Microsoft.ServiceBus.ConnectionString" value="Endpoint=sb://blahblah.servicebus.windows.net/;SharedSecretIssuer=owner;SharedSecretValue=pDk0b....=" />
    </appSettings>
    
  4. これらの using ディレクティブを追加します。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Xml;
    using System.Xml.Linq;
    using Microsoft.ServiceBus;
    using Microsoft.ServiceBus.Messaging;
    using System.Configuration;
    using System.Threading;
    
  5. コード メソッドを次のように変更します。

    class Program
    {
        static void Main(string[] args)
        {
            string connectionString = ConfigurationSettings.AppSettings["Microsoft.ServiceBus.ConnectionString"];
            var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);
            QueueDescription queueDesc = new QueueDescription("TestQueue");
            if (!namespaceManager.QueueExists(queueDesc.Path))
            {
                namespaceManager.CreateQueue(queueDesc);
            }
            QueueClient topicClient = QueueClient.CreateFromConnectionString(connectionString, queueDesc.Path);
            int sentMsgCount = 0;
            int recdMsgCount = 0;
    
            for (int i = 0; i < 100; i++)
            {
                BrokeredMessage msg = new BrokeredMessage("Test message " + i);
                topicClient.Send(msg);
                sentMsgCount++;
                Console.WriteLine("Sent Message: " + msg);
            }
    
            QueueClient subClient = QueueClient.CreateFromConnectionString(connectionString, queueDesc.Path);
    
            bool moreMessages = true;
            while (moreMessages)
            {
                BrokeredMessage recdMsg = subClient.Receive(TimeSpan.FromSeconds(3));
                if (recdMsg != null)
                {
                    Console.WriteLine("Received Message: " + recdMsg);
                    recdMsgCount++;
                    recdMsg.Complete();
                }
                else
                {
                    moreMessages = false;
                }
            }
            Console.WriteLine("# of sent msgs: " + sentMsgCount + ", # of rec'd msgs: " + recdMsgCount);
            Console.Read();
        }
    }
    
于 2013-03-10T10:34:59.980 に答える
2

Azure Service Bus は永続的なメッセージングを提供するため、メッセージが失われることはありません。さらに調査すべきいくつかの項目: 1) そのキューからメッセージを取得している worker ロールの別のインスタンスはありますか? 2) 少なくとも 1 回の配信を保証する唯一の方法であるため、受信モードとしてピークロックを使用していますか? 受信および削除モードには保証がありません 3) メッセージの期限切れまたは最大配信数の超過により、メッセージが配信不能キューに入れられます。つまり、メッセージは受信されますが、数回完了しません。 4) 上記のいずれにも該当しない場合は、発生します。サポート チケットと Azure 製品チームが症状を調査できます。前述したように、これは耐久性のあるメッセージング システムであり、メッセージが "失われる" ことはありません。

于 2013-03-10T18:11:41.393 に答える
2

これは奇妙な問題でした。「試行錯誤」をランダムに行った結果、キューの文字列名を変更すると、すべてが再び機能し始めました。キューの名前以外は何も変更していません。構成パラメーターはまったく変更していません。

Azure の特定のキューにバグがあるようです。

于 2013-03-10T17:11:27.833 に答える
0

プロジェクトに WindowsAzure.ServiceBus NuGet パッケージがあり、メッセージの送信に使用しQueueClient.Send()いましたが、同じメッセージの紛失の問題に直面していました。

問題を完全に解決するための私の解決策:

送信側では、REST API を使用してメッセージを送信する必要がありました。

受信側では、メッセージ本文を次のように抽出しました。

using (var stream = brokeredMessage.GetBody<Stream>())
{
    using (var streamReader = new StreamReader(stream, Encoding.UTF8))
    {
        var msg = streamReader.ReadToEnd();
        // Convert the JSON message to an object
        // var obj = JsonConvert.DeserializeObject<ObjectType>(msg);
    }
}
于 2018-11-29T10:23:25.517 に答える