【问题标题】:Unique Messages per Queue in AMQP?AMQP中每个队列的唯一消息?
【发布时间】:2009-10-29 08:30:01
【问题描述】:

这类似于this other question,但有一点不同:我在规范中读到 AMQP 消息的 message-id 应该由应用程序本身设置,所以理论上我可以用它来保证一定的独特的程度,对吧?

我现在的主要问题是:message-id 在什么范围内保证是唯一的?对于当前在特定队列中排队的消息?在所有队列中?超越宇宙? :-)

这种行为是否标准化?我打算在这里使用 RabbitMQ,但如果有一些不是供应商特定的东西会很好:-)

谢谢。

【问题讨论】:

  • 我们经常使用RabbitMQ,没有专门设置message-id,从来没有出现过问题。我们每个月有 6 个应用程序、20 个交换器、40 个奇怪的队列和大约 6000 条消息。所以不回答你的问题,但确实表明它不需要是唯一的?
  • 为什么您希望消息是独一无二的?如果您向我们提供有关您想要实现的目标的更多信息,我们将能够为您提供更好的帮助。

标签: rabbitmq amqp


【解决方案1】:

另一个建议是根据dump pipes - smart endpoints 学派。

您可以使用某种共享状态来处理应用程序中的唯一性。

从 Gearman 切换到 RabbitMQ 时,我们遇到了同样的问题。我们使用 memcached 来跟踪发布的唯一消息 ID 和消费者丢弃消息 ID 已存储在 memcache 中的消息(重复)。您还可以在将内存缓存完全放入队列之前检查它。

这使您无需在消息总线层中使用此功能(因此您可以更轻松地在代理之间切换,也包括那些不保证唯一性的代理)

【讨论】:

  • 你在 Memcached 那里使用什么命令?从我所看到的可用命令来看,这听起来像是竞争条件的一个很好的入口。 Redis 的 SETNX 在这里不是更有用吗?
  • 您可以使用add() 确保只有1个进程可以设置密钥。 (Rest 获取 Memcached::RES_NOTSTORED)。这适用于单个 memcached 实例,不确定它在集群中如何工作。
【解决方案2】:

消息 ID 仅适用于特定应用程序,可能根本不是唯一的。你必须自己照顾独特性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-24
    • 2013-10-14
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多