Reborn's Blog

消息中间件学习记录1

2018-11-16·Message Queue, NSQ, Distributed Systems

为什么使用消息中间件?

实现解耦缓冲功能。

NSQ 架构

以购物系统为例:

  1. 订单系统创建订单后,往队列 push 一条 topic 为 "create order" 的消息
  2. NSQ 将消息推送给订阅了相关 topic 的机器
  3. 通过队列实现各服务系统之间的解耦和缓冲

NSQ 核心模块

  • nsq:存储消息,每个 topic 可有多个 channel
  • nsqlookup:服务发现模块,记录 topic、channel 及其订阅的消费者
  • nsqadmin:可视化管理 Web UI

Channel 是消费者订阅时自动创建的(topic 需手动创建)。

实现细节

  1. 消息至少投递一次:成功返回 FIN,失败返回 REQ,超时 requeue
  2. 重试次数:通过 attempts 字段判断
  3. 消息是无序的
  4. Push 方式推送:保证实时性。消息存在内存中,超过 memqueue-size 持久化到磁盘
  5. 流量控制:通过 rdy_count 字段控制是否继续推送

消息中间件设计要点

  • 必须能够集群,可扩展性强,性能好,可靠性高
  • 关键特性:消息投递策略、消息时序性、推送方式(push/pull)、存储方式(内存/磁盘)
#Message Queue#NSQ#Distributed Systems