Skip to content
This repository has been archived by the owner on Mar 14, 2024. It is now read-only.

Latest commit

 

History

History
78 lines (42 loc) · 2.75 KB

优化.md

File metadata and controls

78 lines (42 loc) · 2.75 KB

优化

参考文档:

分析

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

参考文章:

6.tcp与ws之间的通信 例如app端 数据推送给网页端 网页端推送给app端 该如何做数据交互