nsq

参考文档:
李文周nsq

nsq介绍

NSQ是Go语言编写的一个开源的实时分布式内存消息队列,其性能十分优异。

NSQ的优势有以下优势:
  1. NSQ提倡分布式和分散的拓扑,没有单点故障,支持容错和高可用性,并提供可靠的消息交付保证
  2. NSQ支持横向扩展,没有任何集中式代理。
  3. NSQ易于配置和部署,并且内置了管理界面。
缺点
  1. 消息默认不持久化,可以配置成持久化模式。nsq采用的方式时内存+硬盘的模式,当内存到达一定程度时就会将数据持久化到硬盘。
  •   如果将--mem-queue-size设置为0,所有的消息将会存储到磁盘。
    
  •   服务器重启时也会将当时在内存中的消息持久化。
    
  1. 每条消息至少传递一次。
  2. 消息不保证有序。

应用场景

  1. 异步任务
  2. 应用解耦
  3. 流量削峰
  4. 定时任务

安装

mac直接通过brew安装

brew install nsq

组件

  1. nsqd:消息队列节点,真正提供接受、排队、发送消息的服务;
  2. nsqlookupd:管理和维护nsqd节点,可以理解为nsqd集群;
  3. nsqadmin:nsqlookupd的web管理平台。

启动服务

  1. 启动nsqlookupd,开放端口4161(http)和4160(tcp)
cd /usr/local/bin
./nsqlookupd 

显示结果

[nsqlookupd] 2021/04/27 10:00:46.800332 INFO: nsqlookupd v1.2.0 (built w/go1.13.5)
[nsqlookupd] 2021/04/27 10:00:46.800911 INFO: HTTP: listening on [::]:4161
[nsqlookupd] 2021/04/27 10:00:46.800920 INFO: TCP: listening on [::]:4160
  1. 启动注册nsqd,指定nsqlookupd地址和广播地址(即nsqlookupd查找nsqd节点的地址)
cd /usr/local/bin 
./nsqd -broadcast-address=127.0.0.1 -lookupd-tcp-address=127.0.0.1:4160

显示结果

[nsqd] 2021/04/27 10:02:12.927888 INFO: nsqd v1.2.0 (built w/go1.13.5)
[nsqd] 2021/04/27 10:02:12.929290 INFO: ID: 59
[nsqd] 2021/04/27 10:02:12.930200 INFO: NSQ: persisting topic/channel metadata to nsqd.dat
[nsqd] 2021/04/27 10:02:12.959597 INFO: HTTP: listening on [::]:4151
[nsqd] 2021/04/27 10:02:12.959617 INFO: TCP: listening on [::]:4150
[nsqd] 2021/04/27 10:02:12.959821 INFO: LOOKUP(127.0.0.1:4160): adding peer
[nsqd] 2021/04/27 10:02:12.959828 INFO: LOOKUP connecting to 127.0.0.1:4160
  1. 启动nsqadmin,指定ndqlookupd地址,开放http端口:4171
cd /usr/local/bin
./nsqadmin -lookupd-http-address=127.0.0.1:4161

显示结果

[nsqadmin] 2021/04/27 10:03:17.456356 INFO: nsqadmin v1.2.0 (built w/go1.13.5)
[nsqadmin] 2021/04/27 10:03:17.459248 INFO: HTTP: listening on [::]:4171

在浏览器访问:127.0.0.1:4171

nsq的工作模式

在这里插入图片描述

channel和topic

每个nsqd实例旨在一次处理多个数据流。这些数据流称为“topics”,一个topic具有1个或多个“channels”。每个channel都会收到topic所有消息的副本,实际上下游的服务是通过对应的channel来消费topic消息。

topic和channel不是预先配置的。topic在首次使用时创建,方法是将其发布到指定topic,或者订阅指定topic上的channel。channel是通过订阅指定的channel在第一次使用时创建的。

topic和channel都相互独立地缓冲数据,防止缓慢的消费者导致其他chennel的积压(同样适用于topic级别)。

channel可以并且通常会连接多个客户端。假设所有连接的客户端都处于准备接收消息的状态,则每条消息将被传递到随机客户端。例如:
在这里插入图片描述
总而言之,消息是从topic -> channel(每个channel接收该topic的所有消息的副本)多播的,但是从channel -> consumers均匀分布(每个消费者接收该channel的一部分消息)。

个人理解(如有错误还请指正)

nsqd——>电视;
topics:电视频道;
topic:某个电视频道:CCTV5
channel:CCTV5的某个节目:CBA、NBA、龙舟比赛,用A收看NBA,用户B收看CBA,用户C收看龙舟比赛,即一个用户只能收看一个节目(上面说的每个消息至少专递一次)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值