McDonald‘s Event-Driven Architecture 麦当劳事件驱动架构

news2024/12/23 19:39:00

原文链接 1 mcdonalds-technical-blog/

原文链接 2 mcdonalds-technical-blog/

麦当劳在异步、事务性和分析性处理用例中使用跨技术栈的事件,包括移动订单进度跟踪和向客户发送营销通信(交易和促销)。

统一事件平台(unified eventing platform)旨在为跨域服务和应用程序之间的实时数据流提供一个可扩展、安全可靠的平台。它确保了一致性,并降低了维护和采用事件架构所涉及的实现和操作复杂性。

挑战:

虽然基于事件的集成在麦当劳并不新鲜,但我们已经看到了各种各样的技术和模式在构建平台时使用的各种技术和模式。缺乏标准化的方法可能导致实现不一致且操作复杂,从而影响可用性、可靠性和数据质量。当我们开始设想这个平台时,我们建立了一些高层次的设计目标,使我们的团队能够朝着正确的方向工作。

设计目标:

可伸缩(Scalable):需要自动伸缩,以适应不断增加的事件数量,而不会影响服务质量。

可用性(Available):需要高可用性,以承受(withstand)其组件的故障。

高性能(Performant):应该实时交付事件,并能够处理高度并发的工作负载。

安全(Secure):数据必须遵循围绕加密、访问控制等的数据安全指南。

可靠的(Reliable):必须可靠的控制到位,以避免丢失任何事件。

一致性(Consistent):必须在围绕错误处理、弹性、模式演变、监视和灾难恢复的模式实现中保持一致性。

简单(Simple):需要最小化实现和操作的复杂性,并使团队能够轻松地在平台上构建。
考虑到这些目标,我们选择了一组工具、技术和模式来创建统一的平台。

引擎盖下面(Under the hood):

在整体层面,可以创建事件并将其发送到 architecture,消费者(其他应用程序)进一步处理事件。

它有几个关键组成部分:

事件代理(Event Broker):- AWS Managed Streaming for Kafka

        我们使用AWS Managed Streaming for Kafka Service (MSK)来托管主题和事件,并为生成和消费事件提供语义,因为它与我们使用的其他AWS服务集成在一起。在减少操作开销和对用例进行定制的灵活性之间取得良好的平衡是很重要的。


模式注册表(Schema Registry) - AWS Elastic Container Service:

        发布到基于事件的体系结构的事件遵循定义良好的契约,确保下游消费应用程序中的数据质量,同时在事件模式更改时为生成应用程序提供清晰的演进路径。注册中心在事件的不同版本之间运行模式验证和兼容性检查。


备用事件存储(Standby Event Store) - AWS DynamoDB:

        为了避免在MSK不可用的情况下丢失消息,平台连接了一个备用数据存储,它将事件写入数据库。该体系结构提供了工具和实用程序来读取消息,并在MSK可用时将其发布回MSK。

自定义软件开发工具包(SDK) (Custom Software Development Kits):

        我们构建了特定于语言的库,为生产者和消费者提供api,以编写和读取具有内置逻辑的体系结构事件,以执行模式验证、处理错误和实现重试模式。sdk作为我们开发团队的加速器,提高了他们的生产力,并提供了实现最佳实践的一致方法。

事件网关(Event Gateway):- AWS API Gateway

        McDonald的基于事件的体系结构既支持我们应用程序内部生成的事件,也支持外部合作伙伴应用程序生成的事件,这些事件通过带有身份验证和授权层的事件网关进行路由。网关在不暴露内部主题管理的情况下提供了灵活性和抽象性。

支持的实用程序和工具(Supporting Utilities and Tools):Infrastructure as code, monitoring UI&CLI tools

        我们的开发人员和服务可靠性工程师有一组工具来纠正死信主题中的事件,提供对集群健康状况的可见性,并执行任何集群管理任务。

可靠的事件处理

下面是一个典型的数据流,说明事件是如何从平台可靠地产生和消费的:

1,在模式注册中心定义并注册事件模式。

2,需要生成事件的应用程序利用生产者SDK来发布事件。

3,当应用程序启动时,在生成应用程序中缓存事件模式以获得高性能。

4,SDK执行模式验证以确保事件符合模式。

5,如果验证通过,SDK将事件发布到主主题。

6,如果SDK遇到错误,比如模式验证或可检索的错误,它将被路由到绑定到该生产者的死信主题。

7,如果SDK遇到错误,例如MSK不可用,则将其写入DynamoDB数据库。

8,需要消费事件的应用程序利用消费者SDK来实现这一点。

9,SDK类似地执行模式验证,以确保所消费的事件与模式一致。

10,一次成功的消费将导致将偏移量提交回MSK,并继续消费该主题的下一个事件。

11,死信主题中的事件稍后通过管理实用程序进行修正,并发布回主主题。

12,我们的合作伙伴产生的事件,或“外部事件”,通过事件网关发布。

