NSQ的设计特点
nsq的设计特点
分布式的队列传输节点,能够避免传输节点的单点故障,确保消息一定会被传输一次, 但是这样可能引起消息被多次传输 bound the memory footprint of a single process (by persisting some messages to disk)简化消费者和生产者的配置, 提供了一个简单明确的升级路线,提升了效率。
nsqde的基本概念
- nsqd, 转发消息的核心, 负责接受消息, 将消息排队, 发送给客户端, 不同的nsqd之间的消息不会共享
- nsqlookupd ,只是提供client查询当前所有的nsqd的信息, 不会对实际的消息转发做任何的处理, nsqlookupd于nsqd之间在底层建立了tcp的长连接连接, 而默认监听的4160端口就是干这个用的,通过周期性的报告nsqd的状态,
- client 消费者, 需要配置nsqlookupd的地址
- nsqadmin 供管理员集中查看所有的集群,有一个webui
- topic, 属于nsqd, 就是一个消息流,目测是对业务的标志, 或者是为了将同一个物理管道进行逻辑细分的方式, 算是为了提高效率和细分资源,topic并不需要进行实现的配置,一个nsqd可能拥有多个topic
- channel, 属于nsqd,是发送给一个topic的逻辑组, 一个topic可能用拥有多个channel, 每个channel都能收到这个topic下面的所有的消息, 一般一个channel都会对应一个消费者, 而一个channel可以对应多个消费者,channale会将消息随机发送给下面的一个client,所以任意一个client收到的消息都不是完全的,
- channel和topic都是单独缓存消息的
分布式方案
- nsqd随意起, nsqlookup使用备份的方式
- 一个client只会同时对一个nsqd建立连接, 所以一旦一个nsqd连接, 那么就不会对其他的topic建立连接
- 只有再一个nsqd坏掉的时候,才会重新选择nsqd
- 那么client选择nsqd的原则是什么?
nsq保证消息能够正常至少传输一次的方式是
- client表明已经可以接受消息。
- nsqd将消息发送出去, 同时将这个消息进行本地存储。
- client如果回复FIN 表示成功接受, 如果回复REQ, 表明需要重发, 如果没有回复, 则认为超时了, 进行重发。
所以, 当nsqd异常关闭的时候, 没有来得及保存到本地的消息可能会丢失, 解决办法是讲同样的消息发送到两个nsqd中。
这里如何保证消息不丢失的?
nsdlookup 如何路由请求
{
"channels": [ "nsq_to_file", "c" ],
"producers": [
{
"remote_address": "127.0.0.1:58148",
"hostname": "safedev01v.add.corp.qihoo.net",
"broadcast_address": "safedev01v.add.corp.qihoo.net",
"tcp_port": 4150,
"http_port": 4151,
"version": "0.3.6"
},
{
"remote_address": "10.16.59.85:39652",
"hostname": "safedev02v.add.corp.qihoo.net",
"broadcast_address": "safedev02v.add.corp.qihoo.net",
"tcp_port": 4150,
"http_port": 4151,
"version": "0.3.7"
}
]
}
雪崩如何处理
……