【问题标题】:Receiving Message Multiple times for a client and Message Deletes after one client received为一个客户端多次接收消息,并在一个客户端接收后删除消息
【发布时间】:2017-02-13 21:36:38
【问题描述】:

我有两个客户正在收听 topic 的订阅。我看到以下问题。

问题 1:

如果一个客户端收到一条消息并将其标记为完成,则其他客户端将不会收到该消息。

但我希望我的所有客户都能收到该消息并确认它,这样一旦客户收到该消息就不会再收到了

问题 2:

如果我不确认该消息是完整的。有时我会多次收到消息。

问题 3:

在消息接收期间,如果看到网络断开连接。一段时间后它重新连接,我收到了重新开始的消息。

用于发送消息代码

============

if (!namespaceManager.TopicExists("DataCollectionTopic"))
                    namespaceManager.CreateTopic("DataCollectionTopic");
            if (!namespaceManager.SubscriptionExists("DataCollectionTopic", "one"))
                namespaceManager.CreateSubscription("DataCollectionTopic", "one");
            for(int i=0;i<100;i++)
            {
            BrokeredMessage bm = new BrokeredMessage("new Topic one");
            bm.Label = "hELLLOOOO xcvxvxcvxvxvxc DummyMEssage"+i;
            bm.Properties["StoreName"] = "asdasdasqwedas";
            bm.Properties["MachineID"] = "Bajjiiiqweq567567wii";

            if (namespaceManager == null)
            {
                Console.WriteLine("\nUnexpected Error");
                return;
            }
            MessageSender sender = messageFactory.CreateMessageSender("DataCollectionTopic");
            sender.Send(bm);

for receiving the message

===================


MessageReceiver receiver = await messageFactory.CreateMessageReceiverAsync("DataCollectionTopic/subscriptions/Vijay");

                while (true) { 

                 BrokeredMessage receivedMessage = receiver.Receive();

                try
                {
                  ProcessMessage(receivedMessage);
                 //  receivedMessage.Complete();
                }

                catch (Exception e)
                {
                    //  receivedMessage.Abandon();
                }
                }
            }

===============

TIA

【问题讨论】:

  • 问题2。如果你没有标记为Complete...最终会有一个超时,这将允许它再次被拾取。
  • 我没有提到任何超时。由于我有 n 个客户端,它们可能会在它们启动后随时启动,因此他们需要接收这些消息。但问题是如果我重新启动我的客户端,我会再次收到已经收到的消息。有时我会多次收到消息
  • “超时”是内置功能。我认为默认值为 30 秒。这得看情况。在此处查看“锁定持续时间”azure.microsoft.com/en-us/documentation/articles/…
  • 您只需为每个接收者创建一个订阅,

标签: azure azureservicebus azure-service-fabric servicebus


【解决方案1】:

问题 1

如果两个客户端都使用相同的订阅名称接收,则它们将充当竞争消费者。第一个获得消息并将其标记为已完成(已处理)的消费者将成为赢家。其余客户端不会处理相同的消息。如果打算接收所有客户端的消息(事件),则每个客户端都应该有自己的订阅,并且消息的副本将传送到每个订阅。

问题 2

这是预期的行为。您会收到高达 MaxDeliverCount 的消息,之后该消息将被 DLQ-ed。这是PeekLock 模式的默认行为。 ReceiveAndDelete 不会发生这种情况,但这是一种危险的模式,因为如果处理不成功,您将丢失消息。

问题 3

这是预期的行为。在PeekLock 模式下收到的每个消息都有一个LockDuration,给处理代码以完成消息或放弃它的时间。如果未完成,消息将对其他竞争消费者可见,并将被重新处理多达DeliveryCount 次。

总结一下

  1. 每个客户端有多个订阅,以便所有客户端接收相同的消息(事件)
  2. 如果处理成功,则完成消息。如需延长时间,renew the lock

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-12
    • 2013-01-28
    • 2010-12-03
    • 2018-08-06
    • 2021-05-23
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    相关资源
    最近更新 更多