基于go的websocket消息推送的集群实现目前websocket技术已经很成熟go语言消息通讯,选型Go语言go语言消息通讯,当然是为了节省成本以及它强大的高并发性能 。我使用的是第三方开源的websocket库即gorilla/websocket 。
由于我们线上推送的量不小,推送后端需要部署多节点保持高可用,所以需要自己做集群,具体架构方案如图:
Auth Service:鉴权服务,根据Token验证用户权限 。
Collect Service:消息采集服务 , 负责收集业务系统消息,存入MongoDB后,发送给消息分发服务 。
Dispatch Service:消息分发服务,根据路由规则分发至对应消息推送服务节点上 。
Push Service:消息推送服务 , 通过websocket将消息推送给用户 。
集群推送的关键点在于,web端与服务端建立长连接之后,具体跟哪个推送节点保持长连接的,如果我们能够找到对应的连接节点,那么我们就可以将消息推送出去 。下面讲解一下集群的大致流程:
1. web端用户登录之后,带上token与后端推送服务(Push Service)保持长连接 。
2. 推送服务收到连接请求之后,携带token去鉴权服务(Auth Service)验证此token权限,并返回用户ID 。
3. 把返回的用户ID与长连接存入本地缓存,保持用户ID与长连接绑定关系 。
4. 再将用户ID与本推送节点IP存入redis,建立用户(即长连接)与节点绑定关系,并设置失效时间 。
5. 采集服务(Collect Service)收集业务消息 , 首先存入mongodb , 然后将消息透传给分发服务(Dispatch Service) 。
6. 分发服务收到消息之后,根据消息体中的用户ID,从redis中获取对应的推送服务节点IP , 然后转发给对应的推送节点 。
7. 推送服务节点收到消息之后 , 根据用户ID , 从本地缓存中取出对应的长连接 , 将消息推送给客户端 。
其go语言消息通讯他注意事项:
go语言聊天室实现(七)websocket收消息设置上一节中,我们为每个连接都创建了一个goroutine来读取其中的消息 , 现在我们将这个读取消息的方法实现一下 。
我们在application目录下新建controllers目录 , 并在其中创建一个MessageController.go文件 。
首先我们新建一个MessageController的结构体,内容如下
这个结构体包括两个内容,一个是我们将连接放在数组之后,返回的索引,另一个是连接本身.
这个是具体的方法 。
我们首先设置了一下读消息的大小、超时时间以及超时后需要的操作 。
超时时间如果设置为0,那么就是永不超时 。之前在这里直接写0,被告知需要传一个time.Time类型的数据 。最终谷歌后才得到了这个值time.Time{}为"0001-01-01 00:00:00 +0000 UTC" 。
我们将用户手法消息的内容定义为一个结构体,然后将用户的订阅信息的json通过json.unmarshal转换成这个结构体 。
之后的switch操作与我们在Swoole中的操作基本雷同,在查询到login之后,调用service中 的login方法来进行注册 。
下一节中我们再介绍具体的注册逻辑 。
golangchannel和mq的区别golangchannel和mqgo语言消息通讯的区别
我是一个着迷于产品和运营的技术人,乐于跨界的终身学习者 。欢迎关注我哟~
每周五12点 按时送达~
我的第「218」篇原创敬上
大家好,我是Z哥 。
最近在项目中遇到了一个使用 RabbitMQ 时的问题,这个问题我觉得还是有一定普适性的,和大家分享一下,避免大家后续在同一个问题上犯错 。
消息队列(MQ)是在软件开发中很常用的中间件,如果一个程序需要协调另一个程序进行数据的“write”操作,并且不关心“write”的结果,则便会选择它 。它是一个保存消息(数据)的容器,由它来确保消息一定被送达到目标程序 。
推荐阅读
- redis的优点对比缺点,redis优点和缺点
- 如何营销清漆,如何推销油漆
- 第一个模拟飞行的游戏,第一个模拟飞行的游戏有哪些
- 如何把oracle数据库转移到mysql,将oracle数据导入mysql
- java分页导航条代码 java分页实现原理
- html5css3培训,htmlcss教程推荐
- linux虚拟机串口通信,虚拟机添加串口设备
- 虚拟机读u盘,虚拟机怎么读取u盘
- mysql怎么写事务 mysql怎么实现的事务