假设有 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/