分布式服务下,消息中间件改造

本文涉及的产品
性能测试 PTS,5000VUM额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介: 在系统开发初期,很容易出现这样一种情况:不同业务线上开发人员,因为技术栈和版本时间的影响,在选型的时候会优先使用自己熟悉的,例如MQ中间件常用的:Kafka、Rocket、Rabbit等,这样很容易忽略各个项目之间的组件差异问题;

一、背景简介

在系统开发初期,很容易出现这样一种情况:不同业务线上开发人员,因为技术栈和版本时间的影响,在选型的时候会优先使用自己熟悉的,例如MQ中间件常用的:Kafka、Rocket、Rabbit等,这样很容易忽略各个项目之间的组件差异问题;

在系统开发中后期,业务相对稳定之后,通常都会对资源占用较高的模块逐步重构,公共服务进行整合管理,从而使系统更具有整体性,在这个过程中,解决不同项目的中间件差异通常首当其冲,例如常见的缓存中心,MQ消息管理等;

这种情况一般来说很难避免,系统初期为了快速支撑业务,埋下很多坑点,一旦业务可以稳定发展,并且可持续性得到验证,就会开始适当考虑逐步进行模块重构,降低成本。

二、重构思路

2.1 初期问题

在某创业公司研发初期,业务线上存在五个项目并行开发的情况,当时对于MQ的使用状况如下:

18-1.png

  • Rocket:核心业务3个项目,版本有差异;
  • Kafka:数据权重偏高,1个项目采用;
  • Redis:基于Python连接,队列消息模式;

刚开始因为用的不多,整体还在可控范围内,后续随着业务的持续迭代,项目间出现需要通信的情况,就开始混乱难以维护,然后就是被迫开始重构,统一消息组件。

2.2 二次选型

基于业务的综合考量,对现有几个项目进行MQ重新设计,形成的整体架构思路如下:

18-2.png

  • MQ组件选择:采用RocketMQ;
  • 换掉Redis组件的队列模式;
  • 将基于Python的系统改Java语言;
  • 提供消息生产与消费两个服务;
  • MQ的功能由上述服务进行统一维护;

这里在核心业务线上没有改变组件选择,换掉kafka的一个原因是涉及大量结算业务,Redis队列模式弃用,基于Python的管理系统功能不多,这里只是顺手换掉,统一业务线的编程语言。这样设计之后,从整体思路上看就会合理很多。

三、改造过程

3.1 整体思路

18-3.png

涉及核心角色说明,从左向右依次:

  • 生产客户端:需要请求服务端通信的节点,调用生产服务端封装的消息发送接口即可;
  • 生产服务端:封装消息发送API,并维护路由管理,权限识别等,消息落地存储等;
  • 消息存储层:主要基于消息中间件进行存储,数据库层面用来处理特定情况下的二次调度;
  • 消费服务端:封装消息接收API,并根据路由标识,请求指定的消费端接口,完成通信;
  • 消费客户端:响应消费服务端的请求,封装消费时具体的业务逻辑;

在整体的技术难度上没有太多差别,但是引入两个服务【生产和消费】,用来管理MQ通信流程,适配特定的业务逻辑,引入数据库做一次落地存储,在异常流程的处理上更加灵活,这样整个消息模块具有很强的可扩展性。

3.2 细节描述

  • 组件选型

消息中间件的选择是比较多的,但是鉴于业务线上开发人员的熟悉程度,以及参考多方提供的测试对比报告,最终确定选用RocketMQ组件,同时RocketMQ相关特点:高性能、高可靠性,以及对分布式事务的支持,也是核心的考虑因素。

  • 微服务架构

基于当前微服务的架构模式,把MQ功能本身集成在两个核心服务中,进行统一管理和迭代,以及组件的版本控制,对于所有生产的消息,进行全局路由控制,以及特定情况下的,通过应用服务层面功能设计,实现消息延时消费,以及失败消息的二次调度执行,和部分单条消息的手动触发。

  • 数据存储

对消息实体进行二次存储,主要还是适配部分特定的功能点,有些消息可以延时处理,例如当MQ队列出现堆积的时候,或者达到监控的预警线时,可以通过配置手段,干预一部分消息只存储入库,不推送MQ,等待服务相对空闲的时候再去发送。

消息中间件作为系统间解耦的稳定支撑,在服务层面管理时,需要具备清晰的设计路线,以及流程关键节点的监控和记录,确保整个链路的稳定和容错。

END


相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
5月前
|
监控 负载均衡 Cloud Native
ZooKeeper分布式协调服务详解:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入剖析ZooKeeper分布式协调服务原理,涵盖核心概念如Server、Client、ZNode、ACL、Watcher,以及ZAB协议在一致性、会话管理、Leader选举中的作用。讨论ZooKeeper数据模型、操作、会话管理、集群部署与管理、性能调优和监控。同时,文章探讨了ZooKeeper在分布式锁、队列、服务注册与发现等场景的应用,并在面试方面分析了与其它服务的区别、实战挑战及解决方案。附带Java客户端实现分布式锁的代码示例,助力提升面试表现。
526 2
|
5月前
|
消息中间件 算法 Java
【亿级数据专题】「分布式服务框架」 盘点本年度我们探索服务的保障容量的三大关键方案实现
【亿级数据专题】「分布式服务框架」 盘点本年度我们探索服务的保障容量的三大关键方案实现
229 0
|
8天前
|
存储 缓存 算法
分布式锁服务深度解析:以Apache Flink的Checkpointing机制为例
【10月更文挑战第7天】在分布式系统中,多个进程或节点可能需要同时访问和操作共享资源。为了确保数据的一致性和系统的稳定性,我们需要一种机制来协调这些进程或节点的访问,避免并发冲突和竞态条件。分布式锁服务正是为此而生的一种解决方案。它通过在网络环境中实现锁机制,确保同一时间只有一个进程或节点能够访问和操作共享资源。
25 3
|
2月前
|
存储 缓存 监控
分布式链路监控系统问题之kywalking在后期维护过程中可能会遇到中间件版本升级的问题如何解决
分布式链路监控系统问题之kywalking在后期维护过程中可能会遇到中间件版本升级的问题如何解决
|
1月前
|
数据采集 分布式计算 MaxCompute
MaxCompute 分布式计算框架 MaxFrame 服务正式商业化公告
MaxCompute 分布式计算框架 MaxFrame 服务于北京时间2024年09月27日正式商业化!
56 3
|
2月前
|
运维 安全 Cloud Native
核心系统转型问题之分布式数据库和数据访问中间件协作如何解决
核心系统转型问题之分布式数据库和数据访问中间件协作如何解决
|
2月前
|
Java 应用服务中间件 数据库
SpringCloud:服务保护和分布式事务详解
SpringCloud:服务保护和分布式事务详解
118 0
|
4月前
|
消息中间件 传感器 Cloud Native
事件驱动作为分布式异步服务架构
【6月更文挑战第25天】本文介绍事件驱动架构(EDA)是异步分布式设计的关键模式,适用于高扩展性需求。EDA提升服务韧性,支持CQRS、数据通知、开放式接口和事件流处理。然而,其脆弱性包括组件控制、数据交换、逻辑关系复杂性、潜在死循环和高并发挑战。EDA在云原生环境,如Serverless,中尤其适用。
155 2
事件驱动作为分布式异步服务架构
|
5月前
|
SpringCloudAlibaba Java 网络架构
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(七)Spring Cloud Gateway服务网关
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(七)Spring Cloud Gateway服务网关
250 0