这个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连接就发送,不存在就丢弃
可以修改下边的函数以实现业务功能
async def message_handle(self, data):
await self.send_message(data['key'], data['data'])