design-patterns - 用于多个生产者和多个消费者的 Redis pub sub

标签 design-patterns redis publish-subscribe google-cloud-pubsub

假设有 N 个生产者和订阅这 N 个生产者的 M 个用户。这里 N 生产者生产 N 种不同类型的消息,例如

producer1 produces  messageType1, 
producer2 produces  messageType2,
producer3 produces  messageType3,
.
.
. 
producerN produces  messageTypeN. 

M 个用户可以订阅这些消息。一个用户可以订阅多种类型的消息。例如

user1 consumes (messageType1, messageType2, messageType10)
user2 consumes (messageType14, messageType5)
.
.
userM consumes (messageType21, messageType22, messageType23, .... messageTypeN)

用户可以使用相同或不同的消息类型。我的问题是如何设计这个场景。它看起来像发布子模式。对于这种情况,我是否必须在 redis 中为每个用户创建 channel ?如果是,则可以创建的 redis channel 数量有限制(10K)。在那种情况下如何处理数百万用户?任何帮助将不胜感激。

最佳答案

在发布/订阅场景中,您应该为每个制作者创建 channel 。每个用户订阅相应制作人的 channel 。

User Side

// user1
subscribe producer1 producer2
// user2
subscribe producer2

Producer Side

// producer1
publish producer1 message1
// producer2
publish producer2 message2

限制不是您可以创建的 channel 数量,而是客户端连接数量。您不能让数百万用户同时连接到单个 Redis 实例。

A possible solution

为了实现这一点,您必须创建多个 Redis 实例,并将用户分成多个分片。每个 Redis 实例都会创建一个完整的生产者列表,并仅处理来自一个用户分片的连接。

在生产消息时,可以将消息发布到每个Redis实例对应的 channel 上,以便订阅该 channel 的用户可以接收到消息。

关于design-patterns - 用于多个生产者和多个消费者的 Redis pub sub,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39239950/

相关文章:

c# - 防止直接实例化的工厂类

design-patterns - 复制对象有哪些好的设计模式?

python - Flask 应用程序无法在浏览器中加载

node.js - redis:- 查询特定的 'email' 值

python - 如何在 pyzmq 中使用 inproc 传输?

asp.net-mvc - AutoMapper.CreateMaps放置在哪里?

design-patterns - 如何为带有变音符号的单词编写 lua 模式

notifications - 删除 Redis 中 Sets 类型的最后一项

ibm-mq - 带有发布/订阅 WMQ 的简单队列分发场景

design-patterns - 在高速公路的 pubsub 中获取初始值的设计模式