面向业务的微服务消息总线

源宝导读:移动PaaS项目的异步场景中,随着订阅主题数的增加,会出现开发维护成本高、管理难度大等问题,本文将分享如何通过构建面向业务的微服务消息总线应对这些问题。

一、背景

    面向业务的消息总线本质上是对消息队列进行二次封装,而不是让各业务服务直接对接消息中间件。在微服务架构设计下,面向业务的消息总线是服务间异步通信、解耦的核心基础设施。

二、为什么需要消息总线

    在没有消息总线前,移动PaaS项目中的异步请求都是通过直连RabbitMQ来实现,PHP开发的服务往往需要借助Swoole之类的第三方扩展来实现消费端常驻进程消费。当异步任务不多的时候没有问题,但随着订阅主题数的增加,这种客户端消费模式逐渐显现出以下几个缺点:

  • 开发成本高,需要业务服务引入消息中间件SDK需要关注消息中间件的各种复杂繁琐的配置,不同微服务的实现有大量重复逻辑。

  • 维护成本高,PHP的业务服务需要起很多消费容器来跑多进程消费,浪费系统资源,发布部署很麻烦。多语言下的消费实现方式不统一。

  • 管理难度大,随着订阅关系复杂,Topic日益增多,服务之间的订阅关系变得不清晰。

  • 扩展成本高,无法统一消息系统扩展功能,如路由、延时、重试、消费确认等。

    从实际业务角度出发,对整个移动PaaS项目中涉及消息通信的业务场景进行梳理,得出以下几个核心需求点:

  • 集中的消息发布入口,生产端无需关注消息系统的实现细节和复杂配置。

  • 集中化的微服务间订阅关系维护,通过在统一的面板上管理维护订阅关系。

  • 集中化的消息消费,通过集中消费消息,根据微服务间的订阅关系来推送消息。

  • 支持多种协议gRPC、http。

    总体来说,直接使用消息系统可以被看成是一个面向技术的接入方式;而消息总线则期望通过隐藏消息中间件的内部细节,实现一个面向业务的接入方式。

三、架构设计和技术实现

3.1、架构设计

    消息总线隐藏了消息发送、超时处理、消费负载、通信等一系列问题。对于使用者来说,只需要调用一个http或者gRPC接口就能发送消息,无需集成消息系统SDK。在PaaS2.0中消息总线使用RabbitMQ 作为消息引擎,实现了消息生产端的集中发送,并且通过RabbitMQ 的死信队列实现对消息的超时控制。下图为PaaS2.0中消息总线的架构图。

3.2、技术实现

统一消息格式

    提供简单易用的消息体格式,使用者可以很方便的完成一条消息的发送。

{"id": "5675682526732228",   //消息的id"timeout": 30,   //超时时间"topic": "event.workspace.delete",  //消息主题"content": {} //消息内容 
}

统一声明交换机

使用死信队列来处理消息超时

    RabbitMQ的ttl超时属性可以设置在消息上也可以设置在队列上,但是设置到消息上时消息的超时校验只有在消息被消费时才能生效,这就会导致超时控制不精准。所以通过设置超时队列将不同的超时时间设置到不同的队列上,并且绑定死信队列,这样消费端在消息超时的时候就能得到通知。

    PaaS2.0中实现了消息生产端的集中发送,不仅统一了消息体的格式而且也简化了消息超时控制。但是仍然没有解决消费订阅管理、集中消费的问题。

    作为PaaS平台,必须具备开放能力,服务间的通信边界可能会延伸到系统间的通信,比如支持webhook。所以集中式消息消费,消息订阅关系管理成为消息总线迭代的方向。

    下图为基于消息总线实现的webhook。

  • MessageBusBroker 消息发送端服务  用于接收消息写入MQ。

  • MessageBusDeliver 消息投递服务  用于消费MQ中的消息根据订阅关系触发消息通知。

  • MessageBusAdmin  消息总线管理服务  用于服务管理、主题管理、订阅关系维护以及配置参数调整。

 

四、2.0版消息总线架构设计

    2.0版本的消息总线主要屏蔽了消息发送、存储、消费负载、通信、高可用等一系列技术问题,对业务开发者来说只需要调用SDK即可,简化了接入流程并提升了可靠性。同时在PaaS系统中,消息总线也作为WebHook能力的基础设施。

    消息总线整体架构图如下图所示:

  • Publish Service通过集成SDK向Message发送消息。

  • Deliver Service通过订阅关系向相关的服务和站点发起通知请求实现webhook。

  • 消费端服务通过特殊状态码来完成消息确认。