数据治理(Data governance

        消费系统( consuming systems)的一个关键问题是数据完整性。在保证数据完整性的前提下,可以为下游系统的设计节省大量的时间和复杂性。MSK以及模式注册表允许我们在系统之间强制执行数据契约。模式被定义为描述预期的数据字段和类型,以及可选字段和必选字段。在实时情况下,将根据该模式(通过序列化库)检查每个消息的有效性,否则将消息路由到死信主题以进行更正。

模式的使用方式如下所示:

在启动时,生产者将一个已知模式列表缓存到内存中。可以出于多种原因更新模式,包括增加更多字段或更改数据类型。当生产者发布消息时,在每个消息的开头使用自定义魔术字节将版本控制信息存储在主题中。稍后,当使用消息时,魔术字节将确定应该使用哪种模式来使用消息。该系统有助于减少主题中的滚动更新和混合消息版本。如果我们需要回滚或进行新的模式更新,消费者有权解析每条消息。

以这种方式使用模式注册中心可以验证跨不同系统的数据契约,并有助于确保下游分析系统中的数据完整性。

集群自动扩展(Cluster autoscaling

        虽然MSK提供了连接到代理的存储的自动伸缩,但是必须构建一个扩展集群的解决方案。我们创建了一个自动缩放函数,当代理的CPU利用率超过可配置的阈值时触发该函数,将代理添加到MSK集群,然后触发另一个lambda函数在代理之间移动分区。

域的分片(Domain-based sharding

        为了有效地扩展和最小化故障,我们将事件分为多个基于域的MSK集群。事件的域决定主题将驻留在哪个集群中,消费应用程序可以灵活地使用来自任何基于域的主题的事件。该平台旨在支持跨区域的全球部署,并在每个区域中配置高可用性配置。

【🤣  你看完什么感觉?  🤣】

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

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

相关文章

【CSS in Depth 2 精译_089】15.2:CSS 过渡特效中的定时函数

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第五部分 添加动效 ✔️【第 15 章 过渡】 ✔️ 15.1 状态间的由此及彼15.2 定时函数 ✔️ 15.2.1 定制贝塞尔曲线 ✔️15.2.2 阶跃 ✔️ 15.3 非动画属性 文章目录 15.2 定时函数 Timing function…

一个开源的自托管虚拟浏览器项目,支持在安全、私密的环境中使用浏览器

大家好,今天给大家分享一个开源的自托管虚拟浏览器项目Neko,旨在利用 WebRTC 技术在 Docker 容器中运行虚拟浏览器,为用户提供安全、私密且多功能的浏览体验。 项目介绍 Neko利用 WebRTC 技术在 Docker 容器中运行虚拟浏览器,提供…

AW36518芯片手册解读(3)

接前一篇文章:AW36518芯片手册解读(2) 二、详述 3. 功能描述 (1)上电复位 当电源电压VIN降至预定义电压VPOR(典型值为2.0V)以下时,该设备会产生复位信号以执行上电复位操作&#x…

浅谈目前我开发的前端项目用到的设计模式

浅谈目前我开发的前端项目用到的设计模式 前言 设计模式很多,看到一个需求,项目,我们去开发的时候,肯定是做一个整体的设计进行开发,而在这次我项目中,我也做了一个整体的设计,为什么要设计&a…

线性规划中的几种逻辑表达式

线性规划中的几种逻辑表达式 注意: 摘录字刘博士的《数学建模与数学规划》, 以便用时可查。 实际上Gurobi API 中自身放啊变的逻辑表达式函数,下面列出自定义的实现方式。 1 逻辑与 如果 x 1 1 x_1 1 x1​1, x 2 1 x_2 1 x2​1, 那…

JVM对象分配内存如何保证线程安全?

大家好,我是锋哥。今天分享关于【JVM对象分配内存如何保证线程安全?】面试题。希望对大家有帮助; JVM对象分配内存如何保证线程安全? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在JVM中,对象的内存分配…

Antd react上传图片格式限制

限制分辨率&#xff08;像素&#xff09; <a-upload :before-upload"beforeUpload">// 上传图片宽高比例限制const beforeUpload file > {return new Promise((resolve, reject) > {// // 图片类型限制// let isJpgOrPng file.type image/png || fil…

基于 iAP2 协议 的指令协议,用于对安防设备的 MCU 进行操作

协议设计目标 1. 安全性&#xff1a;通过 iAP2 协议与 MCU 设备进行安全通信。 2. 通用性&#xff1a;支持对安防设备的常见功能进行操作&#xff0c;如状态查询、设备控制、参数配置等。 3. 高效性&#xff1a;数据结构简洁清晰&#xff0c;易于解析和扩展。 4. 扩展性&#x…

Type-C单口便携屏LDR6021

随着科技的飞速发展&#xff0c;便携式电子产品在我们的日常生活中扮演着越来越重要的角色。在这一背景下&#xff0c;Type-C单口便携显示器作为一种新兴的显示设备&#xff0c;凭借其独特的优势迅速崭露头角&#xff0c;成为市场的新宠。本文将深入探讨Type-C单口便携显示器的…

Ubuntu 20.04 卸载和安装 MySQL8.0

卸载 首先&#xff0c;检查一下系统安装的软件包有哪些&#xff0c;使用dpkg -l | grep mysql命令&#xff1a; 为了将MySQL卸载干净&#xff0c;这些文件都需要被删除。 在Ubuntu20.04系统下&#xff0c;卸载干净MySQL8.0以确保下一次安装不会出错&#xff0c;可以按照以下…

NOTEBOOK_11 汽车电子设备分享(工作经验)

汽车电子设备分享 摘要 本文主要列出汽车电子应用的一些实验设备和生产设备&#xff0c;部分会给予一定推荐。目录 摘要一、通用工具&#xff1a;二、测量与测试仪器2.1测量仪器2.2无线通讯测量仪器2.3元器件测试仪2.4安规测试仪2.5电源供应器2.6电磁兼容测试设备2.7可靠性环境…

黑马Java面试教程_P8_并发编程

系列博客目录 文章目录 系列博客目录前言1.线程的基础知识1.1 线程和进程的区别&#xff1f;难2频3面试文稿 1.2 并行和并发有什么区别&#xff1f; 难1频1面试文稿 1.3 创建线程的四种方式 难2频4面试文稿 1.4 runnable 和 callable 有什么区别 难2频3面试文稿 1.5 线程的 run…

【活动邀请·深圳】深圳COC社区 深圳 AWS UG 2024 re:Invent re:Cap

re:Invent 是全球云计算领域的顶级盛会&#xff0c;每年都会吸引来自世界各地的技术领袖、创新者和实践者汇聚一堂&#xff0c;分享最新的技术成果和创新实践&#xff0c;深圳 UG 作为亚马逊云科技技术社区的重要组成部分&#xff0c;将借助 re:Invent 的东风&#xff0c;举办此…

一起学Git【第二节:创建版本库】

创建库 这个库相当于一个目录&#xff0c;目录中的文件都被Git管理&#xff0c;会记录每个文件的修改删除和添加工作&#xff0c;便于之后随时跟踪历史记录还原到之前的某一版本。如何创建库呢&#xff1f;有两种方式&#xff0c;本地创建库和云端克隆一个库。 1.本地创建库 …

本地部署webrtc应用怎么把http协议改成https协议?

环境&#xff1a; WSL2 Ubuntu22.04 webrtc视频聊天应用 问题描述&#xff1a; 本地部署webrtc应用怎么把http协议改成https协议&#xff1f; http协议在安卓手机浏览器上用不了麦克风本&#xff0c;来地应用webrtc 本来是http协议&#xff0c;在安卓手机上浏览器不支持使…

web实操8-cookie

会话技术 会话&#xff1a; 一次会话中包含多次请求和响应。 客户端浏览器访问服务器的资源&#xff0c;只要客户端或者服务器端不关闭&#xff0c;这始终在一次会话范围内&#xff0c;这一次会话范围内可以包含多次请求并且收到多次相应。 一次会话&#xff1a;浏览器第一…

vue2 - Day03 - (生命周期、组件、组件通信)

文章目录 一、生命周期1. 创建阶段2. 挂载阶段3. 更新阶段4. 销毁阶段5. 错误捕获总结 二、组件2.1 注册1. 全局注册 - 公共的组件。2. 局部注册总结 2.2 三大重要的组成部分1. 模板 (Template)主要功能&#xff1a;说明&#xff1a; 2. 脚本 (Script)主要功能&#xff1a;说明…

java日常工作开发高并发问题

前言 本篇文章将是以工作中经常遇到的问题&#xff0c;和面试中经常遇到的java问题进行描写。内容包括微服架构&#xff0c;java并发编程以及相应的中间件的高级知识。本文所有的问题都在描述多线程编程的高级知识。 一. 面试题 1.Sychronized和ReentrantLock有哪些不同点? …

【Python】【数据分析】深入探索 Python 数据可视化:Matplotlib 绘图库完整教程

目录 引言一、什么是 Matplotlib&#xff1f;1.1 Matplotlib 的安装1.2 Matplotlib 的基本功能 二、Matplotlib 的基础绘图2.1 绘制折线图2.2 绘制柱状图2.3 绘制散点图2.4 绘制饼图 三、高级功能与定制3.1 设置图表样式3.2 使用子图3.3 保存图表 四、Matplotlib 流程图4.1 Mer…

【代码随想录|动态规划背包问题】

一、背包问题分类 01背包&#xff1a;n种物品&#xff0c;每种物品只有一个 完全背包&#xff1a;n种物品&#xff0c;每种物品有无限个 多重背包&#xff1a;n种物品&#xff0c;每种物品的个数各不相同 二、01背包问题三道题 卡码网46题.携带研究材料&#xff08;二维背包…