在不同的 Azure 服务总线队列中使用相同的消息 ID 会导致错误

Posted

技术标签:

【中文标题】在不同的 Azure 服务总线队列中使用相同的消息 ID 会导致错误【英文标题】:Using the same message id in different Azure service bus queues causing errors 【发布时间】:2018-12-17 14:53:20 【问题描述】:

我在下面的函数中遇到问题,该函数将预定消息添加到 Azure 服务总线队列。创建方法在调用方法时弹出

var sendCodeSequence = await queueClient.ScheduleMessageAsync(message, 
                                                              new DateTimeOffset(endTime));

即使消息被添加到队列中,我的控制器中的堆栈也不会抛出异常!

我的问题?

    如果我在同一服务总线上的不同队列中多次使用相同的消息 ID,即使它们都有不同的序列 ID,我是否会在每个队列上创建和删除它们时遇到问题?

    我在代理消息构造函数和消息 id 属性中使用消息 id,这样可以吗?或者这会导致添加更多并将它们从队列中删除?

例如。我在同一个服务总线命名空间上有 5 个不同的队列。并且可能会添加 5 个不同的消息,每个队列一个,所有消息都具有相同的代理消息 ID。那么,不知道会不会有什么问题呢?

这是我用来将预定消息添加到队列的方法,使用我的事件 ID 作为消息 ID

public async Task <long> CreateHostPointCodeMessage(int eventId, YogaSpaceDuration duration, DateTime utcEventDateTime) 
  string serviceBusConnectionString = System.Configuration.ConfigurationManager.AppSettings["ServiceBusConnectionString"];
  string queueName = System.Configuration.ConfigurationManager.AppSettings["PreEventPointsCodeQueueName"];

  var queueClient = QueueClient.CreateFromConnectionString(serviceBusConnectionString, queueName);
  int length = Convert.ToInt16(EnumHelper.GetDisplayName(duration).Split(' ')[0]);
  var endTime = DateTime.SpecifyKind(utcEventDateTime.AddMinutes(length).AddMinutes(-5), DateTimeKind.Utc);

  BrokeredMessage message = new BrokeredMessage(eventId.ToString());
  message.MessageId = eventId.ToString();
  message.ScheduledEnqueueTimeUtc = endTime;

  var sendCodeSequence = await queueClient.ScheduleMessageAsync(message, new DateTimeOffset(endTime));
  await queueClient.CloseAsync();

  return sendCodeSequence;

仅供参考 - 我正在使用“Microsoft.ServiceBus.Messaging”将消息发送到队列,但根据 MS article 我应该使用“Microsoft.Azure.ServiceBus”我不知道这是否会产生任何影响区别?

【问题讨论】:

较新的命名空间 Microsoft.Azure.ServiceBus 是完全开源的,完全异步的,它针对新的 .Net 标准。所以你应该继续使用它。 【参考方案1】:

将相同 id 的消息发送到 Namespace 下的不同 Queue 并没有错。

即使您可以将任意数量的具有相同 ID 的消息发送到同一个队列,除非队列的 RequiresDuplicateDetection 属性设置为“True”。

只有启用了“RequiresDuplicateDetection”属性的队列,ID重复的消息才会丢失。

【讨论】:

以上是关于在不同的 Azure 服务总线队列中使用相同的消息 ID 会导致错误的主要内容,如果未能解决你的问题,请参考以下文章

Azure 服务总线 - 删除特定消息

如何查看 Azure 服务总线队列中的所有消息?

Azure 服务总线:啥是“请求”和“消息”?

读取 Azure 服务总线队列中的所有活动消息

顺序处理算法/模式 - Azure 服务总线队列

互操作性 Azure 服务总线消息队列消息