rabbitmq 推送通知/邮件应用的消息队列?

watbbzwu  于 2023-04-11  发布在  RabbitMQ
关注(0)|答案(1)|浏览(135)

我需要一个消息队列,我可以按每个用户对消息进行排序,并且会有多个消费者,每个消费者可以接收任何未被另一个消费者处理的消息。消费者可能需要一段时间来处理消息(它可能必须发送推送通知)。因此,我不能使用Kafka分区,因为如果两个用户共享分区,我们无法获得第一个分区之后的消息。例如,
user2Message_10 user1Message_40 user1Message_39(39正在被消费者处理,Kafka不会让我们看到user2的消息,因为前面的消息user1Message_39仍在处理中)
我真正需要的是每个用户的队列,如果没有该用户的消息,队列将被删除,因为当该用户的消息出现时,我们将重新创建它。每个用户的消息必须按顺序排列。未处理的消息必须是持久的,但如果消息被处理,我们就不需要再记住它了。有没有这样的系统是高容量的?
看起来我需要像直接交换路由或主题交换路由这样的东西,但我不需要队列的历史部分,因为当消费者成功处理它时,我可以忘记它。消费者也可以发送消息失败,如果是这样,它只是将消息再次放在队列的前面,供另一个消费者使用使用者一次只能处理一条消息,如果另一个使用者正在处理该用户队列的前端,则其他使用者无法从该用户队列中获取消息。
我认为没有任何消息队列系统能够满足这种需要。

qzwqbdag

qzwqbdag1#

RabbitMQ适用于此。使用直接交换,其中队列名称是用户名。

未处理的消息必须是持久的,但是如果消息被处理了,我们就不需要再记住它了。
在队列上设置durable = true,在消息上设置persistent = true。它们将在服务器重启时保存到磁盘(但它不会保留处理后的消息)。
队列被删除,因为我们将在该用户的消息出现时重新创建它。
既然你希望你的队列是持久的,那么让它也成为一个自动删除队列是没有意义的。你可以做的是在队列上设置过期时间,这会导致它在配置的时间内没有被使用后被删除。但是,如果没有过期时间,那就值得一试,因为可能不会有任何性能问题。
使用者一次只能处理一条消息,如果另一个使用者正在处理该用户队列的前端,则其他使用者无法从该用户队列中获取消息。
在队列上启用单个活动消费者。这将确保按顺序处理消息,因为一次只处理一条消息。
使用者也可能发送消息失败,如果是这样,它只是将消息再次放在队列的前面
使用手动确认,以便如果使用者未能发送消息,它可以向队列发送否定确认,使消息在队列的头部重新排队。

相关问题