2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

从单体到微服务的系统改造:采用事件驱动架构优化会员系统

  • 2023-09-19
    北京
  • 本文字数:1221 字

    阅读完需:约 4 分钟

大小:646.36K时长:03:40
从单体到微服务的系统改造:采用事件驱动架构优化会员系统

Baemin 是一家快速增长的送餐服务公司,它已经成功地从单体架构过渡到了更灵活的基于微服务的系统。这一转变的基石是事件驱动架构的实现,这是Baemin架构之旅的一个方面,正如最近的一篇博客文章所描述的那样。该架构的突出特点包括通过分层的事件订阅者细致地分离了关注点,以及战略性地使用事件存储来提高可靠性。Baemin 利用通用的关系数据库管理系统(RDBMS)并采用事务发件箱模式(Transactional Outbox Pattern),构建了一个可扩展且可靠的健壮框架。

 

最初,Baemin 努力克服单体架构的局限性,但随着公司规模的扩大,这种局限性变得越来越明显。系统无法处理激增的流量和订单,导致了大量的错误。向微服务的迁移于 2019 年 11 月完成,为下一阶段奠定了基础:采用事件驱动的架构。该架构对于实现各种微服务之间的松耦合、增强系统的弹性和灵活性至关重要。

 

Baemin 事件驱动架构的本质在于发布领域事件,而不是命令或请求。这种微妙但关键的区别可以减少不同系统之间的依赖关系。在传统的基于命令的系统中,一个服务的更改可能需要另一个服务也进行更改,从而导致紧密耦合的架构。通过关注领域事件,Baemin 确保每个微服务独立运行,并订阅与其领域相关的事件。

 

在 Baemin 的事件驱动架构中,事件和订阅者被组织为三层,以确保模块化和可扩展性。第一层,应用程序事件和第一订阅服务层,利用 Spring 框架的应用程序事件来管理内部、特定于领域的任务,并通过AWS简单通知服务(SNS)发布这些事件。第二层,内部事件和第二订阅服务层,处理的任务虽不是领域的核心,但却是必不可少的。例如,在登录过程中,该层负责一些次要任务,例如从其他设备中注销。最后,第三层称为外部事件和第三订阅服务层,用于发布外部系统将使用的事件。这些事件是通用的,以避免创建与外部系统的依赖关系。这种分层的方法允许 Baemin 在保持松耦合架构的同时确保了每个微服务都能独立运行。

 

事件驱动架构的挑战之一是确保事件发布的可靠性。Baemin 通过引入事件存储系统来解决这一问题。该存储系统使用与其领域存储相同的关系数据库管理系统(RDBMS),从而确保了事务数据的一致性。事件存储充当缓冲区,捕获事件并确保它们能可靠地发布。

 

该架构采用事务发件箱模式(Transactional Outbox Pattern)来确保数据一致性和可靠的事件发布。此模式对领域数据和事件数据使用相同的存储,从而实现可靠的事件发布机制。下图是其最终的设计,展示了不同类型的事件、事件存储系统和订阅者层之间的交互。

 


尽管如此,最终的设计还是值得注意的,因为它通过不同层次的事件订阅者细致地分离了关注点。使用事件存储来确保可靠性以及关注松耦合的领域事件是其突出的特点。

 

总而言之,Baemin 的架构转型为解决规模问题的组织提供了丰富的见解。通过对事件订阅者进行分层,并利用由通用 RDBMS 支持的事件存储,Baemin 精心打造了一个不仅满足其当前需求,而且非常适合未来的可扩展增强系统。

 

原文链接:

https://www.infoq.com/news/2023/09/delivery-hero-uses-eda/

 

2023-09-19 15:0650840

评论

发布
暂无评论
发现更多内容

前端面试指南之JS面试题总结

loveX001

JavaScript

问:你是如何进行react状态管理方案选择的?

beifeng1996

React

腾讯前端经典react面试题汇总

beifeng1996

React

《一条select 语句在TiDB Server层都发生了什么》

TiDB 社区干货传送门

管理与运维

从React源码来学hooks是不是更香呢

goClient1992

React

一面高频vue面试题

bb_xiaxia1998

Vue

手把手教你从安装CentOS7.4镜像开始,搭建IoT视频监控系统

华为云开发者联盟

后端 开发 华为云 企业号十月 PK 榜

KubeVela 插件指南:轻松扩展你的平台专属能力

阿里巴巴云原生

阿里云 开源 容器 云原生 KubeVela

什么是分布式数据库?我不信,看完这篇你还不懂!

TiDB 社区干货传送门

数据库架构设计 数据库前沿趋势

JVM 浅析(二)

Andy

云小课|MRS基础原理之Hudi介绍

华为云开发者联盟

大数据 华为云 企业号十月 PK 榜

问:React的useState和setState到底是同步还是异步呢?

beifeng1996

React

「Go工具箱」go语言csrf库的使用方式和实现原理

Go学堂

golang 开源 程序员 CSRF 10月月更

TiDB 生产集群与加密通讯TLS的辛酸苦辣 - 开启篇

TiDB 社区干货传送门

集群管理 管理与运维

从React源码角度看useCallback,useMemo,useContext

goClient1992

React

【web 开发基础】PHP 循环结构之 for 循环 -PHP 快速入门 (19)

迷彩

for循环 10月月更 web开发基础 PHP基础

JUC 浅析(三)

Andy

软件要想做的好,测试必定少不了

华为云开发者联盟

测试 开发 华为云 企业号十月 PK 榜

区块链≠绿色?波卡或成Web3“生态环保”标杆

One Block Community

区块链 环保 波卡生态

阿里是如何使用分布式架构的?阿里内部学习手册分享

Java全栈架构师

架构 分布式 微服务 后端 高并发

前端面试中小型公司都考些什么

loveX001

JavaScript

JVM 组成结构分析

Andy

嵌入式 Linux 入门(七、Linux 下的环境变量)

矜辰所致

Linux 环境变量 10月月更

报名倒计时1天!平头哥、中科院软件所PLCT实验室等技术专家解读最新RISC-V技术

OpenAnolis小助手

报名 risc-v 云栖大会 Workshop 龙蜥峰会

软件测试丨接口测试该怎么做?持证上岗的Charles,可以帮你做什么?

测试人

软件测试 接口测试 charles 测试开发

JUC 浅析(四)

Andy

在世界舞台MBBF一骑绝尘:永远更快一步的北京5G是怎样炼成的?

脑极体

一次TiDB GC阻塞引发的性能问题分析

TiDB 社区干货传送门

性能调优 管理与运维 故障排查/诊断

每日一题之请描述Vue组件渲染流程

bb_xiaxia1998

Vue

从清华大学到苏州经贸,双一流和普通高校都在使用的数据科学教学实训平台

ModelWhale

大数据 人才培养 数据竞赛 实训 教学

深入理解JS作用域链与执行上下文

loveX001

JavaScript

从单体到微服务的系统改造:采用事件驱动架构优化会员系统_微服务_A N M Bazlur Rahman_InfoQ精选文章