消息中间件 - 如何避免使用通配符订阅重入?

Posted

技术标签:

【中文标题】消息中间件 - 如何避免使用通配符订阅重入?【英文标题】:Messaging Middleware - how to avoid reentrance with wildcard subscription? 【发布时间】:2010-11-14 11:38:13 【问题描述】:

消息中间件解决方案(JMS、Tibco 等)允许发布/订阅使用通配符过滤“主题”来订阅某个“主题”的所有消息,例如SUBSCRIBE("ACCOUNT.*") 主题允许您订阅“ACCOUNT.WITHDRAW”消息和“ACCOUNT.CHECKBALANCE”消息。

问题是这样的订阅也会收到我自己发布的消息。

我正在寻找一种机制,例如,类似于 UDP 多播环回,它可以由传输层打开或关闭,而不会弄乱正在发送的数据。

是否有一种通用的、声明性的(无自定义代码,仅配置)方式来配置中间件不接收同一个服务实例已发布的消息?理想情况下,这也应该能够过滤掉由相同“种类”的所有服务器(节点)发布的所有内容。

提前致谢。

【问题讨论】:

【参考方案1】:

没有人回答,所以我会插话(以挥手的方式)。

我相信JMS spec 中没有任何内容可以控制您是否将自己发送的消息返回到主题接收器。因此,任何像这样的功能都是不可移植的供应商功能。特别是对于您的第二个要求(基于 JMS 客户端的“种类”与基于执行发送/接收的相同连接的某些控制)。

如果您无法灵活地修改代码或消息内容(属性),我认为您没有可移植的解决方案。对于第二个“种类”要求,可能根本没有解决方案。

如果您想调查特定于供应商的选项,您需要告诉我们您对哪个供应商感兴趣。您可能一无所获,但不问就无法知道。

【讨论】:

谢谢。我对任何支持我需要的功能的解决方案/供应商感兴趣。我不介意它是非通用的,虽然我有点惊讶于这样的基本功能没有成为标准(即使在非常微不足道的消息广播机制中也存在 - UDP) 你已经有了用消息属性和消费者选择器来做这类事情的构建块。但这需要灵活地修改代码。我碰巧不认识提供这种功能的供应商。我只是在猜测......【参考方案2】:

JMS API 包含 TopicSubscribers 的此选项,例如TIBCO EMS 让您创建具有“noLocal”属性的消费者。这意味着没有消息通过同一连接发布,并被同一连接上的客户端使用。

例如看看这里如何使用“noLocal”选项创建主题订阅者: https://docs.tibco.com/pub/enterprise_message_service/7.0.1-march-2013/doc/html/tib_ems_api_reference/api/javadoc/javax/jms/TopicSession.html

【讨论】:

以上是关于消息中间件 - 如何避免使用通配符订阅重入?的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ下的生产消费者模式与订阅发布模式

通过案例理解 MQTT 主题与通配符

RabbitMQ下的生产消费者模式与订阅发布模式

SQL的 like 中间字符通配 用法

面试官:给我一个避免消息重复消费的解决方案?

Redis实现中间件(订阅)