3.1 拓扑结构
topology
实验采用3台NSQD服务,2台LOOKUPD服务 。
采用官方推荐的拓扑,消息发布的服务和NSQD在一台主机 。一共5台机器 。
NSQ基本没有配置文件,配置通过命令行指定参数 。
主要命令如下:
LOOKUPD命令
NSQD命令
工具类,消费后存储到本地文件 。
发布一条消息
3.2 nsqadmin
对Streams的详细信息进行查看,包括NSQD节点,具体的channel,队列中的消息数,连接数等信息 。
nsqadmin
channel
列出所有的NSQD节点:
nodes
消息的统计:
msgs
lookup主机的列表:
hosts
4. 总结
NSQ基本核心就是简单性 , 是一个简单的队列,这意味着它很容易进行故障推理和很容易发现bug 。消费者可以自行处理故障事件而不会影响系统剩下的其余部分 。
事实上 , 简单性是我们决定使用NSQ的首要因素 , 这方便与我们的许多其他软件一起维护,通过引入队列使我们得到了堪称完美的表现,通过队列甚至让我们增加了几个数量级的吞吐量 。越来越多的consumer需要一套严格可靠性和顺序性保障,这已经超过了NSQ提供的简单功能 。
结合我们的业务系统来看,对于我们所需要传输的发票消息,相对比较敏感,无法容忍某个nsqd宕机 , 或者磁盘无法使用的情况 , 该节点堆积的消息无法找回 。这是我们没有选择该消息中间件的主要原因 。简单性和可靠性似乎并不能完全满足 。相比Kafka,ops肩负起更多负责的运营 。另一方面,它拥有一个可复制的、有序的日志可以提供给我们更好的服务 。但对于其他适合NSQ的consumer,它为我们服务的相当好,我们期待着继续巩固它的坚实的基础 。
基于go的websocket消息推送的集群实现目前websocket技术已经很成熟,选型Go语言,当然是为了节省成本以及它强大的高并发性能 。我使用的是第三方开源的websocket库即gorilla/websocket 。
由于我们线上推送的量不?。?推送后端需要部署多节点保持高可用,所以需要自己做集群,具体架构方案如图:
Auth Service:鉴权服务,根据Token验证用户权限 。
Collect Service:消息采集服务,负责收集业务系统消息 , 存入MongoDB后,发送给消息分发服务 。
Dispatch Service:消息分发服务,根据路由规则分发至对应消息推送服务节点上 。
Push Service:消息推送服务,通过websocket将消息推送给用户 。
集群推送的关键点在于,web端与服务端建立长连接之后 , 具体跟哪个推送节点保持长连接的,如果我们能够找到对应的连接节点,那么我们就可以将消息推送出去 。下面讲解一下集群的大致流程:
【go语言消息服务 go语言通信】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,从本地缓存中取出对应的长连接,将消息推送给客户端 。
- 如何使用cmd命令行提示符登录mysql服务器 cmd中登陆mysql
- 云服务器游戏出现黑屏问题怎么解决? 云服务器游戏黑屏怎么办
- redis实现延时消息队列 redis消息时间过长
- 如何修改戴尔服务器的IP地址? 戴尔服务器ip地址怎么改
- 客户端无法连接到异速联服务器 客户端无法连接mongodb
- 如何正确接入高防服务器? 高防服务器怎么接
- 如何处理云服务器游戏黑屏问题? 云服务器游戏黑屏怎么解决
- redis 加一 增加redis服务
- 如何查看戴尔服务器的IP地址? 戴尔服务器ip地址怎么看
- mongodb服务器启动失败 mongodb服务器配置要求
