文章来源:https://dwz.cn/jPGInM6l作者:蛮三刀把刀
书接上文,我们开始对我们的小小聊天室进行集群化改造。
本文内容摘要:
- 为何要改造为分布式集群
- 如何改造为分布式集群
- 用户在聊天室集群如何发消息
- 用户在聊天室集群如何接收消息
- 补充知识点:STOMP 简介
- 功能一:向聊天室集群中的全体用户发消息——Redis的订阅/发布
- 功能二:集群集群用户上下线通知——Redis订阅发布
- 功能三:集群用户信息维护——Redis集合
- WebSocket集群还有哪些可能性
本文源码:(妈妈再也不用担心我无法复现文章代码啦)
https://github.com/qqxx6661/springboot-websocket-demo/releases/tag/%E9%9B%86%E7%BE%A4%E7%89%88
正文
WebSocket集群/分布式改造:实现多人在线聊天室
为何要改造为分布式集群
分布式就是为了解决单点故障问题,想象一下,如果一个服务器承载了1000个大佬同时聊天,服务器突然挂了,1000个大佬瞬间全部掉线,大概明天你就被大佬们吊起来打了。当聊天室改为集群后,就算服务器A挂了,服务器B上聊天的大佬们还可以愉快的聊天,并且在前端还能通过代码,让连接A的大佬们快速重连至存活的服务器B,继续和大家愉快的聊天,岂不美哉!
总结一下:实现了分布式WebSocket后,我们可以将流量负载均衡到不同的服务器上并提供一种通信机制让各个服务器能进行消息同步(不然用户A连上服务器A,用户B脸上服务器B,它们发消息的时候对方都没法收到)。
如何改造为分布式集群
当我们要实现分布式的时候,我们则需要在各个机器上共享这些信息,所以我们需要一个Publish/Subscribe的中间件。我们现在使用Redis作为我们的解决方案。
1. 用户在聊天室集群如何发消息
假设我们的聊天室集群有服务器A和B,用户Alice连接在A上,Bob连接在B上、
Alice向聊天室的服务器A发送消息,A服务器必须要将收到的消息转发到Redis,才能保证聊天室集群的所有服务器(也就是A和B)能够拿到消息。否则,只有Alice在的服务器A能够读到消息,用户Bob在的服务器B并不能收到消息,A和B也就无法聊天了。
2. 用户在聊天室集群如何接收