这里的用例是这样的:
- 我有一个数据/价值发布者
- 我有多个值消费者(或订阅者),当他们开始时需要读取/获取值,然后订阅后续更新
目标是让发布者和订阅者都只做“一件事”。
示例:发布者发布outside.temperature=28
并且多个订阅者会对新信息做出反应,例如打开加热器,发送一条短信说“带上长裤”,并在某些显示器上更新一些图形。
我今天(正在工作)的是带有队列的 Apache ActiveMQ,任何订阅者都可以query outside.temperature
并且让发布者(重新)发送它的最新值。回复被发送给发送查询的消费者(回复队列)。新值将发布到具有相同名称 ( outside.temperature
) 的主题。每次订阅者(重新)启动时,都会发生这种情况:查询当前状态,订阅更新。
这一切似乎都过于复杂,因为订阅者必须知道如何做两件事:
- 知道如何请求一个值(队列和回复队列),即轮询
- 知道如何订阅未来值(主题),即订阅推送
出版商必须知道如何做两件事:
- 知道如何回复查询(队列),回答投票请求
- 知道如何发布新值(主题),推送新值
这里的目标是拥有一些中间件软件,它们将:
- 保留(并保留)键的最后一个已知值
- 向该密钥的所有订阅者发布更改,即 pubsub
- 将最新的已知值(作为推送)发送给新订阅者
这将降低发布者和订阅者的复杂性。
我一直在寻找 Redis 来解决这个问题,但 PUBSUB 功能只替换了上面示例中的主题,而不是在订阅者启动(和应答)时轮询当前值,即查询/队列部分。
我一直在寻找 ZooKeeper 和手表,虽然它看起来可以满足我的需求,但它过于复杂并且需要大量代码。
我一直在查看 ØMQ (ZeroMQ) 并看到了Last Value Caching, LVC一词。这里的建议是在发布者和订阅者之间创建一个代理。
RabbitMQ 有 LVC 扩展,例如https://github.com/simonmacmullen/rabbitmq-lvc-plugin
我的问题是,是否还有其他一些 FLOSS 产品可以使用内置的最后一个值缓存进行 pub-sub,而不需要添加自定义代理或插件?