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

问题描述 投票:0回答:1

我需要一个消息队列,我可以在其中为每个用户订购消息,并且会有多个消费者,每个消费者都可以接收任何未被另一个消费者处理的消息。消费者可能需要一段时间来处理一条消息(比如它可能必须发送推送通知)。因此,我无法使用 Kafka 分区,因为如果两个用户共享该分区,我们将无法获取第一个分区之后的消息。例如,

user2Message_10 user1Message_40 user1Message_39(39正在被一个消费者处理,Kafka不会让我们看到user2的消息,因为前面的消息user1Message_39还在处理中)

我真正需要的是每个用户一个队列,如果没有给用户的消息,队列将被删除,因为我们会在该用户的消息出现时重新创建它。每个用户的消息必须按顺序发送。未处理的消息必须是持久的,但如果消息已处理,我们就不需要再记住它了。有没有像这样的大容量系统?

我似乎需要直接交换路由或主题交换路由之类的东西,但我不需要队列的历史部分,因为当消费者成功处理它时我可以忘记它。消费者也可能无法发送消息,如果是这样,它只是将消息再次放在队列的前面以供另一个消费者使用(可能重试计数最终在 DLQ 中结束)。消费者一次只能处理一条消息,如果另一个消费者正在处理它的前端,则其他消费者无法从该用户的队列中获取消息。

我认为没有任何消息队列系统符合我的需求。

apache-kafka rabbitmq message-queue
1个回答
0
投票

RabbitMQ 适用于此。使用队列名称为用户名的直接交换。

未处理的消息必须是持久的,但如果消息已处理,我们就不需要再记住它了。

在队列上设置

durable = true
,在消息上设置
persistent = true
。如果服务器重新启动,它们将保存到磁盘(但在处理后不会保留消息)。

队列被删除,因为我们将在该用户的消息出现时重新创建它。

既然你希望你的队列是持久的,那么也让它成为一个自动删除队列是没有意义的。你可以做的是 set expiration on the queue 这会导致它在未使用配置的时间后被删除。然而,在没有过期的情况下尝试它是值得的,因为可能不会有任何性能问题。

消费者一次只能处理一条消息,如果另一个消费者正在处理前面的消息,其他消费者将无法从该用户的队列中获取消息。

在队列上启用Single Active Consumer。这将确保消息按顺序处理,因为一次只处理一条消息。

消费者也可能发送消息失败,如果是这样,它只是将消息再次放在队列的前面

使用手动确认,这样如果消费者发送消息失败,它可以向队列发送否定确认,使消息重新排队到队列的头部。

© www.soinside.com 2019 - 2024. All rights reserved.