Dawn's Blogs

分享技术 记录成长

0%

LMQ实现 (2) 整体设计

本项目地址:LMQ

LMQ 与 NSQ 的整体设计类似。

介绍

特性

LMQ 是分布式的消息队列,特性为:

  • 支持无单点故障的分布式拓扑。
  • 无缝的支持水平扩展,无缝的添加更多节点到集群。
  • 主要是在内存中传递消息,直接使用 TCP 协议而不是 HTTP 协议,所以性能可以保障。
  • 客户端发现的方式,通过查询 LmqLookup 找到生产者。

消息保证

消息不持久化机制

LMQ 支持内存队列磁盘队列,超过内存队列长度的消息会被存放在磁盘队列中。在内存队列中的消息可能因为宕机而丢失,存储在磁盘中的消息不会丢失。

可以通过设置内存队列长度为 0,所有的消息将会存储到磁盘,这样消息不会丢失

在正常推出的情况下,内存中的消息会被推送至磁盘队列中,在磁盘中保存持久化,元数据信息以 json 的格式进行持久化。

消息最少被投递一次

由于客户端超时导致的消息重新排队等原因,消息会被重复投递,消息通过 ID 区分,由客户端负责操作。

消息是无序的

LMQ 不保证消息的投递顺序和生产顺序是一致的。因为 LMQ 由内存队列、磁盘队列、重排队列混合组成,所以消息是无序的。

架构设计

LMQ 包括两个守护进程:

  • Lmqd:接受消息,并把消息传送到客户端的守护进程。
  • lmqlookup:管理 nsqd 的拓扑信息,提供了最终一致发现服务的守护进程。

Lmqd

单个 lmqd 可以有很多的话题,每个话题可以有多通道。每一个通道都会收到话题的所有消息的副本,并且随机的选择一个消费者发送消息,以此实现负载均衡

nsqd clients

Lookup

lookup 提供一个目录服务,消费者可以查找到提供他们感兴趣订阅话题的 lmqd 地址。

每一个 lmqd 维护一个与 lookup 的 TCP 长连接,定期推送状态,这个状态用于供消费者查询 lmqd 的地址。

img

分布式

LMQ 以分布式的方式被使用,客户端通过查询 lookup 查询,连接到指定话题的所有 lmqd 实例

对于 lookup,高可用性是通过运行多个实例来实现。他们不直接相互通信,数据被认为是最终一致

nsq clients