消息队列|nsq
Fang 2024/11/8 后端消息队列
# nsq
# 特点
- 基于内存的消息队列
- 分布式和去中心化拓扑结构,无单点故障
- 可以处理极大的数据量
# 应用场景
- 异步处理,非关键流程已不画。提高系统的响应时间和健壮性
- 应用解耦,订阅订单系统
- 流量削峰,根据规则读取秒杀请求
# 架构和原理
# 消息队列成员
- nsqd,负责消息接收,保存以及发送消息给消费者的进程
- nsqlookup,负责维护所有nsqd的状态,提供服务发现的进程
- nsqadmin,web管理平台,试试监控集群以及执行各种管理任务
# 消息队列中的概念
- Topic概念,对应一个具体的队列,比如订单数据放到order_queue这个topic
- Channel概念,每个消费者对应一个channel。实现消息可重复消费
# 实现消息队列的消费
一个队列A可以有多个通道1、2、3,一个通道可以有多个消费者a、b、c。
# 特性
- 消息默认不持久化,可以配置成持久化
- 每条消息至少传递一次
- 消息不保证有序
# 接收和发送消息流程
input Chan -> in-Memory Chan-> output Chan disk Memory
如果内存满了,会存到磁盘中
# 搭建以及使用
要在 Docker 上安装并启动 NSQ 消息队列,你需要使用 docker-compose
或者直接通过 docker
命令来运行 NSQ 的容器。下面是如何使用 Docker 来部署 NSQ 的步骤。
# 步骤 1: 使用 docker-compose
部署 NSQ
NSQ 是由多个组件组成的消息队列系统,通常包括 nsqd、nsqlookupd 和 nsqadmin。以下是一个简单的 docker-compose.yml
文件,可以用来启动这些组件。
# 1.1 创建 docker-compose.yml
文件
在项目目录下创建一个名为 docker-compose.yml
的文件,内容如下:
version: '3'
services:
nsqlookupd:
image: nsqio/nsq
container_name: nsqlookupd
ports:
- "4160:4160" # nsqlookupd HTTP 服务
- "4161:4161" # nsqlookupd TCP 服务
command: /nsqlookupd
restart: always
nsqd:
image: nsqio/nsq
container_name: nsqd
ports:
- "4150:4150" # nsqd TCP 服务
- "4151:4151" # nsqd HTTP 服务
command: /nsqd --lookupd-tcp-address=nsqlookupd:4160 -lookupd-tcp-address=x x:4160 --broadcast-address=xx.xx.xx.xx # 增加address,防止容器名变成host名
depends_on:
- nsqlookupd
restart: always
nsqadmin:
image: nsqio/nsq
container_name: nsqadmin
ports:
- "4171:4171" # nsqadmin HTTP 服务
command: /nsqadmin --lookupd-http-address=nsqlookupd:4161
depends_on:
- nsqlookupd
restart: always
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 1.2 启动服务
在 docker-compose.yml
文件所在目录打开终端,执行以下命令来启动 NSQ 服务:
docker-compose up -d
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cccc1a29501d nsqio/nsq "/nsqadmin --lookupd…" 18 seconds ago Up 17 seconds 4150-4151/tcp, 4160-4161/tcp, 4170/tcp, 0.0.0.0:4171->4171/tcp, :::4171->4171/tcp nsqadmin
1b23d7df5580 nsqio/nsq "/nsqd --lookupd-tcp…" 18 seconds ago Up 17 seconds 4160-4161/tcp, 0.0.0.0:4150-4151->4150-4151/tcp, :::4150-4151->4150-4151/tcp, 4170-4171/tcp nsqd
57301e25354b nsqio/nsq "/nsqlookupd" 19 seconds ago Up 17 seconds 4150-4151/tcp, 4170-4171/tcp, 0.0.0.0:4160-4161->4160-4161/tcp, :::4160-4161->4160-4161/tcp nsqlookupd
1
2
3
4
5
2
3
4
5
这将会在后台启动 nsqlookupd
、nsqd
和 nsqadmin
三个容器。
- nsqlookupd:负责服务发现,NSQD 通过它来发现其他节点。
- nsqd:消息队列的核心,负责消息的接收、存储和分发。
- nsqadmin:Web 管理界面,可以通过浏览器访问它来查看队列状态、消息消费等信息。
# 1.3 访问 Web 管理界面
- NSQ Admin UI:可以通过浏览器访问
http://xx.xx.xx.xx:4171
来访问 NSQ 的 Web 管理界面。 - NSQD HTTP 接口:可以通过
http://xx.xx.xx.xx:4151
来访问 NSQD 提供的 HTTP 接口,用于管理队列等操作。
# 步骤 2: 使用 Docker 命令单独启动 NSQ
如果你不想使用 docker-compose
,你也可以单独使用 Docker 命令来启动 NSQ 服务。下面是使用 Docker 启动 nsqlookupd
、nsqd
和 nsqadmin
的命令。
# 2.1 启动 nsqlookupd
docker run -d --name nsqlookupd -p 4160:4160 -p 4161:4161 nsqio/nsq /nsqlookupd
1
# 2.2 启动 nsqd
docker run -d --name nsqd -p 4150:4150 -p 4151:4151 --link nsqlookupd:nsqlookupd nsqio/nsq /nsqd --lookupd-tcp-address=nsqlookupd:4160
1
# 2.3 启动 nsqadmin
docker run -d --name nsqadmin -p 4171:4171 --link nsqlookupd:nsqlookupd nsqio/nsq /nsqadmin --lookupd-http-address=nsqlookupd:4161
1
# 步骤 3: 测试 NSQ 服务
你可以使用 NSQ 提供的工具或者自己编写程序来测试消息的发布和消费。
发布消息: 使用
nsq_pub
命令(NSQ 的命令行工具),你可以发布一条消息到nsqd
:echo -n "Hello, NSQ!" | nc -q 1 xx.xx.xx.xx 4150
1这条命令会把消息
Hello, NSQ!
发布到nsqd
服务。消费消息: 使用
nsq_sub
命令来订阅并消费消息:nc -lk 4150 | nsq_sub -t my_topic -c my_channel -addr xx.xx.xx.xx:4150
1
# 步骤 4: 停止和删除容器
如果你不再需要运行这些容器,可以使用以下命令停止并删除它们:
docker-compose down
1
或者,单独删除容器:
docker stop nsqlookupd nsqd nsqadmin
docker rm nsqlookupd nsqd nsqadmin
1
2
2
# 总结
- 使用
docker-compose
是部署多个容器(如nsqlookupd
、nsqd
和nsqadmin
)的最佳方式,可以通过单个文件管理所有服务。 - 也可以使用 Docker 命令分别启动每个组件。
- 使用 Web 界面
http://xx.xx.xx.xx:4171
监控和管理 NSQ 服务。