Nsq集群介绍

Nsq(Nanosecond Queue)是一个高性能的分布式消息队列系统,旨在提供实时的消息传递和处理能力。以下是对Nsq集群的基本介绍:

基本概念

  • 消息队列:Nsq允许不同的应用程序之间通过异步方式进行通信,发送者将消息发布到队列中,而接收者可以从队列中获取这些消息。

  • 分布式架构:Nsq支持水平扩展,可以在多台机器上运行,以提高系统的可用性和吞吐量。

架构

  • Producer(生产者):负责将消息发送到Nsq集群。

  • NSQD:核心组件,负责接收、存储和转发消息。每个NSQD实例可以独立工作,也可以组成集群。

  • Consumer(消费者):订阅特定主题,从NSQD中获取并处理消息。

  • NSQ Lookup Daemon(nsqlookupd):用于服务发现,帮助消费者找到可用的NSQD实例。

工作原理

  1. 生产者将消息发送到指定主题的NSQD实例。

  2. NSQD将收到的消息存储在内存或磁盘中,并根据配置进行持久化。

  3. 消费者通过nsqlookupd查询可用的NSQD实例,并订阅感兴趣的主题。

  4. NSQD向消费者推送新到达的消息,消费者处理完后确认收到。

部署与管理

  • Nsqd和nsqlookupd可以在同一台机器上运行,也可以分开部署以适应不同规模的需求。

  • 可以使用Docker等容器技术简化部署过程,并利用监控工具来观察系统性能和健康状态。



集群IP示例

集群关系

服务地址

master

192.168.1.1

slave

192.168.1.2

arbiter

192.168.1.3


Nsq集群的优缺点

优点:

  • 部署简单:

    • NSQ 的部署非常便捷,不需要复杂的依赖环境,直接启动即可使用,且配置简单。

  • 性能高:

    • 具有极高的吞吐量和低延迟,适合实时消息处理场景。

  • 支持分布式与去中心化:

    • 设计支持分布式和去中心化,没有单点故障(Single Point of Failure, SPOF)的问题,具备高容错和高可用性。

  • 轻量化:

    • 不需要庞大的硬件资源,能够快速扩展,满足水平扩展需求。

  • 消息可靠性保证:

    • 通过多实例的方式保证消息的可靠传递,通常不会丢失消息。

  • 开发者友好:

    • 基于 Go语言开发,易于与微服务架构集成。

缺点:

  • 消费者侧的流控问题:

    • 在消费者端,流量控制能力较弱,处理复杂场景可能需要额外的开发支撑。

  • 批处理支持不足:

    • 在进行大数据需求场景时,NSQ 对批量处理支持较弱,不太适合批量消息推送。

  • 消息追踪和监控相对不足:

    • 没有提供开箱即用的监控和诊断工具,难以追踪具体的消息流向。

  • 社区活跃度和扩展支持:

    • 与如 Kafka 这样的热门消息队列相比,社区资源和第三方工具支持略显不足。


部署前置服务*Docker


导入镜像

  • 部署所在服务器:master slave arbiter

docker load < nsq.tar

创建数据文件夹

  • 部署所在服务器:master slave arbiter

mkdir -p /docker/docker/nsq/{data,conf,log}

启动lookupd组件

  • 部署所在服务器:master

docker run -d --name lookupd -p 4160:4160 --privileged=true  -p 4161:4161 --restart=always -v /etc/hosts:/etc/hosts nsqio/nsq:v1.2.1 /nsqlookupd -http-address 0.0.0.0:4161 -tcp-address 0.0.0.0:4160 -broadcast-address 192.168.1.1
  • 部署所在服务器:slave

docker run -d --name lookupd -p 4160:4160 --privileged=true  -p 4161:4161 --restart=always -v /etc/hosts:/etc/hosts nsqio/nsq:v1.2.1 /nsqlookupd -http-address 0.0.0.0:4161 -tcp-address 0.0.0.0:4160 -broadcast-address 192.168.1.2

命令解析

  • docker run: 这是 Docker 命令,用于创建并运行一个新的容器。

  • -d: 这个选项表示以“分离模式”运行容器,也就是说容器在后台运行。

  • --name lookupd: 这部分指定了容器的名称为 lookupd,方便后续对该容器进行管理。

  • -p 4160:4160: 这个选项将容器的 4160 端口映射到主机的 4160 端口。这样,主机上的应用可以通过访问 localhost:4160 来与容器内的服务进行通信。

  • --privileged=true: 这个选项赋予容器额外的权限,使其能够执行某些特权操作。

  • -p 4161:4161: 这个选项将容器的 4161 端口映射到主机的 4161 端口,类似于第 4 步的端口映射。

  • --restart=always: 这个选项设置容器在停止后自动重启,确保服务的高可用性。

  • -v /etc/hosts:/etc/hosts: 这个选项将主机的 /etc/hosts 文件挂载到容器的 /etc/hosts 文件。这样,容器内的应用可以访问主机的 hosts 文件中的映射。

  • nsqio/nsq:v1.2.1: 这是要使用的 Docker 镜像的名称和版本号。

  • /nsqlookupd: 这是容器启动后执行的命令,表示要运行 NSQ 的 lookupd 服务。

  • -http-address 0.0.0.0:4161: 这个参数指定 lookupd 服务的 HTTP 地址和端口,0.0.0.0 表示监听所有网络接口。

  • -tcp-address 0.0.0.0:4160: 这个参数指定 lookupd 服务的 TCP 地址和端口,类似于 HTTP 地址,监听所有网络接口。

  • -broadcast-address 192.168.1.1: 这个参数指定 lookupd 的广播地址,通常用于在网络中发现服务。


