通过docker实现nsq高可用

本文介绍了如何在两台机器上使用Docker部署NSQ服务,包括nsqlookupd(服务发现)、nsqd(消息队列节点)和nsqadmin(管理界面)。每台机器上都启动了nsqlookupd和nsqd,通过指定广播地址和lookupd地址实现集群注册和通信。此外,还展示了生产者和消费者的示例代码,以及服务的自动重启机制,确保消息的可靠传递和系统的高可用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

准备工作

  • 准备2台机器
  • 192.168.1.21 A机器
  • 192.168.1.22 B机器

概念

nsqlookupd 相当于服务发现,我们不同的机器上的nsqd需要注册到服务发现,并带上nsqd的ip地址,端口默认使用的4150,通过这样实现负载和高可用

如果有多个nsqd。广播地址(–broadcast-address)需要填写多个,

#启动

  • 注意nsqd的端口最好保持默认端口,如果不写会默认使用公网ip

一台机器上启动nsqlookupd,和nsqd

version: '3'
services:
  nsqlookupd:
    container_name: nsqlookupd
    image: nsqio/nsq
    command: /nsqlookupd
    restart: always
    ports:
      - "4160:4160"
      - "4161:4161"
  nsqd:
    container_name: nsqd
    image: nsqio/nsq
    command: /nsqd --lookupd-tcp-address=nsqlookupd:4160 -lookupd-tcp-address=192.168.1.22:4160 --broadcast-address=192.168.1.22
    depends_on:
      - nsqlookupd
    restart: always
    ports:
      - "4150:4150"
      - "4151:4151"
  nsqadmin:
    container_name: nsqadmin
    image: nsqio/nsq
    command: /nsqadmin --lookupd-http-address=nsqlookupd:4161
    depends_on:
      - nsqlookupd
    restart: always
    ports:
      - "32787:4171"

另一台机器上同样的配置

version: '3'
services:
  nsqlookupd:
    container_name: nsqlookupd
    image: nsqio/nsq
    command: /nsqlookupd
    restart: always
    ports:
      - "4160:4160"
      - "4161:4161"
  nsqd:
    container_name: nsqd
    image: nsqio/nsq
    command: /nsqd --lookupd-tcp-address=192.168.1.22:4160 --lookupd-tcp-address=nsqlookupd:4160 --broadcast-address=192.168.1.21
    restart: always
    ports:
      - "4150:4150"
      - "4151:4151"
  nsqadmin:
    container_name: nsqadmin
    image: nsqio/nsq
    command: /nsqadmin --lookupd-http-address=nsqlookupd:4161
    depends_on:
      - nsqlookupd
    restart: always
    ports:
      - "4171:4171"

PS:

  • 两台机器上的nsqd注册本机的nsqlookup和另一台机器上的nsqlookupd
  • 如果使用的是docker-compose up启动,因为启动自己这台机器上的服务的时候另外一台机器的nsqlookupd肯定是停止的,所以会连接不上另一台的nsqlookuod,在另一台的docker启动好后,需要手动启动下docker restart nsqd

client

生产者
const nsq = require(‘nsqjs’)

const w = new nsq.Writer(‘192.168.1.22’, 4150)

w.connect()

w.on(‘ready’, () => {
w.publish(‘sample_topic’, ‘it really tied the room together’)
w.deferPublish(‘sample_topic’, [‘This message gonna arrive 1 sec later.’], 1000)
w.publish(‘sample_topic’, [
‘Uh, excuse me. Mark it zero. Next frame.’,
'Smokey, this is not ‘Nam. This is bowling. There are rules.’
])
w.publish(‘sample_topic’, ‘Wu?’, err => {
if (err) { return console.error(err.message) }
console.log(‘Message sent successfully’)
w.close()
})
})

w.on(‘closed’, () => {
console.log(‘Writer closed’)
})
消费者
const nsq = require(‘nsqjs’)

try{
const reader = new nsq.Reader(‘sample_topic’, ‘test_channel’, {
lookupdHTTPAddresses: ‘192.168.1.21:4161’,
})

reader.connect();

reader.on(‘message’,async msg => {
console.log(‘Received message [%s]: %s’, msg.id, msg.body.toString())
msg.finish()
})

} catch( error ){
console.log(error);
}

自动重启

干掉nsq进程后,docker会自动重启nsq,测试发现消费者会在10-30秒内消费还没有处理完的消息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

死磕音视频

你的打赏是我分享的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值