Nsq集群介绍
Nsq(Nanosecond Queue)是一个高性能的分布式消息队列系统,旨在提供实时的消息传递和处理能力。以下是对Nsq集群的基本介绍:
基本概念
消息队列:Nsq允许不同的应用程序之间通过异步方式进行通信,发送者将消息发布到队列中,而接收者可以从队列中获取这些消息。
分布式架构:Nsq支持水平扩展,可以在多台机器上运行,以提高系统的可用性和吞吐量。
架构
Producer(生产者):负责将消息发送到Nsq集群。
NSQD:核心组件,负责接收、存储和转发消息。每个NSQD实例可以独立工作,也可以组成集群。
Consumer(消费者):订阅特定主题,从NSQD中获取并处理消息。
NSQ Lookup Daemon(nsqlookupd):用于服务发现,帮助消费者找到可用的NSQD实例。
工作原理
生产者将消息发送到指定主题的NSQD实例。
NSQD将收到的消息存储在内存或磁盘中,并根据配置进行持久化。
消费者通过nsqlookupd查询可用的NSQD实例,并订阅感兴趣的主题。
NSQD向消费者推送新到达的消息,消费者处理完后确认收到。
部署与管理
Nsqd和nsqlookupd可以在同一台机器上运行,也可以分开部署以适应不同规模的需求。
可以使用Docker等容器技术简化部署过程,并利用监控工具来观察系统性能和健康状态。
集群IP示例
Nsq集群的优缺点
优点:
部署简单:
NSQ 的部署非常便捷,不需要复杂的依赖环境,直接启动即可使用,且配置简单。
性能高:
具有极高的吞吐量和低延迟,适合实时消息处理场景。
支持分布式与去中心化:
设计支持分布式和去中心化,没有单点故障(Single Point of Failure, SPOF)的问题,具备高容错和高可用性。
轻量化:
不需要庞大的硬件资源,能够快速扩展,满足水平扩展需求。
消息可靠性保证:
通过多实例的方式保证消息的可靠传递,通常不会丢失消息。
开发者友好:
基于 Go语言开发,易于与微服务架构集成。
缺点:
消费者侧的流控问题:
在消费者端,流量控制能力较弱,处理复杂场景可能需要额外的开发支撑。
批处理支持不足:
在进行大数据需求场景时,NSQ 对批量处理支持较弱,不太适合批量消息推送。
消息追踪和监控相对不足:
没有提供开箱即用的监控和诊断工具,难以追踪具体的消息流向。
社区活跃度和扩展支持:
与如 Kafka 这样的热门消息队列相比,社区资源和第三方工具支持略显不足。
部署前置服务*Docker
部署所在服务器:
master
slave
arbiter
导入镜像
部署所在服务器:
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集群的优缺点有助于在实际项目中做出更明智的技术选择。在选择消息队列解决方案时,应根据具体需求权衡这些优缺点,以确保所选技术能够有效支持业务目标。