websocket推送系统

该博客内容为转载,原文链接为https://www.cnblogs.com/wanglao/p/11162631.html ,原标签涉及网络、数据结构与算法、数据库等信息技术领域。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

推送服务中有几个模块:消息,频道。
频道:几个用户,组成一个频道。(比如XX部门是一个频道,部门通知就发送给这个频道)
消息:指的是需要推送给频道的信息,此处使用队列。
一个经典的数据结构
 
map[ Group ] messageList    存储当前最新message
map[Group] userList            频道和用户
map[user] messageList          用户和对应接收的消息
 
频道可以大致分为这几类:
有些频道,时效性很强,,只接收最新消息,比如会议通知。(谁不想接收一大串通知自己去年xx时间开会的消息)
有些频道,需要把所有信息都接收,比如,系统设置通知。
有些频道,接收完了,还要存起来,比如用户操作日志。为此我们还要把他们连上数据库持久化起来。
 
一个websocket推送服务。
在一个推送服务中,各个用户组处在不同的频道中,我们通过接口来连接传递我们要推送的消息。推送系统验证用户权限,然后进行推送。
 
接入:
我们通过访问并且返回javascript 文件来接入系统,同时很好的解决了跨域问题。比如,引入:
<script src="xxxx.js"></script>
它会找到网站的通用UserID或者Token,发回推送服务,来确定用户状态。
而对于子系统的每个页面,我们可以在过滤器中加入这个返回脚本,有网关的,在网关系统中加入
 
存储:
在用户数量和消息数量达到一定的时候,上文数据结构就不能存放在推送服务上面了,我们可以放在redis缓存上面,使用hash结构进行存储。同时map[user] messageList  结构 messageList也分为未读和已读,这里我们只存储未读的 ,而已读的可以存储在关系数据库中。
而对于推送服务需要做到,把每个频道接收的信息都存储到数据库,更细致的,可以把每个用户存储已读未读的信息存储起来。
 
性能:
很明显,每个页面至少要开一个线程,负责监听与发送消息。我使用go协程池来做的,每当发送或者接收的时候才分配go协程,操作完成立马回收,包括心跳包(60秒一次),每个协程2k,常规服务器十几万个连接没有压力。
 
 

转载于:https://www.cnblogs.com/wanglao/p/11162631.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值