Redis 为发布/订阅和消息队列中的多个使用者提供消息传递保证
要求 一个系统经历一些状态变化,系统的多个其他部分必须知道这一点(让我们称之为观察者),以便他们可以根据当前状态执行一些操作,如果一些观察者不在线(由于一些问题,目前没有监听,但很快就会回来),观察者的操作很重要,在所有观察者都获得该消息之前,不应丢弃该消息 试图通过发布/订阅模型实现这一点,以下是我的发现(如果这种理解是错误的,请更正)- 发布者在特定主题上创建事件,多个订阅者可以使用相同的消息。此模型要么不提供传递保证(在redis中),要么保证一次传递(使用消息队列),即当一个消费者确认消息时,消息被丢弃(rabbitmq) 示例 在数据库中创建一个新的人员配置文件实体 现在,Redis 为发布/订阅和消息队列中的多个使用者提供消息传递保证,redis,rabbitmq,publish-subscribe,messaging,Redis,Rabbitmq,Publish Subscribe,Messaging,要求 一个系统经历一些状态变化,系统的多个其他部分必须知道这一点(让我们称之为观察者),以便他们可以根据当前状态执行一些操作,如果一些观察者不在线(由于一些问题,目前没有监听,但很快就会回来),观察者的操作很重要,在所有观察者都获得该消息之前,不应丢弃该消息 试图通过发布/订阅模型实现这一点,以下是我的发现(如果这种理解是错误的,请更正)- 发布者在特定主题上创建事件,多个订阅者可以使用相同的消息。此模型要么不提供传递保证(在redis中),要么保证一次传递(使用消息队列),即当一个消费者确认消
简言之,我的需要是确保所有消费者都得到相同的信息,并且他们应该能够单独确认,只有在所有消费者都确认上述任何一种方法都不能做到这一点后,才应该删除该信息
我有什么遗漏吗?我应该如何处理这个问题?正如您所提到的,它不是您可以通过Redis发布/订阅数据结构来控制的 但你可以很容易地做到这一点 Streams将允许您使用
XADD
命令发布消息,然后控制哪些消费者正在处理消息,并确认消息已被处理
您可以查看这些示例应用程序,它(在Java中)提供了以下示例:
- 发布和使用消息
- 创建多个消费群体
- 管理异常
- (展示如何使用ADD/ACK/PENDING/CLAIM并使用Redis Streams和SpringData构建防错流应用程序的项目)
XADD
命令发布消息,然后控制哪些消费者正在处理消息,并确认消息已被处理
您可以查看这些示例应用程序,它(在Java中)提供了以下示例:
- 发布和使用消息
- 创建多个消费群体
- 管理异常
- (展示如何使用ADD/ACK/PENDING/CLAIM并使用Redis Streams和SpringData构建防错流应用程序的项目)
- 发布者总是向“交换”发送消息,这只是一个无状态路由地址;它不需要知道消息应该在哪个队列中结束
- 消费者总是从“队列”中读取消息,该队列包含其自己的消息副本,而不管消息来自何处
- 多个使用者可以订阅同一个队列,并且每条消息将只传递给一个使用者
- 至关重要的是,exchange可以将同一消息路由到多个队列,每个队列都将收到消息的副本
- “验证服务”队列已绑定到此exchange,以接收与“entity.profile.#”匹配的所有邮件的副本
- “订阅\设置\服务”队列已绑定到此exchange,以接收与“entity.profile.created”匹配的所有邮件的副本
- 验证服务在“验证服务”队列中拾取消息副本,处理并确认它
- 订阅设置服务在“订阅设置服务”队列中拾取消息副本,处理并确认它
此方案由明确支持,它将“交换”与“队列”分开:
- 发布者总是向“交换”发送消息,这只是一个无状态路由地址;它不需要知道消息应该在哪个队列中结束
- 消费者总是从一个“队列”中读取消息,该队列包含其消息