annidy / notes

0 stars 0 forks source link

nsq in practice #316

Open annidy opened 3 months ago

annidy commented 3 months ago

NSQ处理很快,部署很简单(不需要broker,自带服务发现、管理平台等)。相比其他消息队列,这些点不同 https://nsq.io/overview/features_and_guarantees.html

  1. 消息不保证丢失。nsq的消息都保存在内存,不持久化到磁盘(有选项控制内存大小,超过了可以溢出写到磁盘),如果宕机就丢失了(官方解决方案是nsq_to_file实时备份)
  2. 消息至少处理一次。生产者和消费者都可能因为网络/宕机等因素出现重复消息,客户需要自己做幂等或去重
  3. 消息接收可能乱序。但现实中很少有人做重排
  4. 消费者最终一致性。网络分区不影响nsq的高可用,恢复后会把消费者订阅的消息重新投递

nsqd和nsqlookupd

nsqd是核心守护进程,负责接收、排队、存储和转发消息给客户端。nsqlookupd是服务发现,一般一个大型集群部署3-5台足够,对于单机或有其它协调服务的,不使用nsqlookupd也是可以的。

架构

https://nsq.io/deployment/topology_patterns.html 主题(topics)和通道(channels)是NSQ的基本概念。channels是消息的副本,不同消费这可以有不同的channel。 image channel可以有多个,相同channel会有nsq负载均衡消费。消费可以返回错误,但消息不会重新投递,且会触发指数回避策略

使用

生产者HTTP和TCP都可以,消费者只有TCP。 TCP协议非常简单 https://nsq.io/clients/tcp_protocol_spec.html 因为简单,所以限制了一条TCP只能订阅一个topic

image

REQueing消息表示消费者处理失败,消息被重新投递到队列重新消费