/chatchat

以redis为"中转站"的聊天功能搭建,通过使用redis的订阅sub/pub功能对聊天内容进行转发

Primary LanguagePython

介绍:

这个demo起源于在多服务器上使用websocket构建群聊系统

这是一个以redis为"中转站"的聊天功能搭建,通过使用redis的订阅sub/pub功能对聊天内容进行转发

聊天的基本设计

我构想的websocket聊天系统,服务器做为转发,大多是可以维护一个本地websocket池,将所有连接用户的ws连接保存到这里,需要我转发给谁,我就从连接池中找到目标的连接,进行ws消息发送。

S: A | B A --> S --> B

遇到痛点

当websocket的聊天系统在单机上时,一个连接池可以包含所有用户

当服务是多机时,用户的ws连接可能分布在不同的机器上,这个连接池怎么包含所有可以转发的连接呢?

S1 : A

S2 : B

A --> S1 ? S2 --> B

两台服务器怎么通信,ws链接实例怎么共享?

加一层貌似可以解决绝大多数问题。

这一层可以是一层服务,用来处理连接问题,也可以是一层分发层,分发数据。我更偏向将消息分发,可以节约资源

方案

使用一个消息管道,将消息发往用户连接的那台服务器,然后通过ws发送给用户

整个服务一个管道,每台机器都去订阅,减少管道数量,机器收到消息后存在ws连接就发送,不存在就丢弃

服务

可以修改下边的函数以实现业务功能

    async def message_handle(self, data):
        await self.send_message(data['key'], data['data'])