phxQueue的组件模块:

  1. store service: 依赖Paxos 协议作副本同步, 实现消息存储, 通过租约保证master模型
  2. lock service: 为scheduler 选主、consumer-queue的分配
  3. scheduler service: 根据负载调度consumer和queue的映射关系

模型:

  • producer: 生产者
  • consumer: 消费者
  • store: 负责消息/cursor的存储
  • queue: 消息队列
  • paxos-group: 存储的一组集合, 集合中所有的store数据一致.
  • 使用scheduler避免consumer的负载过高, 进行负载均衡

交互上:

producer/consumer使用了rpc方式和broker进行交互, broker的消息存储使用了leveldb, 通过paxos实现内容的一致性.

逻辑层面:

  1. queueId 和 queue的关系比较特殊, queue是一段连续的queueId, queue之间可以进行排序
  2. topic负责部分queue
  3. consumer层通过拉取queue实现消息的拉取

特殊的地方:

  1. 在paxos上进行了大量的优化: broker层的批提交
  2. 相比传统的mq, 添加了consumer层的scheduler: 负载调度

不足:

  1. 开源的版本没有broker负载调度模型, 避免broker负载过重, 相对pulsar欠缺. 怀疑queueId/queue模型是可以切分负载的, qmq有类似的功能.
  2. leveldb可以考虑使用rocksdb, 在review代码的时候, 发现很多针对leveldb的优化.
  3. 开源的版本没有运维的方式说明. 比如 queue的切分, 部署模型

参考文档:

  1. https://github.com/Tencent/phxqueue
  2. https://cloud.tencent.com/developer/article/1005954
  3. https://myslide.cn/slides/1588