准备工作
- 准备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秒内消费还没有处理完的消息