Azure服务总线丢弃消息?

时间:2013-03-10 05:43:02

标签: azure azureservicebus

我正在尝试在Azure中构建一个简单的Web API REST服务,并在后端使用服务总线队列工作程序。我可以从Web API向工作人员发送一条消息就好了。但是,我试图发送更多消息只是为了看看一切是如何工作的。所以,我创建了一个简单的控制器,如下所示:

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

当我打电话给控制器时,我只得到工人收到的消息的大约1/2左右。其余的似乎都被放弃了。

4 个答案:

答案 0 :(得分:3)

我遇到的问题是只使用发布的示例代码here获取大约一半的消息,所以我编写了自己的测试代码。我用&gt;尝试过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 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();
        }
    }
    

答案 1 :(得分:2)

这是一个奇怪的问题。通过随机浏览“尝试的东西”,我最终改变了队列的字符串名称,然后一切都开始工作了。我没有更改除队列名称之外的任何内容 - 根本不更改任何配置参数。

Azure上的特定队列似乎有些问题。

答案 2 :(得分:2)

Azure Service Bus提供持久的消息传递,因此您不会丢失任何消息。有些项目需要进一步调查: 1)是否有另一个worker角色实例从该队列中提取消息 2)你使用peek-lock作为接收模式,因为这将是保证至少一次交付的唯一方法。接收和删除模式没有保证 3)由于消息过期或超过最大传送计数,消息进入死信队列,即。它们已收到但未完成多次 4)如果以上都不适用,那么提出支持票,Azure产品团队可以调查症状,因为我提到这是一个持久的消息传递系统,所以没有消息会“丢失”。

答案 3 :(得分:0)

我在项目中使用了WindowsAzure.ServiceBus NuGet package,并使用QueueClient.Send()发送邮件,并遇到了相同的邮件丢失问题。

我的解决方案可以完全解决问题:

在发送方,我不得不use REST API to send messages

在接收方,这是我提取消息正文的方式:

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);
    }
}