开源最前线(ID:OpenSourceTop) 猿妹 整编
综合自:微信后台团队
本期是新开源报道第 3 期,本期我们要报道的新开源软件 PhxQueue
今日,微信后台团队又一力作开源——PhxQueue。PhxQueue 是一个基于Paxos协议的分布式队列,目前已经在微信内部广泛支持微信支付、公众平台等多个重要业务。
分布式队列 PhxQueue
授权协议:BSD
开发语言:C/C++
操作系统:跨平台
开发厂商:腾讯
Github:https://github.com/Tencent/phxqueue 
PhxQueue 介绍
PhxQueue 目前在微信内部广泛支持微信支付、公众平台等多个重要业务,日均入队达千亿,分钟入队峰值达一亿。其设计出发点是高数据可靠性,且不失高可用和高吞吐,同时支持多种常见队列特性。
PhxQueue 特性
● PhxQueue特性
● 同步刷盘,入队数据绝对不丢,自带内部实时对账
● 出入队严格有序
● 多订阅
● 出队限速
● 出队重放
● 所有模块均可平行扩展
● 存储层批量刷盘、同步,保证高吞吐
● 存储层支持同城多中心部署
● 存储层自动容灾/接入均衡
● 消费者自动容灾/负载均衡
PhxQueue 架构
整体架构
PhxQueue 由下列5个模块组成:
① Store - 队列存储
Store 作为队列存储,引入了 PhxPaxos 库,以 Paxos 协议作副本同步。只要多数派节点正常工作及互联,即可提供线性一致性读写服务。
为了提高数据可靠性,同步刷盘作为默认开启特性,且性能不亚于异步刷盘。
在可用性方面,Store 内有多个独立的 paxos group,每个 paxos group 仅 master 提供读写服务,平时 master 动态均匀分布在 Store 内各节点,均衡接入压力,节点出灾时自动切换 master 到其它可用节点。
② Producer - 生产者
Producer 作为消息生产者,根据 key 决定消息存储路由。相同 key 的消息默认路由到同一个队列中,保证出队顺序与入队顺序一致。
③ Consumer - 消费者
Consumer 作为消费者,以批量拉取的方式从 Store 拉消息,支持多协程方式批量处理消息。
Consumer 以服务框架的形式提供服务,使用者以实现回调的方式,根据不同主题(Topic),不同处理类型(Handler)定义具体的消息处理逻辑。
④ Scheduler - 消费者管理器(可选择部署)
Scheduler 的作用是,收集 Consumer 全局负载信息, 对 Consumer 做容灾和负载均衡。当使用者没有这方面的需求时,可以省略部署 Scheduler,此时各 Consumer 根据配置权重决定与队列的处理关系。
部署 Scheduler 后,Scheduler leader 与所有 Conusmer 维持心跳,在收集 Consumer 的负载信息的同时,反向调整 Consumer 与队列的处理关系。
当 Scheduler leader 宕机了后,Scheduler 依赖下述分布式锁服务选举出新 leader,不可用期间仅影响 Consumer 的容灾和负载均衡,不影响 Consumer 的正常消费。
⑤ Lock - 分布式锁(可选择部署)
Lock 是一个分布式锁,其接口设计非常通用化,使用者可以选择将 Lock 独立部署,提供通用分布式锁服务。Lock 在 PhxQueue 中的作用有如下两点:
● 为 Scheduler 选举 leader;

● 防止多个 Consumer 同时处理一条队列。
Lock 同样也是可选择部署的模块:若部署了 Scheduler,就必须部署 Lock 为 Scheduler 选举出 leader;否则,若业务对重复消费不敏感,可选择不部署 Lock
小结
PhxQueue 在存储层做了很多的努力:实现了 master 自动切换,且仍然保证线性一致,切换期间仍然高可用;保证了同步刷盘的吞吐,其性能不亚于异步刷盘。另外实现了大部分队列实用特性,例如出入队顺序一致、多订阅、限速、消息重放等,适用于各种业务场景。
目前 PhxQueue 已在微信内部大规模使用,也正式开源。微信官方表示将保持 PhxQueue 开源版本与内部版本的一致,欢迎读者试用并反馈意见。
附:新开源报道汇总

●本文编号28,以后想阅读这篇文章直接输入28即可
●输入m获取文章目录
↓↓↓ 点击"阅读原文" 进入GitHub详情页  
继续阅读
阅读原文