【问题标题】:Unique messages on a Azure Service Bus TopicAzure 服务总线主题上的唯一消息
【发布时间】:2019-10-11 07:22:06
【问题描述】:

是否可以确保 Azure 服务总线主题上的消息唯一?

我知道 ASB 具有重复检测功能。但这并不是我真正想要的。

假设 Topic 有一条 MessageID 为 123 的消息。在消费者处理完这条消息之前,我想丢弃该 Topic 上具有相同 id 的其他消息。处理完此消息后,将再次允许 id 为 123 的新消息。

Service Bus 可以帮助解决这个问题,还是我们需要在应用层处理这个问题。

【问题讨论】:

  • 你说得对,这不是重复数据删除功能。它也不是经纪人功能。代理不应用作智能存储。

标签: azureservicebus azure-servicebus-topics


【解决方案1】:

好吧,我想知道为什么您的代码要以相同的 ID 发送任何消息两次?队列/主题 ID 应该是唯一的,就像数据库表行中的 ID 应该始终具有唯一的 ID。

我认为服务总线不应该对消息负载进行任何验证,这不是他们的工作。确保您不发送具有相同 ID 的两条消息是避免更多复杂情况的更好方法。最好确保您不发送具有相同 ID 的两条消息,而不是稍后管理冲突……例如,如果其中一条消息在数据库中插入数据并且两个条目具有相同的 ID,它将引发异常。

此外,与防止 ID 冲突相比,删除具有相同 ID 的“其他消息”会导致无法解释的行为/问题/错误。如果您的用户发送了一条 ID 为 123 的消息,希望看到结果,但由于其他人发送了具有相同 ID 的消息,他的消息被您的系统删除了怎么办?你刚刚为那个用户破坏了系统,不是吗?

【讨论】:

  • 公平地说,我使用的示例被简化了。 messageId 始终是唯一的。但是“消息内容”可以是重复的。处理这些“重复”消息并没有什么“错误”。但如果“消息内容”重复,消费者也会做同样的事情。所以它确实是我们这里所说的性能优化。
  • 我想我只是不明白上下文。对我来说,发送到具有唯一 ID 的队列或主题的任何指令都来自唯一的来源。具有相同内容但不同 ID 的两条消息仍然有效并以相同的方式处理,因为它们将来自不同的源(例如,两个不同的用户发送相同的指令,但每个用户都发送到他们自己的进程实例)。通常,我习惯于发送相同的命令/事件/消息 100 次,如果它具有相同的 ID,它将不会被处理 100 次。如果它具有相同的内容和差异 ID,它对我有效。祝你好运
猜你喜欢
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-09
相关资源
最近更新 更多