消费端的高可用保证

    为了保证消费时的高可用,Deliever除了在负责进行消费协议转换之外,通过一些策略来保证消费端的高可用。

  • 熔断限流,消费在消息一段时间内失败数据超过阈值时,停止对队列的消费,避免由于服务抖动或者线上故障引起的大面积消息消费失败。

  • 自恢复,熔断后Deliver服务会对应用服务健康度进行监控,在服务恢复后可自动恢复消费。

  • 失败重试,消息总线服务发生故障时,可对期间的失败消息采用重试策略进行重试,在业务应用消费产生异常时,可在订阅消息时指定是否进行重试

  • 优雅重启,Deliver可实现优雅重启和退出,保障当前正在消费的消息都处理完成后才退出进程。

五、总结

    面向业务的消息总线设计的目标,本质上是为了服务间解耦,降低业务开发的复杂度,让业务开发不去关注消息通信细节,从而实现业务的快速迭代,消息系统也可以根据不同的业务场景选用不同的消息引擎。消息总线的设计重点和难点集中在消费端的处理。

------ END ------

作者简介

段同学: 后端研发工程师,目前负责天际移动PaaS平台的研发工作。

也许您还想看

Hybrid-APP技术原理

微前端架构在容器平台的应用

前端数据层落地实践

移动建模平台元数据存储架构演进

AI云店小程序演变之路

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305299.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模拟时钟中断的产生及设计一个对时钟中断事件进行处理的模拟程序_操作系统基础6-支持操作系统的最基本的硬件-中断...

无论是桌面PC操作系统还是嵌入式都是多任务的操作系统,而很遗憾,处理器往往是单个的,即便在硬件成本逐渐下降,而硬件配置直线上升的今天,PC机的核心可能已经达到4核心,8核心&#xf…

XMLhttp学习应用

Client.htm页面代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns"http://www.w3.org/1999/xhtml"><head><title>客…

机器学习没有想象中的那么难

文末彩蛋&#xff0c;不容错过&#xff01;背景从去年的AlphaGo到今年人工智能首次写进政府工作报告&#xff0c;人工智能正在席卷全球&#xff0c;引发第4次工业革命&#xff0c;而AI的核心技术是机器学习和深度学习。目前&#xff0c;机器学习已广泛应用于数据挖掘、计算机视…

Docker查看应用的实际内存

前言 我们把应用部署到Docker里面之后&#xff0c;有什么办法查看这个应用占用了多少内存呢&#xff1f;docker本身提供了一个命令让我们可以直接看到当前时间所有容易占用的情况。docker stats --no-stream从上面来看&#xff0c;这几个应用用的内存加起来已经是将近12G了。但…

如何动态的生成某种类型的集合呢_知乎画报」的移动端动态化工程实践

本文基于移动端动态化方案在知乎原生推广落地页「知乎画报」上的实践经验&#xff0c;对该方案技术升级过程中的思考以及技术关键细节做了详尽的解读。商业化是互联网公司发展的重要阶段&#xff0c;App 端的商业广告业务对移动端动态化能力的需求很强烈&#xff0c;一方面需要…

任正非致歉华为前程序员:回来吧,公司错了

近几日&#xff0c;因着任正非连续签发邮件&#xff0c;无处不在热议华为&#xff0c;其中与所有的技术人可谓密切相关。除了一员工因说真话&#xff0c;被晋升两级&#xff0c;根据其自愿选择工作岗位及地点&#xff0c;并由无线网络产品线总裁邓泰华保护其不受打击报复之外&a…

Asp.Net Core之Identity应用(下篇)

一、前言在上篇中简单介绍了 Asp.Net Core 自带的 Identity,一个负责对用户的身份进行认证的框架&#xff0c;当我们按需选择这个框架作为管理和存储我们应用中的用户账号数据的时候&#xff0c;就会添加到自己的项目当中去。这个时候&#xff0c;默认情况我们会使用自带的数据…

如果每一种语言都对应一种女生,你会喜欢哪一个?

这几天调试都很顺利&#xff0c;今天很意外的不要加班&#xff0c;哥几个看着窗外还是白天&#xff0c;还有点不适应。没想到哥几个突然开始YY&#xff1a;如果每种语言都对应一种女生&#xff0c;你会喜欢哪一个&#xff1f;程序猿寂寞起来&#xff0c;我自己都害怕。碍于人数…

