一、背景与挑战
随着货拉拉业务的迅猛发展,我们的订单量不断攀升,随之而来的是用户消息量的激增。这些海量的用户消息需要得到及时而有效的处理和流转。为了应对这一挑战,我们构建了一个高效的消息融合分发平台。
在平台建设初期,我们面临了以下挑战
消息多样性:多样化的业务需求、 丰富的消息类型支持、广泛多样的终端兼容性;
海量数据:随着订单量的增加,消息数量也急剧上升,平均每个订单可以产出50~100条子消息;
扩展性诉求:随着业务的增长,平台需要能够灵活扩展以适应不断变化的需求,实时快速的业务响应支持在线编辑能力,降低产研的接入成本;
**异常机制:**消息处理异常后的解决方案,尤其是当下游服务或第三方应用不可用或宕机时,如何确保消息处理的一致性,降低人工维护成本、提高系统自愈能力;
通过克服这些挑战,我们的消息融合平台能够为用户提供更加高效、可靠和个性化的服务体验。
二、方案探索
2.1 海量数据处理
随着订单量的持续增长,我们的消息量也随之激增。为了应对来自不同上游系统的多样化数据,我们实施了一套综合的数据集成策略,涵盖消息队列(MQ)、面向服务的架构(SOA)以及大数据处理技术,从而高效处理各种复杂的数据来源。
针对海量数据的处理需求,我们首先对数据进行分类,然后根据数据类型(事务****消息、延迟消息、一次性消息 )采取相应的处理措施。为了进一步提升数据处理的效率,我们采用了分布式任务处理 技术,实现消息的并行分发和处理。在处理过程中,对于处理异常的场景,我们采取了事务消息,通过最终一致性 原则和消息自愈机制来确保数据的准确性和系统的稳定性。这些措施有助于我们在保持高效率的同时,也保障了数据处理的可靠性。
事件分发系统做为融合平台的中枢,它承担着将采集到的数据转化为可操作信息的关键任务。主要分成如下几个模块:消息采集->消息分类->消息处理->消息自愈;
- 事件分发
2.2 界面可视化诉求
为了管理五花八门的用户消息,提高消息的复用性,我们引入消息套餐的概念。主要由消息模版、消息套餐、消息可视化三个部分组成**,**一个套餐下可以挂多个消息模版,允许自由组合(1:N)。将复杂的代码变成可视化的界面,降低产研的接入成本,使得非技术人员也能轻松管理和分发消息;
**模版:**具体某个消息需要推送的内容,以及消息的通道管理;
**套餐:**由多个消息模版组合而成,模版之间可自由组合成一个具体的消息套餐;
**可视化:**设计一个直观的图形用户界面,使用拖放、预览和一键发布等功能,减少对代码的依赖;
以可视化的方式搭建消息之间的桥梁,聚合不同类型的消息,构建一类消息套餐,通过桥接模式和模板方法模式来提高代码复用性,并降低研发成本;
- 套餐案例
2.3 平台框架设计
基于上述问题,结合业界方案的调研。我们主要将平台分成如下四个模块数据采集模块、归类分发模块、消息套餐管理模块、目标群体分类。下方是我们的业务架构图;
- 消息融合平台
三、详细设计
3.1 归类分发
我们对收集到的消息进行分类,确保每条消息都能被正确地识别,之后分发给对应的处理流程。该模块主要负责多样化数据采集,以及采集后数据的分类和流转; **数据采集:**消息队列(MQ)、面向服务的架构(SOA)以及大数据处理技术;
智能路由:我们使用智能路由算法,根据消息的类型、优先级和目标用户,将数据自动路由到相应的处理流程;
反馈循环:我们建立了一个反馈机制,收集处理过程数据实时反馈,以便不断优化我们的数据处理和分发策略;
消息控流:通过流量控制和削峰策略,利用消息队列的缓冲机制,来应对高并发场景,防止系统过载。通过限制消息生产和消费速率来进一步控制消息流速;
- 归类分发
markdown
延迟消息***.kafka.***.consumer.**.bme_trade_order_****_event.action-type-3002.delay-time = 300
事物消息(落库)***.kafka.***.consumer.**. bme_trade_order_****_event. action-type-3004.***.delay-time = 0
普通消息***.kafka.***.consumer.**. bme_trade_order_****_event. action-typeOnce-3004.delay-time = 0
3.2 消息处理
3.2.1 分布式任务处理
为了高效地处理日益增长的消息,我们引入了分布式任务xxl-job。通过分布式任务调度处理,并行处理海量消息,显著提高了数据处理的效率。我们数据分配的策略,主要是基于消息ID的唯一性,对消息id取模具体流程如下:
-
任务分配:根据任务的特点和节点的状态,将任务分配给不同的节点进行处理(消息ID取模);
-
**任务执行:**不同的节点可以同时处理不同的记录实现并行处理,这种分布式处理模式不仅提高了处理速度,还增强了系统的扩展性和容错能力。
-
任务监控:过程数据落库,对任务的执行状态(飞书告警+db+xxl)进行监控和跟踪,以便出现问题时及时处理。
-
可扩展性:随着业务的扩展和数据量的增长,我们可以轻松地添加更多的处理节点,而无需重新设计数据分配策略。
-
**补偿机制:**异常记录落库,定期补偿重试;
-
结果汇总:收集各个节点的执行结果,进行汇总和处理;
-
分布式任务处理
3.2.2 消息处理流程
为了确保系统消息的可靠性和数据的一致性,我们采用了分布式事务最终一致性的方案,通过数据库记录过程数据。这种方案强调最终能够达到一个一致的状态,而不需要实时保证系统数据的强一致性。我们通过如下几个步骤:
1、开始处理消息(同步或者异步),更新消息状态为处理中;
2、发起三方请求进行事件处理;
3、消息中心业务处理完成后的结果反馈(接口调用同步返回、消息异步callback、soa请求);
4、处理完成后的消息回调;
5、更新消息事物表状态(成功、失败);
6、ack应答确认;
- 消息处理
痛点:
消息没有正常消费?
消息消费后事件处理异常?
碰巧下游服务或者三方应用不可用宕机了?
这样就会导致数据不一致的情况!(构建事务表)
Q:有人说我们可以利用kafka消费端的ack应答机制,业务处理成功后再告知集群我们消费成功了?
A:那么业务处理的耗时必然会导致消费速率的下降、拖慢消费速度,导致消息积压;
3.2.3 自愈重试
平时我们稳定性的同事在降级、限流、熔断等方面做了很多努力来保证服务的高可用和自愈能力,除了系统方面的自愈能力外,其实业务层面的自愈能力也是至关重要的;
-
由xxl-job定时捞取异常记录进行补偿重试 --(限定时间和数量)
-
Job分片处理多节点并行,哈希的方式每个节点处理不同的数据 --(分布式任务处理)
-
根据业务的不同设置相应的补偿策略(如指数递增间隔重试、固定间隔指定最大重试时间、个性化业务重试)
-
根据策略补偿重试后还是异常的,系统已无法处理,只能执行最终方案了人工介入或者丢弃
-
自愈重试
痛点:
处理失败后我们该如何进行数据补偿重试呢?
需要处理的数据量比较大怎么办?
补偿的时机是否合理,补偿机制该如何定义?
补偿必然会导致数据接口的幂等问题?
3.3 套餐管理
该模块是消息处理流程的最终环节,负责将上游处理完毕的消息转化为用户可接收的具体内容。以可视化的方式构建消息模版,再由模版组合成一类具体的消息套餐,通过多渠道分发的形式推送给用户,该模块有如下几个特点; 可视化界面设计:直观的用户界面,使得非技术用户也能轻松管理和分发消息;
实时更新:为了提供实时的用户体验,我们的平台能够实时更新数据,并确保用户能够及时收到最新的信息;
多渠道分发:处理后的数据将通过不同的渠道分发给用户,包括APP、小程序(如微信、支付宝等)和公众号;
消息套餐组合:利用预构建的模板,我们可以组合成一系列具体的消息套餐。这些套餐可以根据用户的行为、偏好或业务逻辑来定制,以确保消息的相关性和个性化;
- 套餐管理
3.3.1 消息可视化
运营人员在后端配置消息模板,可直观的感受推送界面的具体样式,降低人工异常,使得非技术用户也能轻松管理和分发消息;
- 消息可视化
3.3.2 消息模版创建
引入消息模板的概念,我们将繁琐的编码工作转变为简单直观的界面配置,这不仅提高了生产效率,还可以支持在线编辑,审批通过后支持生产变更实时生效,提升系统的容错性;
- 消息模版列表
- 消息模版编辑
3.3.3 组合套餐管理
一个消息套餐内可以包含多个消息模板,大多数消息模版是可以复用的,并且是基于套餐的维度来进行消息推送的,可自由组合不同消息模版,直观的用户界面,使得非技术用户也能轻松管理和分发消息;
- 消息套餐列表
- 消息套餐编辑
四、落地实践
目前该方案已落地使用,组合套餐300余个,构建消息模版1000+,日均处理流转消息量超亿级;
-
提供简单易用的消息套餐可视化界面,使得非技术用户也能轻松管理和分发消息;
-
平稳处理海量数据,支持在线扩容、在线编辑,提高数据处理效率;
-
统一代码框架,降低接入成本,有效提高研发效率;
-
异常自愈,提高系统容错性;
五、总结与展望
在技术领域,不存在所谓的最佳技术,只有最适合特定场景的技术。无论是产业界的专家还是互联网的先锋,要想在产业互联网的浪潮中稳步前行,关键在于培养迭代思维。产业在不断地迭代,互联网在不断地迭代,组织和个人同样在不断地迭代。正是在这种持续的迭代和更新中,我们才能摸索出最适合自身业务发展的技术路径。
随着业务的不断演进和市场需求的持续扩大,多元消息融合平台的优化可以从以下几个关键方向发展:
丰富媒体元素:在push推送通知中使用图像、视频和交互式按钮等富媒体元素,使通知更具吸引力和视觉冲击感,提高用户的互动频率;
**个性化推送:**利用人工智能算法分析用户行为偏好,提供高度个性化的通知,提高和用户互动的可能性;
**数据监控与分析:**加强用户消息触达率的监控,选择对目标受众覆盖率高、时效性好的渠道。