nsq

名词解释

topic: 主题,数据流,消息都是写到某个topic下。
channel: 通道。每个 topic 都有多个通道。消息会从 topic 拷贝到每一个通道中。消息是从topic通过多播的方式到channel(每个channel接收topic全部消息的拷贝),平均地从channel分发到consumers。 channel与消费者相关,是消费者之间的负载均衡,channel在某种意义上来说是一个“队列”。每当一个发布者发送一条消息到一个topic,消息会被复制到所有消费者连接的channel上,消费者通过这个特殊的channel读取消息,实际上,在消费者第一次订阅时就会创建channel。Channel会将消息进行排列,如果没有消费者读取消息,消息首先会在内存中排队,当量太大时就会被保存到磁盘中。
Topic Message Queue: topic 的消息队列
Channel Message Queues: 通道的 消息队列 每个channel的消息都会进行排队,直到一个worker把他们消费,如果此队列超出了内存限制,消息将会被写入到磁盘中.一个通道一般会有多个客户端连接。假设所有已连接的客户端处于准备接收消息的状态,每个消息将被传递到一个随机的客户端。

生产者(Producer):负责产生消息
消息代理(Message Broker):负责存储/转发消息(转发分为推和拉两种,拉是指Consumer主动从Message Broker获取消息,推是指Message Broker主动将Consumer感兴趣的消息推送给Consumer)
消费者(Consumer):负责消费消息

组件

nsql: nsqd 是一个守护进程,负责接收,排队,投递消息给客户端。它在 2 个 TCP 端口监听,一个给客户端,另一个是 HTTP API。同时,它也能在第三个端口监听 HTTPS。
nsqlookupd 是守护进程负责管理拓扑信息。客户端通过查询 nsqlookupd 来发现指定话题(topic)的生产者,并且 nsqd 节点广播话题(topic)和通道(channel)信息。有两个接口:TCP 接口,nsqd 用它来广播。HTTP 接口,客户端用它来发现和管理。 nsqadmin 是一套 WEB UI,用来汇集集群的实时统计,并执行不同的管理任务。

nsq

注意,一般我们看到的消息队列是这样的:
broker

而 nsq 是无 broker 设计,没有中间人,没有消息代理,也没有单点故障。 这种拓扑结构消除单链,聚合,反馈。相反,你的消费者直接访问所有生产者。从技术上讲,哪个客户端连接到哪个 NSQ 不重要,只要有足够的消费者连接到所有生产者,以满足大量的消息,保证所有东西最终将被处理。

实践

brew install nsq
nsqlookupd
nsqld --lookupd-tcp-address=127.0.0.1:4160
nsqadmin --lookupd-http-address=127.0.0.1:4161
#publish
curl -d 'hello world 1' 'http://127.0.0.1:4151/pub?topic=test'
#concume
nsq_to_file --topic=test --output-dir=/tmp --lookupd-http-address=127.0.0.1:4161

«« use proxy 杂文 »»