消息队列|nsq

2024/11/8 后端消息队列

# nsq

# 特点

  1. 基于内存的消息队列
  2. 分布式和去中心化拓扑结构,无单点故障
  3. 可以处理极大的数据量

# 应用场景

  1. 异步处理,非关键流程已不画。提高系统的响应时间和健壮性
  2. 应用解耦,订阅订单系统
  3. 流量削峰,根据规则读取秒杀请求

# 架构和原理

# 消息队列成员

  1. nsqd,负责消息接收,保存以及发送消息给消费者的进程
  2. nsqlookup,负责维护所有nsqd的状态,提供服务发现的进程
  3. nsqadmin,web管理平台,试试监控集群以及执行各种管理任务

# 消息队列中的概念

  1. Topic概念,对应一个具体的队列,比如订单数据放到order_queue这个topic
  2. Channel概念,每个消费者对应一个channel。实现消息可重复消费

# 实现消息队列的消费

一个队列A可以有多个通道1、2、3,一个通道可以有多个消费者a、b、c。

# 特性

  1. 消息默认不持久化,可以配置成持久化
  2. 每条消息至少传递一次
  3. 消息不保证有序

# 接收和发送消息流程

input Chan -> in-Memory Chan-> output Chan disk Memory

如果内存满了,会存到磁盘中

# 搭建以及使用

要在 Docker 上安装并启动 NSQ 消息队列,你需要使用 docker-compose 或者直接通过 docker 命令来运行 NSQ 的容器。下面是如何使用 Docker 来部署 NSQ 的步骤。

# 步骤 1: 使用 docker-compose 部署 NSQ

NSQ 是由多个组件组成的消息队列系统,通常包括 nsqdnsqlookupdnsqadmin。以下是一个简单的 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

# 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

这将会在后台启动 nsqlookupdnsqdnsqadmin 三个容器。

  • 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 启动 nsqlookupdnsqdnsqadmin 的命令。

# 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 提供的工具或者自己编写程序来测试消息的发布和消费。

  1. 发布消息: 使用 nsq_pub 命令(NSQ 的命令行工具),你可以发布一条消息到 nsqd

    echo -n "Hello, NSQ!" | nc -q 1 xx.xx.xx.xx 4150
    
    1

    这条命令会把消息 Hello, NSQ! 发布到 nsqd 服务。

  2. 消费消息: 使用 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

# 总结

  • 使用 docker-compose 是部署多个容器(如 nsqlookupdnsqdnsqadmin)的最佳方式,可以通过单个文件管理所有服务。
  • 也可以使用 Docker 命令分别启动每个组件。
  • 使用 Web 界面 http://xx.xx.xx.xx:4171 监控和管理 NSQ 服务。
Last Updated: 2025/4/23 16:12:19