参考文档:
1、如何处理大量连接的问题(物理问题,不用解决)
集群,部署多个节点, 通过负载均衡,打散到不同的节点
2、如何处理大批量数据同时进行推送的问题
减小网络小包的请求,在前端层面进行控制,设置一个中央管理器,维护各个请求,设置指定时长内定时集中推送 小包 合 大包(将一秒内N条消息合并成1条消息,合并后,每秒推送数等于在线连接数)
3、如何保证线程安全
参考 Golang 的 map 线程安全
4、Json编码非常耗费CPU资源(如何解决json编码性能问题)
如上中的 N条消息合并,后,多次json编码转为 单次编码
5、如何处理用户连接断开,重新连接持续推送的问题
持久化数据到redis 或者 mysql中。标识数据推送状态即可。前提必须保证 读写 可能导致的并发问题
1、优化大量连接的问题
如上描述,将单体架构转移为集群部署,使用负载均衡将 click 连接 分散在不同的服务器上
操作:
本地使用docker-compose 单间一个集群网络,网络名称定义为 ImService
,可以先设置5个容器,使用负载均衡打到各个服务节点中
(这个方法,实际上达不到优化的效果,因为实际上都在一个物理服务器上,反正如果有钱多台服务器的话,差不多就是这样玩)
使用map 管理多个客户端,每创建一个map,则存储其 索引,设置缓存KEY
zet 服务名称:websocket
key 用户ID value 索引index
添加挂起状态,比如用户在5分钟内,没有任何动作(检查操作动作),则自动断开ws连接,同时前端开启 定时轮询检查是否有消息了。
不过,有点浪费了,要考虑了轮询损耗大还是开启连接损耗大
2、处理大批量数据同时进行推送的问题
前端的话,可以尝试编写定义一个store,存储消息,消费后数据进行抛弃,同时启动一个定时函数,每0.3秒去消费,并发送到后台,有些人在一秒中聊天发一堆消息,就可以适当合并下消费
3、线程安全
sync.map
4、如何处理用户连接断开,重新连接持续推送的问题
前期就用数据库吧,状态标记一下就好了
参考文章:
5、语音功能 web端使用WebRTC
参考文章:
- https://www.w3cschool.cn/javascript_guide/javascript_guide-l4zu26al.html
- https://www.jb51.net/article/159849.htm
6.tcp与ws之间的通信 例如app端 数据推送给网页端 网页端推送给app端 该如何做数据交互