NSQ是Go语言编写的,开源的分布式消息队列中间件,其设计的目的是用来大规模地处理每天数以十亿计级别的消息。NSQ 具有分布式和去中心化拓扑结构,该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征,是一个成熟的、已在大规模生成环境下应用的产品。
nsq组件
nsqd
单个nsqd实例可以用来树立多个数据流。
topic
数据流也叫topic, 一个topic可以有多个channel。
channel
每一个channel都接收该topic下面的所有消息,然后发送给消费者。channel会均匀的发送消息给消费者,不重复消费。
Topics and channels 都没有优先级,topic在两种情况下会被使用到,在发送数据到一该topic时候首次使用,或者有消费者订阅该topic下的某个channel时候。channel在有消费者订阅了该channle的时候使用。
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/032d9799b5d56ad0823e9c8c83423512.gif)
nsqlookupd
这是一个辅助应用,启动目录服务保存着nsqd的地址,consumer可以通过nsqlookupd查询到它消费的channel、topic对应的nsqd服务。consumer不需要了解producer的信息。
nsqadmin
提供了一个webUI,我们可以查询到topics/channels/consumers这些信息,便于监管。
nsq消息传递确保
nsq可以确保发送过来的消息至少被一个消费者消费;为了确保消息消费,重复消费是不可避免的。nsq通过以下来确保消息消费
- 客户端表示它们可以接收消息
- NSQ发送消息,暂时将消息存在本地
- 客户端回复FIN 或者 REQ 表示成功或者重发。如果客户端未能及时发送,则NSQ将重复发送消息给该客户端。
nsq的安装使用(mac)
安装: brew install nsq
使用(命令行):
启动
在一个shell中:nsqlookupd
另一个shell中:nsqd –lookupd-tcp-address=127.0.0.1:4160
第三个shell中:nsqadmin –lookupd-http-address=127.0.0.1:4161
发送接收
curl -d ‘hello world 1’ ‘http://127.0.0.1:4151/pub?topic=test’ //发送消息