在不同的 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 会导致错误的主要内容,如果未能解决你的问题,请参考以下文章