服务总线主题为相同的 MessageId 插入了重复的消息记录

Service bus topic inserted duplicate message record for same MessageId

[FunctionName("MyProcess")]
public static void Run(BrokeredMessage currentMessage,[ServiceBus("mytopic",
    Connection = "ConnServiceBus")]ICollector<BrokeredMessage> mytopicDemo, TraceWriter log)
{
    string messageBody = currentMessage.GetBody<string>();
    BrokeredMessage brokeredMessage = new BrokeredMessage(result);
    //extracted Id and Name from body using some code for simplicity making it as messageBody.Id and messageBody.Name
    brokeredMessage.Properties.Add("Id", messageBody.Id);    
    brokeredMessage.Properties.Add("Name", messageBody.Name);
    brokeredMessage.MessageId = "ZZ"; // I also tried GUID here messageBody.Id
    mytopicDemo.Add(brokeredMessage);

    ...                     

服务总线无法识别重复的 messageId 消息。

为什么要为同一个消息 ID 插入多条记录?

如果已经存在,应该避免插入重复记录。

可能的原因可能是

  • 如果应用程序在发送后立即遇到致命错误 一条消息,并且错误地重新启动了应用程序实例 认为先前的消息传递没有发生,随后 send 导致同一条消息在系统中出现两次。

  • 客户端或网络级别的错误也有可能
    稍早发生,并且要将已发送的消息提交到
    队列,确认未成功返回
    客户。这种情况使客户对结果产生怀疑 发送操作。

启用重复检测通过丢弃重复邮件解决了这个问题。

队列和主题的重复检测时间历史默认为30秒,最大值为7天。

重复检测时间历史必须很大才能检测到尽可能多的重复消息。另请注意 window 的大小直接影响队列(和主题)吞吐量。

点击here了解更多信息。