虽然Kafka由一个有序的日志构成,但NSQ不是 。消息可以在任何时间以任何顺序进入队列 。在我们使用的案例中,这通常没有关系,因为所有的数据都被加上了时间戳,但它并不适合需要严格顺序的情况 。
2.9 无数据重复删除功能
NSQ对于超时系统,它使用了心跳检测机制去测试消费者是否存活还是死亡 。很多原因会导致我们的consumer无法完成心跳检测,所以在consumer中必须有一个单独的步骤确保幂等性 。
3. 实践安装过程
本文将nsq集群具体的安装过程略去,大家可以自行参考官网 , 比较简单 。这部分介绍下笔者实验的拓扑,以及nsqadmin的相关信息 。
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 。
由于我们线上推送的量不?。扑秃蠖诵枰渴鸲嘟诘惚3指呖捎? ,所以需要自己做集群,具体架构方案如图:
Auth Service:鉴权服务,根据Token验证用户权限 。
Collect Service:消息采集服务,负责收集业务系统消息,存入MongoDB后,发送给消息分发服务 。
Dispatch Service:消息分发服务 , 根据路由规则分发至对应消息推送服务节点上 。
Push Service:消息推送服务,通过websocket将消息推送给用户 。
集群推送的关键点在于 , web端与服务端建立长连接之后,具体跟哪个推送节点保持长连接的,如果我们能够找到对应的连接节点,那么我们就可以将消息推送出去 。下面讲解一下集群的大致流程:
1. web端用户登录之后,带上token与后端推送服务(Push Service)保持长连接 。
2. 推送服务收到连接请求之后,携带token去鉴权服务(Auth Service)验证此token权限,并返回用户ID 。
- mysql怎么设置时区 mysql时间显示设置
- 云服务器游戏出现黑屏问题怎么解决? 云服务器游戏黑屏怎么办
- redis缓存失效怎么办 redis缓存数据不一致
- 如何修改戴尔服务器的IP地址? 戴尔服务器ip地址怎么改
- mongodb大公司案例 MongoDB公司怎么样
- mysql下到了c盘 mysql怎么不存到c盘
- mysql怎么把两个字段拼在一起 mysql字段拼接中文
- 联合索引怎么创建 联合索引mongodb
- 如何正确接入高防服务器? 高防服务器怎么接
- mysql怎么看慢查询日志 mysql查看单表慢查询
