我正在实现一个解决方案,其中多个节点侦听使用 ServiceStack.Redis 实现的多个 Redis 消息队列。在系统内,每个节点服务于一个特定的“通道”和通道上的一个特定操作。例如,消息可能是入站电子邮件,频道可能是“abc”。
将有许多频道,但消息类型的数量是固定的。
我花了一个周末在 ServiceStack 源代码中四处寻找,并在 RedisMessageQueueClient 和 RedisMqHost 上实现了几个变体。这个想法是在构建时传入“通道”,然后将其用于构建要发布/监控的队列名称。
在内部,现有的 RedisMqHost 和 RedisMessageQueueClient 使用 QueueNames 静态来生成队列名称,但是因为这会生成一个纯粹基于类型名称的队列,所以我无法只为特定通道提供服务。我更新的代码将通道名称附加到队列名称的末尾。
例如,对于“abc”频道,mq:InboundEmail:in 将变为 mq:InboundEmail:in:abc
代码感觉不对,因为我只更改了几个地方,但始终使用 QueueNames 类。
两个问题:
拥有多个消息队列的底层设计是否正确?应该将其建模为多个 Redis 数据库(听起来不正确)还是我的大量队列设计合适?我想我们会看到大约一千个频道和每个频道四五个队列。
是否有一种现有的机制来划分我错过的消息队列 - 感觉它应该是一个相当标准的要求,并且它已经在下面发生了,因为每个队列都有 In 队列、Out 队列以及 Priority 和 Dlq 队列消息类型。