McDonald‘s Event-Driven Architecture 麦当劳事件驱动架构
原文链接 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集群。事件的域决定主题将驻留在哪个集群中,消费应用程序可以灵活地使用来自任何基于域的主题的事件。该平台旨在支持跨区域的全球部署,并在每个区域中配置高可用性配置。

【🤣 你看完什么感觉? 🤣】
相关文章:
McDonald‘s Event-Driven Architecture 麦当劳事件驱动架构
原文链接 1 mcdonalds-technical-blog/ 原文链接 2 mcdonalds-technical-blog/ 麦当劳在异步、事务性和分析性处理用例中使用跨技术栈的事件,包括移动订单进度跟踪和向客户发送营销通信(交易和促销)。 统一事件平台(unified eve…...
GTID详解
概念和组成 1,全局事务表示:global transaction identifiers 2, GTID和事务一一对应,并且全局唯一 3,一个GTID在一个服务器上只执行一次 4,mysql 5.6.5开始支持 组成 GTID server_uuid:transaction_id 如…...
图解HTTP-HTTP状态码
状态码 状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。 类别原因短语1XXInformational(信息状态码)接收的请求正在处理2XXSuccess(成功状态码)请求正常处理完毕4XXRedirection (重定向状态码)需要…...
sh cmake-linux.sh -- --skip-license --prefix = $MY_INSTALL_DIR
本文来自天工AI --------- 命令用于安装CMake的脚本,其中--skip-license参数表示跳过许可协议的显示,--prefix参数指定了CMake的安装目录。$MYINSTALLDIR是一个环境变量,应该在运行命令之前设置为您想要安装CMake的目录。 -------- sh xx…...
MySQL 在window免安装启动
复制my.ini文件 初始化命令:mysqld --initialize --console 执行启动bat:启动mysql.bat 主要命令是:mysqld --standalone 免密码启动mysql: mysqld --defaults-file"D:\xxx\soft\mysql-8.0.40-winx64\my.ini" …...
[JavaScript] 我该怎么去写一个canvas游戏
首先你得知道canvas的基础语法,此处不过多赘述. 一、如何更新视图 canvas里面有个clearRect方法,可以遮住画布中一个矩形部分. 但是你想这样做就难免会遮住一些本不该遮住的东西,因为它是一个矩形,并且你还要计算它的位置和尺寸…...
【潜意识Java】深度解析黑马项目《苍穹外卖》与蓝桥杯算法的结合问题
目录 为什么要结合项目与算法? 1. 蓝桥杯与《苍穹外卖》项目的结合 实例:基于蓝桥杯算法思想的订单配送路径规划 问题描述: 代码实现:使用动态规划解决旅行商问题 代码解析: 为什么这个题目与蓝桥杯相关&#x…...
python报错系列(16)--pyinstaller ????????
系列文章目录 文章目录 系列文章目录前言一、pyinstaller ????????1.报错如下2.安装pyinstaller3.报错如下:4.封装py文件为exe成功5.国内源 总结 前言 一、pyinstaller ??? 1.报错如下 PS D:\Users\gxcaoty\Desktop\性能覆盖率> pyinstaller37.exe…...
Pytorch | 从零构建ResNet对CIFAR10进行分类
Pytorch | 从零构建ResNet对CIFAR10进行分类 CIFAR10数据集ResNet核心思想网络结构创新点优点应用 ResNet结构代码详解结构代码代码详解BasicBlock 类ResNet 类ResNet18、ResNet34、ResNet50、ResNet101、ResNet152函数 训练过程和测试结果代码汇总resnet.pytrain.pytest.py 前…...
Spring Boot 配置Kafka
1 Kafka Kafka 是由 Linkedin 公司开发的,它是一个分布式的,支持多分区、多副本,基于 Zookeeper 的分布式消息流平台,它同时也是一款开源的基于发布订阅模式的消息引擎系统。 2 Maven依赖 <dependency><groupId>org.springframework.kafka</groupId><…...
基于单片机的火灾报警器 (论文+源码)
1.系统设计 本系统由火灾检测模块、A/D转换模块、信号处理模块、声光报警模块和灭火装置模块组成。火灾检测模块由温度检测和烟雾检测构成,其温度传感器选用DS18B20,烟雾传感器选用MQ-2烟雾传感器。A/D转换模块选用常用的模数转换芯片ADC0832。声光报警…...
分析excel硕士序列数据提示词——包含对特征的筛选,非0值的过滤
文章目录 1 分析出发点2 围绕出发点的文件分析3 功能模块计算重心相关性计算教学倾向百分比多列相关性计算结果封装证伪——过滤0后的交叉相关系数封装和总控——批量处理特征筛选——筛选提问倾向最大和最小的前五代码总的清洗1 分析出发点 写一个python代码,遍历"D:\Ba…...
MongoDB 更新文档
关于MongoDB更新文档的操作,可以通过多种方法实现。以下是一些常用的方法: updateOne() 方法:用于更新匹配过滤器的单个文档。其语法为 db.collection.updateOne(filter, update, options)。其中,filter 用于查找文档的查询条件&a…...
分布式协同 - 分布式事务_TCC解决方案
文章目录 导图Pre流程图2PC VS 3PC VS TCC2PC(Two-Phase Commit,二阶段提交)3PC(Three-Phase Commit,三阶段提交)TCC(Try-Confirm-Cancel)2PC、3PC与TCC的区别2PC、3PC与TCC的联系 导…...
MFC/C++学习系列之简单记录13
MFC/C学习系列之简单记录13 前言memsetList Control代码注意 总结 前言 今天记录一下memset和List control 的使用吧! memset memset通常在初始化变量或清空内存区域的时候使用,可以对变量设定特定的值。 使用: 头文件: C&#…...
PostgreSQL表达式的类型
PostgreSQL表达式是数据库查询中非常重要的组成部分,它们由一个或多个值、运算符和PostgreSQL函数组合而成,用于计算出一个单一的结果。这些表达式类似于公式,可以用查询语言编写,并用于查询数据库中的特定数据集。 PostgreSQL表…...
速通Python 第四节——函数
一、函数 编程中的函数和数学中的函数有一定的相似之处. 数学上的函数, 比如 y sin x , x 取不同的值, y 就会得到不同的结果. 编程中的函数, 是一段 可以被重复使用的代码片段 代码示例 : 求一段范围的数的和 , 不使用函数 # 1. 求 1 - 100 的和 sum 0 for i in range(1, …...
如何在Windows系统上安装和配置Maven
Maven是一个强大的构建和项目管理工具,广泛应用于Java项目的自动化构建、依赖管理、项目构建生命周期控制等方面。在Windows系统上安装Maven并配置环境变量,是开发者开始使用Maven的第一步。本文将详细介绍如何在Windows系统上安装和配置Maven࿰…...
STM32之GPIO输出与输出
欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 文章目录 一.GPIO输入1.1GPIP简介1.2GPIO基本结构1.3GPIO位结构1.4GPIO的八种模式1.4.1浮空/上拉/下拉输入1.4.2 模拟输入1.4.3 推挽输出\开漏输出 二.GPIO输入2.1.按键介绍2.2传感器模块介绍2.3按键电路 一.G…...
linux定时器操作
目录 1 简单示例2 timer_create方式2.1 SIGEV_SIGNAL信号方式通知2.2 SIGEV_THREAD启动线程方式通知2.3 参数 1 简单示例 #include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <signal.h> #include <unistd.h>void setup_t…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
【实施指南】Android客户端HTTPS双向认证实施指南
🔐 一、所需准备材料 证书文件(6类核心文件) 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...
PH热榜 | 2025-06-08
1. Thiings 标语:一套超过1900个免费AI生成的3D图标集合 介绍:Thiings是一个不断扩展的免费AI生成3D图标库,目前已有超过1900个图标。你可以按照主题浏览,生成自己的图标,或者下载整个图标集。所有图标都可以在个人或…...
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...
