中华网|信也科技PMQ消息系统:易监控、易维护的轻量级消息系统

1月20日,由信也科技(NYSE:FINV)自主研发的PMQ消息系统正式对外发布 。 该系统是信也科技在调研业界消息系统的基础上研发的一款易于监控、易于维护的轻量级消息系统 。 目前,其已在信也科技私有云平台上稳定运行了四年,日消息量高峰时间超过30亿条,高峰写入超过20万TPS(异步模式) 。
据了解,消息系统在现代微服务系统中,起着至关重要的作用 。 不论是异步、解耦或削峰,都需使用到消息系统 。 而消息系统的稳定性,对系统的整体稳定性有着举足轻重的意义 。
信也科技PMQ消息系统的研发历程并非一帆风顺 。 早在2016年之前,信也科技曾尝试使用Kafka与RabbitMQ,彼时经常面临消息丢失、消息堆积等情况,严重影响了业务系统 。 自2016年年中以来,信也科技便着力开发PMQ消息系统,并于2017年发布2.0版本,实现了基本的消息发送与消费功能 。 自2017年年中开始研发3.0版本,至2018年年中,已实现重平衡、自助修改偏移等完善的消息治理功能 。 自2019年初发布的新版本,已逐渐实现了多语言、多环境等高级功能 。

中华网|信也科技PMQ消息系统:易监控、易维护的轻量级消息系统
图片
PMQ消息系统的整体架构示意图
PMQ消息系统的架构可分为以下五部分:
第一,Admin Portal 。 用户可在Admin Portal上创建Topic、消费者组、订阅Topic等常见操作 。 这些操作会生成对应的元数据信息,而这些元数据信息会保存至Metadata数据库中 。
第二,Broker 。 Broker会定时将Metadata元数据信息同步至内存中 。 当Producer发送消息请求达到Broker时,Broker会跟进Topic对应的元数据信息,将消息保存到相关的数据库表中 。 Consumer也会根据元数据信息从数据库中拉取相关的消息 。
第三,Producer,消息发送方 。 当Producer发送消息时,会将消息发送到Broker集群中的任何一个实例,当某个实例出现访问异常时,会自动重试,将消息转发到其他实例 。
第四,Consumer,消息消费方 。 当消费方启动时,会完成消息消费的注册功能 。 注册完成后Consumer会获取到相关的元数据信息,Consumer会从Broker拉取消息进行消费 。
第五,MySQL,消息存储层 。 所有的Topic消息至少会保存在2个MySQL物理实例上,防止单点故障 。 每个MySQL物理机都有备份集群,当某个MySQL集群出现问题时,会自动进行主从切换,以此来保证MySQL的高可用 。
同其他消息系统相比,PMQ消息系统采用了MySQL作为消息存储层,最大程度地降低了消息系统的复杂性,易于运维 。 此外,PMQ消息系统实现了Broker与存储分离,可实现Broker与MySQL的水平扩展 。
依托于MySQL,PMQ消息系统可实现更丰富的治理功能 。 具体功能如下:
1、堆积告警 。 在PMQ控制台中,可查看消息的发送与消费情况,当出现消息消费堆积的情况时,PMQ消息系统便发送告警消息给相关的负责人,通知其及时处理 。
2、消息消费与发送监控 。 PMQ消息系统的客户端内置了监控信息,可以监控消息发送与消息消费情况 。 特别内置了消息消费是否报错,消费耗时等监控信息 。
3、动态调整线程数 。 消息在消费过程中,经常会遇到消息堆积的情况 。 当相关负责人收到堆积告警时,负责人可根据监控情况来判断是否可以增大线程数来加快消息消费速度 。 消费线程数可在后台Portal界面动态修改,实时生效,无需用户修改代码,重启等操作 。 采用此方式,可非常迅速地解决消息堆积的情况 。
4、动态调整偏移量 。 消息在使用过程中,会遇到以下情况,当消息消费时可能会出现一些bug 。 当bug修复完成后,可能需要重新消费历史消息,此时可在PMQ消息系统后台控制页面中,动态调整偏移量,消费方即可按照指定的偏移对历史消息进行重新消费,无需修改代码实时生效 。
5、动态设置消费者组黑白名单 。 在本地代码开发时,为了调试某个消费逻辑代码,需要将某个消费者组指定给某个IP消费 。 对于此场景开发人员可在PMQ消息系统后台对某个消费者组设置白名单,设置完成后,此消费者组对应的消息便会被指定IP消费 。 同理,也可以设置黑名单,不允许某些IP消费 。 对于此类需求用户可在PMQ消息系统后台自助操作,无需修改代码,实时生效 。
6、支持失败消息 。 当用户在PMQ控制页面中给某个消费者组添加Topic订阅时,会自动创建一个消费者组与Topic对应的失败Topic,当客户端消息消费失败时,会自动将消费失败的消息发送至对应的失败Topic上,然后进行重试消费,如果重试失败,用户可在消息查询界面查看到消息消费重试结果 。
7、消息查询 。 有相关权限的用户,可在后台检索Topic历史消息 。