nsq 需要搞清楚的几点:
- nsqd各节点之间是没有通讯的,所有nsqd只向nsqlookupd去register,unregister,心跳。。
- consumer 是可以不经过 nsqlookupd,自己直接链接nsqd的,只是通过nsqlookupd要好些(好处后面说)
- consumer 虽然去nsqlookupd走了一遭,但是只是去过去nsqd节点信息,获取后会跟所有的nsqd都直接建立tcp连接,记住是所有nsqd节点,并且是client端直接连接nsqd,点对点没有任务中心
- consumer 跟所有 nsqd 建立了tcp连接,相当于订阅了所有nsqd节点的对应的那个 topic-channel 了,后面只要任何节点对应的 topic-channel 有消息推送了,consumer都会收到订阅消息。
- producer 生产数据是需要指定nsqd的 (也就是生产者是不需认nsqlookupd的),点对点没有任何中心了
- producer 指定在某台nsqd节点发送生产 topic-channel 数据, 也就只有那一台nsqd有这个数据了,其它节点是没有任何感知的,这里的重点就是,这台nsqd一旦挂了,未持久化或持久化失败的消息就可就真丢了,这跟你部署N台nsqd节点都没关系,因为并没有各节点相互备份。。
- nsqd为啥还叫分布式?还部署nsqd集群干嘛? 集群可以帮你去把N个topic分布到M个nsqd节点上去,避免单点问题,至于它为啥还叫分布式,人家对外提供的消息队列服务支持的N个主题确实是能被分配到N个node上协同工作了的呀。。。
- nsq 是推模式
消息队列的几个指标
-
如何保证服务高可用
答:nsq用到了集群去保证整个服务的高可用,但并不能保证单个topic的高可用,不过你可以用特定方案间接去保证。 -
如何保证不丢消息
答: consumer每次消费完消息后,需要在规定时间内返回对应 报文 ,否则nsqd会认为消费超时或消费异常处理,在过一段时间后重复给你再次推送 该消息。 -
如何保证消息的顺序
答:nsq不保证消息的顺序的,如有顺序被保持纯属巧合。 -
如何保证消息实时性
答:nsq是主动推消息到consumer的, 实时性还是很强的。
启发
-
分布式编程流程
nsq是结合nsqlookupd做的分布式,每一台nsqd节点起气来后,会在nsqlookupd去register,总之就是节点信息跟nsqlookupd (注册中心) 进行了绑定了,后面新的 client都是去 nsqlookupd 查一下 nsqd节点列表,然后循环依次tcp直连上nsqd的,也就是说nsqd跟 nsqlookupd 只是单纯的 register,unregister,没有其他太多交互。其实shunfei/cronsun这个分布式定时任务我觉着更能表现分布式思想更明确一些,所有的node节点统一接受etcd信号调度(etcd里面的watch命令),这样一来操作N个node跟操作一个node没啥区别了,node节点注册,心跳,接受etcd信号,做出相应,返回结构也是回写etcd。。。 -
服务管理
多个子服务下如何设计并管理代码
3.面向协议编程
nsq的协议由于挺简单的,但人家写得也挺漂亮,所以用来了解面向协议编程怎么去设计代码倒是挺好的。协议详解
网友评论