当前位置: 首页 > 面试题库 >

如何为即时消息系统设计Redis发布/订阅?

慕志泽
2023-03-14
问题内容

我是Redis pub / sub的新手。我在系统中有一个聊天功能,就像IM。所以我想使用redis pub /
sub。在我检查了样本之后,大多数样本都是基于聊天室设计的。在我的系统中,我将在多个用户之间建立多个聊天室,例如:

A:B
A:C
D:C
E:F

所以,上面的几行是房间。我已经用如下的node.js实现了服务器;

var store = redis.createClient();
var pub = redis.createClient();
io.sockets.on('connection', function (socket) {
    var sub = redis.createClient();

    sub.on("message", function(pattern, data){
            data = JSON.parse(data);
        socket.send(JSON.stringify({ type: "chat", key: pattern, nick: data.nickname, message: data.text }))
        }
    });

    socket.on('message', function (messageData) {
        store.incr("messageNextId", function(e, messageId) {
        var room = ""
        var from = messageData.clientId > socket.nickname ? socket.nickname : messageData.clientId;
        var to = messageData.clientId < socket.nickname ? socket.nickname : messageData.clientId;   
            room = from + ":" + to;

        var message = { id: messageId, nickname: socket.nickname, text: messageData.text };
        store.rpush("rooms:" + room, JSON.stringify(message), function(e, r) {  
             pub.publish(room, JSON.stringify(message))
        });
    });
});

如您所见,我正在为每个连接创建一个新的Redis订户。在其他聊天室示例中,redis订户客户端是全局创建的。而且始终只有三个连接,这解决了它们的问题,因为当发布者发布消息时,所有连接的客户端都应该得到它。但是我这里有一个约束。我想打开两个用户之间的聊天会话,只有这些用户才是订阅者。上面的代码按我的意愿工作,但是我不知道redis是否可以为每个连接创建一个新的订户客户端。

很高兴听到您的建议。提前致谢。


问题答案:

与往常一样,您需要针对自己的用例对此类事情进行基准测试-
无法提供一般性建议。您可能需要增加系统范围内或redis用户的最大打开文件数。当然,这也适用于运行Web服务器的用户。

也就是说,您应该确保在用户离开时收听socket.on('disconnect')quit()Redis订阅者。您可能还想知道socket.io具有一个redis后端,该后端利用了redis
pub / sub,还具有room的概念,因此您可以通过使用它来节省一些麻烦,因为您已经依赖于socket .io。

编辑: 快速检查后,我从991个订户后从Redis收到此错误消息:

Ready check failed: Error: Error: ERR max number of clients reached

这是默认值redis.conf

# Set the max number of connected clients at the same time. By default
# this limit is set to 10000 clients, however if the Redis server is not
# able ot configure the process file limit to allow for the specified limit
# the max number of allowed clients is set to the current file limit
# minus 32 (as Redis reserves a few file descriptors for internal uses).
#
# Once the limit is reached Redis will close all the new connections sending
# an error 'max number of clients reached'.
#
# maxclients 10000

我的系统(Ubuntu
11.11)的默认nofile限制为1024,因此我的快速测试应该在连接了992个客户端之后失败,这在测试中似乎是正确的(我也有一个发布者客户端)。我的建议是检查您的nofile限制(在我的系统上,/etc/security/limits.{conf,d/*}以及您的redis
maxclients设置,然后是基准,基准,基准!



 类似资料:
  • 我是新的数据流和发布子工具在GCP。 需要将prem过程中的电流迁移到GCP。 当前流程如下: 我们有两种类型的数据馈送 Full Feed–其adhoc作业–完整XML的大小约为100GB(单个XML–非常复杂的一个–完整的数据–ETL作业处理此XML并将其加载到约60个表中) 单独的ETL作业用于处理完整提要。ETL作业过程完全馈送并创建负载就绪文件,所有表将被截断并重新加载 源系统每30分钟

  • 主要内容:1.订单系统在企业中的角色,2.订单系统与各业务系统的关系,3.订单系统上下游关系,4.订单系统的业务架构1.订单系统在企业中的角色 在搭建企业订单系统之前,需要先梳理企业整体业务系统之间的关系和订单系统上下游关系,只有划分清业务系统边界,才能确定订单系统的职责与功能,进而保证各系统之间高效简洁的工作。 2.订单系统与各业务系统的关系 2.1 对外系统 所有给企业外部用户使用的系统都在这一层,包括官网、普通用户使用的C端,还包括给商户使用的商家后台和在各个销售渠道进行分销的系统,比如与

  • 问题内容: 当前,我正在使用node.js和redis来构建应用程序,使用redis的原因是由于发布/订阅功能。该应用程序只是在用户进入用户或不在房间时通知管理员。 由于我想听join和disjoin事件,我的问题是我是否应该使用两个redisclient来听这两个事件,例如 或者只是使用一个redisclient来监听和分离回调中的逻辑 我知道这两种方式都是可行的,但是我不知道人们在哪种情况下会

  • 主要内容:一、从一个新闻门户网站案例引入,二、推算一下你需要分析多少条数据?,三、黄金搭档:分布式存储+分布式计算这篇文章聊一个话题:什么是分布式计算系统? 一、从一个新闻门户网站案例引入 现在很多同学经常会看到一些名词,比如分布式服务框架,分布式系统,分布式存储系统,分布式消息系统。 但是有些经验尚浅的同学,可能都很容易被这些名词给搞晕。所以这篇文章就对“分布式计算系统”这个概念做一个科普类的分析。 如果你要理解啥是分布式计算,就必须先得理解啥是分布式存储,现在我们从一个小例子来引入。 比如说

  • 主要内容:发布/订阅流程,常用命令汇总,基本命令应用Redis PubSub 模块又称发布订阅者模式,是一种消息传递系统,实现了消息多播功能。发布者(即发送方)发送消息,订阅者(即接收方)接收消息,而用来传递消息的链路则被称为  channel。在 Redis 中,一个客户端可以订阅任意数量的 channel(可译为频道)。 消息多播:生产者生产一次消息,中间件负责将消息复制到多个消息队列中,每个消息队列由相应的消费组进行消费,这是分布式系统常用的

  • 本文向大家介绍Spring boot+redis实现消息发布与订阅的代码,包括了Spring boot+redis实现消息发布与订阅的代码的使用技巧和注意事项,需要的朋友参考一下 一.创建spring boot项目 二.编辑yml配置文件 三.配置Redis 四.编写RedisUtil消息发布方法 五.配置消息监听 六.消息订阅方法 七.定时消息发布测试 八.测试结果 九.发布对象User实体 到