类 IM 系统, 当消息变多时, 想水平扩展 websocket 服务器, 如何设计?

2021-04-21 22:15:05 +08:00
 lldld
类 IM 系统, 目前用户不多, 所以系统比较简单, 系统的所有消息会广播到所有 websocket 服务器, 用户连接到任一 websocket 服务器, 订阅他需要的频道和消息即可.

现在可以预见到消息会变多一个数量级, 每个 websocket 服务器接收整个系统的所有消息不合适了, 应该仅接收此服务器连接的用户所订阅的消息.

所以系统需要对消费者(websocket), 生产者(产生消息)进行一些管理, 至少要对消息进行过滤 /路由, 有什么可行的成熟方案吗?
1577 次点击
所在节点    问与答
4 条回复
aec4d
2021-04-21 23:07:05 +08:00
可以试试 socketio 配合消息中间件
psx2019
2021-04-22 00:07:18 +08:00
不想写扩散的话,那就模拟服务发现的机制做一个用户路由发现,维护一个在线用户的 session 缓存,里面维护了 session 对应的路由服务器信息,发送的时候根据这个缓存值进行路由,但是需要配合 ack 机制或者其他机制保证消息真的被接受到了。否则应该保存到离线消息表里面等待下次上线拉取消息。
xstmjh
2021-04-22 00:10:41 +08:00
一楼正解
lldld
2021-04-22 09:44:25 +08:00
@aec4d
@psx2019 感谢. 我自己的方案是会用 kafka. 只是毕竟自己要实现消息的过滤和路由等, 想找找看有没有开源的成熟方案.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/772297

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX