董彪
中国银联
摘要:当前,移动互联网已经非常普及,各种移动应用和服务满足着人们的日常生活需求,应用系统时时刻刻产生着交易记录、访问日志等大量的数据,大量的数据需要及时记录保存,同时又要求应用系统能够提供快速高效的响应和处理速度。那么,如何设计一个通用的消息异步持久化系统,就是本文描述的主要内容。
关键词:消息队列,异步,Kafka,持久化
前言:消息队列现在比较普及,各种系统都有多种消息数据产生,消息记录需要持久化。然而,在消息数据持久化阶段,可能即使是同一个系统内部,也存在多种不同的实现方式。本文就在于研究建立一套可通用的消息处理持久化的系统,能够用于消息需要异步保存的业务场景,提高系统对消息的处理效率。
一、背景介绍
1.存在问题
如今的移动互联网,无时无该不在产生使用记录,这些记录数据,这些消息记录都需要在处理业务时候保存,这样增加了业务处理的流程和复杂度,会增加业务服务处理环节,增加整个业务流程的处理时间,从而影响用户的体验。
用户使用系统和服务,系统和服务运行产生数据,数据需要在同一系统不同模块之间、不同系统之间传递以实现业务流程,这些传递的数据就是消息。
那么,面对这种场景,如何能够即满足业务处理响应,又能保存好消息记录,最终提高系统响应和处理能力呢?
2.解决思路
对于该问题,前半程是业务系统模块将需要持久化的消息放入消息队列;后半程是消费者从队列取出消息并持久化保存。消息队列的优势,主要在于以下几方面:
一是解耦:用于模块与模块之间、系统与系统之间相互隔离,相互处理不受影响,是实下使用最多的场景之一。如用户注册成功,需要赠送用户积分,积分入账即可与用户注册解耦。
二是异步:可以先给用户一个响应,再继续处理用户请求的场景,比如用户注册之后,再异步发送注册成功短信;如支付交易,先响应一个提交成功,再异步扣款,最后再异步通知用户。
三是削峰:对于大流量高并发或者是突发场景,可以把请求先放队列,后端再同步或异步处理请求,用队列抗住大流量压力,特别是秒杀、提交订单等短时间高并发场景,起到很好的削峰作用。
本文实现一个通用的消息异步持久化系统,可以用于此类业务需求的场景,实现业务交易能较快速度响应,同时消息记录又能高效持久化保存。
消息队列有两种模式,一是点对点模式,该模式需消费者主动轮询拉取消息,适用于只有一个消费者的场景;另一种是发布订阅模式,该模式消费者被动接收消息推送,消费者无需主动轮询。
3.技术选型
现在有许多优秀的消息队列,有IBM MQ、ActiveMQ、RabbitMQ、RocketMQ等,都有各自己的特点。随着互联网的快速发展,Kafka成了时下最受欢迎、使用最多的消息队列。
Kafka开始是由Linkedin公司开发,是一个分布式、支持分区的、多副本,基于zookeeper协调的分布式消息系统。其最大特性,就是可以实时处理大量数据,比如批处理系统、流式处理引擎、访问日志以及消息服务等。Kafka用Scala语言编写,Linkedin公司于2010年贡献给了Apache基金会,随后成为Apache基金会顶级开源项目,是当下用途最广的一种开源消息队列。Kafka具有以下特性:
高并发:支持数千个客户端同时读写
高吞吐量、低延迟:每秒可处理几十万条消息,最低延迟只有几毫秒
可扩展性:集群支持横向热扩展
持久性、可靠性:消息被持久化到本地磁盘,支持数据备份防止数据丢失
容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)
综上,Kafka是一种高性能的发布订阅模式消息队列,本文采用该消息队列来构建异步消息持久化系统。
二、系统设计
1.设计目标
本系统目标为,设计一个用于接收大量消息,然后异步持久化保存消息记录的通用系统。目标可以分解为两点,一是接收消息;二是异步保存消息。
2.业务逻辑
业务逻辑分为三个阶段:
一、产生数据
用户使用业务系统,产生业务数据记录;
1.1业务系统将生成的数据传递给消息生产者
1.2消息生产者收到数据后,将业务数据转化为消息对象,放入Kafka,此时即可返回继续处理,无须关注消息入库。
二、消息持久化
2.1持久化应用从Kafka订阅消息,当有消息产生后,消息队列会发布消息
2.2持久化应用拿到消息,将消息转换后写入数据库
三、用户读取数据阶段
3.业务系统访问消息记录的数据库,读取出消息,转换为业务数据后,展示给用户。
3.总体设计
本系统架构分为配置模块、消息队列模块、持久化应用模块三大部分,设计如下:
.png)
1.配置模块
该模块负责系统所有参数配置,配置参数保存在数据库中,在系统启动时加载。
包括接入配置,包括系统名称、接入时间等;持久化配置,包括处理线程数、每次读取消息条目数。
2.消息队列模块
直接使用Kafka搭建消息队列,节点数可支持横向扩展。
3.持久化应用模块
该模块为本系统的核心部分,用于订阅消息,向数据库写入消息记录。
根据以上功能,需要以下数据表:
1.接入配置表tbl_biz_cfg
包括接入业务ID、业务系统ID、业务系统名称及接入时间
2.配置表tbl_msg_cfg
配置ID、配置项、配置项值、配置项描述
3.消息记录表tbl_msg_order
消息记录ID、接入业务ID、消息体及创建时间,其中消息体使用JSON格式,可屏蔽不同消息的不同格式,可适用于保存不同业务报文,可做到数据结构和处理流程统一,系统才能通用。
4.场景应用
以上系统设计,适用于用户登陆、访问行为、下单保存、发送通知等,还可用于给系统发异步消息等等场景,使用范围较广。
结语:移动应用已经成为人们日常生活不可分割的一部分,如何提高用户体验,已是一个系统追求的目标。本文阐述的以Kafka为消息队列,构建的消息异步持久化系统,适用于大并发大流量的数据场景,结合较为广泛使用的Kafka消息队列,可以构建出较好的异步实现,对用户体验提升有较好作用。
参考文献
[1]APACHE KAFKA, http://kafka.apache.org
[2]朱忠华,深入理解Kafka核心设计与实践原理,2019.1