asp.net core安全事项(下)

越权越权是非常严重的安全漏洞&#xff0c;通常状态是开发人员对请求的限制逻辑不严格导致的。如果系统中有角色的概念&#xff0c;越权可能出现不同角色间的越权和同角色间的越权。相同角色&#xff1a;A用户&#xff0c;B用户是相同的角色。A用户和B用户都可以调用 /photo/{i…

[导入]php 安全基础 第八章 共享主机 文件系统浏览

8.4. 文件系统浏览 除了能在共享服务器上读取任意文件之外&#xff0c;攻击者还能建立一个可以浏览文件系统的脚本。由于你的大多数敏感文件不会保存在网站主目录下&#xff0c;此类脚本一般用于找到你的源文件的所在位置。请看下例&#xff1a; <pre> <?php if (iss…

程序员的项目周期(表情包版)

0. 需求审评会议进行中1. 开发阶段进行中….2. 代码复查阶段3. 测试阶段….4. 需求突然要改….5. 项目上线

[导入]php 安全基础 附录B. 函数

附录B. 函数 在我写作本书的时候&#xff0c;http://php.net/quickref.php列出了共3917个函数&#xff0c;其中包括一些类似函数的语法结构&#xff0c;在此我不准备把它们从函数中区分开来&#xff0c;而是把它作为函数看待。 由于函数数量很大&#xff0c;一一说明它们的正确…

6段Python代码刻画深度学习历史:从最小二乘法到深度神经网络

最小二乘法深度学习的一切都起源于这个数学片段&#xff08;我把它用Python 写了出来&#xff09;&#xff1a;这一方法是 1805 年巴黎数学家阿德利昂玛利埃勒让德首次提出的&#xff08;1805&#xff0c;Legendre&#xff09;&#xff0c;勒让德建立了许多重要的定理&#xff…

win7美化_Potplayer64位美化版,无棒子的tv推送

potplayer 64位是一款视频播放器&#xff0c;potplayer 64位目前正在新功能全力开发中&#xff0c;由于采用delphi编译程序kmplayer的一些弊端&#xff0c;姜龙喜先生为改进播放器本身的一些性能而重新用vc进行构架&#xff0c;有需要的伙伴们可以移步简易下载站获取&#xff0…

如何在 C# 8 中使用 Channels

在面对 生产者-消费者 的场景下&#xff0c; netcore 提供了一个新的命名空间 System.Threading.Channels 来帮助我们更高效的处理此类问题&#xff0c;有了这个 Channels 存在, 生产者 和 消费者 可以各自处理自己的任务而不相互干扰&#xff0c;有利于两方的并发处理&#x…

mockito mock void方法_使用 Junit + Mockito 实践单元测试!

一、前言相信做过开发的同学&#xff0c;都多多少少写过下面的代码&#xff0c;很长一段时间我一直以为这就是单元测试...SpringBootTestRunWith(SpringRunner.class)public class UnitTest1 {Autowiredprivate UnitService unitService;Testpublic void test() {System.out.pr…

人为什么会出轨?麻省理工学院告诉你:男女配对的真相

该实验出自麻省理工学院著名经济学家Dan Ariely的《The Upside of Irrationality》。结果很有趣&#xff0c;在我们的生活中也尤为常见。实验人员找来100位正值青春年华的大学生&#xff0c;男女各半。然后制作了100张卡片&#xff0c;卡片上写了从1到100总共一百个数字。单数的…

当 .NET 5 遇上OpenTelemetry,会碰撞出怎样的火花?

OpenTelemetry 介绍我在之前的几篇文章都介绍了 OpenTelemetry, 你可以在这里找到OpenTelemetry - 云原生下可观测性的新标准深入研究.NET 5的开放式遥测OpenTelemetry是谷歌和微软共同推进的云原生监控的新规范&#xff0c; 兼容OpenTracing和OpenCensusOpenTelemetry的终极目…

kotlin中mainactivity无法直接调用xml中的控件_使用52North 客户端接口调用OGC WPS服务...

52North是一个来自研究机构、工业界和公共行政管理界的研究者组成的开放国际合作组织&#xff0c;他们通过协作研发流程促进地理信息学创新。具体来说他们开发新的地理信息概念和技术&#xff0c;例如用于管理时空测量数据&#xff0c;以及通过网络共享地理处理技术。他们评估新…