启动Nsqd组件

  • 部署所在服务器:master

docker run -d --name nsqd -p 4150:4150 --privileged=true -p 4151:4151 --restart=always -v /etc/hosts:/etc/hosts -v /docker/docker/nsq/data:/usr/local/nsq/bin/data  nsqio/nsq:v1.2.1 /nsqd -tcp-address 0.0.0.0:4150 -data-path /usr/local/nsq/bin/data --http-address 0.0.0.0:4151 -lookupd-tcp-address 192.168.1.1:4160 -lookupd-tcp-address 192.168.1.2:4160 -broadcast-address 192.168.1.1
  • 部署所在服务器:slave

docker run -d --name nsqd -p 4150:4150 --privileged=true -p 4151:4151 --restart=always -v /etc/hosts:/etc/hosts -v /docker/docker/nsq/data:/usr/local/nsq/bin/data  nsqio/nsq:v1.2.1 /nsqd -tcp-address 0.0.0.0:4150 -data-path /usr/local/nsq/bin/data --http-address 0.0.0.0:4151 -lookupd-tcp-address 192.168.1.1:4160 -lookupd-tcp-address 192.168.1.2:4160 -broadcast-address 192.168.1.2

命令解析

  • docker run: 这是 Docker 命令,用于创建并运行一个新的容器。

  • -d: 这个选项表示以“分离模式”运行容器,即容器在后台运行。

  • --name nsqd: 这部分指定了容器的名称为 nsqd,方便后续对该容器进行管理。

  • -p 4150:4150: 这个选项将容器的 4150 端口映射到主机的 4150 端口。主机上的应用可以通过访问 localhost:4150 来与容器内的服务进行通信。

  • --privileged=true: 这个选项赋予容器额外的权限,使其能够执行某些特权操作。

  • -p 4151:4151: 这个选项将容器的 4151 端口映射到主机的 4151 端口,类似于第 4 步的端口映射。

  • --restart=always: 这个选项设置容器在停止后自动重启,确保服务的高可用性。

  • -v /etc/hosts:/etc/hosts: 这个选项将主机的 /etc/hosts 文件挂载到容器的 /etc/hosts 文件。这样,容器内的应用可以访问主机的 hosts 文件中的映射。

  • -v /docker/docker/nsq/data:/usr/local/nsq/bin/data: 这个选项将主机的 /docker/docker/nsq/data 目录挂载到容器的 /usr/local/nsq/bin/data 目录。这样,容器内的数据可以持久化到主机上,避免容器重启或删除时丢失数据。

  • nsqio/nsq:v1.2.1: 这是要使用的 Docker 镜像的名称和版本号。

  • /nsqd: 这是容器启动后执行的命令,表示要运行 NSQ 的 nsqd 服务。

  • -tcp-address 0.0.0.0:4150: 这个参数指定 nsqd 服务的 TCP 地址和端口,0.0.0.0 表示监听所有网络接口。

  • -data-path /usr/local/nsq/bin/data: 这个参数指定 nsqd 服务数据存储的路径,数据将被存储在容器内的 /usr/local/nsq/bin/data 目录。

  • --http-address 0.0.0.0:4151: 这个参数指定 nsqd 服务的 HTTP 地址和端口,0.0.0.0 表示监听所有网络接口,HTTP API 将在 4151 端口提供服务。

  • -lookupd-tcp-address 192.168.1.1:4160: 这个参数指定 nsqd 要连接的 lookupd 服务的 TCP 地址,通常用于发现可用的消息队列。

  • -lookupd-tcp-address 192.168.1.2:4160: 这个参数指定另一个 lookupd 服务的 TCP 地址,允许 nsqd 连接到多个 lookupd 实例以实现高可用性。

  • -broadcast-address 192.168.1.2: 这个参数指定 nsqd 的广播地址,通常用于在网络中发现服务。


启动Nsqadmin组件

  • 部署所在服务器:arbiter

docker run -d --name nsqadmin --privileged=true -p 4171:4171 --restart=always -v /etc/hosts:/etc/hosts nsqio/nsq:v1.2.1 /nsqadmin --lookupd-http-address 192.168.1.1:4160 -lookupd-http-address 192.168.1.2:4160

总结

了解Nsq集群的优缺点有助于在实际项目中做出更明智的技术选择。在选择消息队列解决方案时,应根据具体需求权衡这些优缺点,以确保所选技术能够有效支持业务目标。