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…...
Clickhouse(Centos)
地址信息 官网地址:Fast Open-Source OLAP DBMS - ClickHouse 下载地址:packages.clickhouse.com/rpm/stable/ 1.clickhouse-client-23.1.3.5.x86_64.rpm 2.clickhouse-common-static-23.1.3.5.x86_64.rpm 3.clickhouse-common-static-dbg-23.1.3.5.x86_…...
赛博错题本
机构抽象老师非得让我们整一个错题本,我寻思都学计算机了,还在整高中做题呢一套是什么意思呢,更何况考试也就一周一次,你整个本完完全全没有必要,整个赛博错题本得了。以后错题都会存在这里,基本上一周一更…...
【MySQL初阶】Ubuntu 环境安装 MySQL
🎉博主首页: 有趣的中国人 🎉专栏首页: 数据库初阶 🎉其它专栏: C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好,本片文章将会讲解 Ubuntu 系统安装 MySQL 的相关内容。 如果看到最后您觉得这篇…...
【Kubernetes 指南】基础入门——Kubernetes 基本概念(二)
目录 二、Pod 1、Pod 简介 2、Pod 图示 3、nginx 容器 二、Pod 1、Pod 简介 - Kubernetes 使用 Pod 来管理容器,每个 Pod 可以包含一个或多个紧密关联的容器。 - Pod 是一组紧密关联的容器集合,它们共享 PID、IPC、Network 和 UTS namespace&#…...
Ubuntu系统下 npm install -g tauri 报错问题处理
处理在安装 Tauri 时遇到的问题,可以按照以下步骤进行操作 npm install -g taurinpm warn deprecated inflight1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async …...
数字逻辑(六)——下载Digital软件
Digital是一种用于设计和仿真数字逻辑电路的教育工具,它是免费、开源和跨平台的。这款软件十分适合新人,可以使用画简单的电路。 1 下载Digital软件 首先Digital的下载地址是: https://github.com/hneemann/Digital 下载完成之后&…...
Ruby Raider使用教程
Ruby Raider是什么? Ruby Raider 是一款生成器和脚手架 gem,可让 UI 测试自动化更容易 Github链接:https://github.com/RaiderHQ/ruby_raider 目前支持的框架 Web自动化测试 Cucumber and Selenium Rspec and Selenium Cucumber and Wa…...
音视频入门基础:AAC专题(13)——FFmpeg源码中,获取ADTS格式的AAC裸流音频信息的实现
音视频入门基础:AAC专题系列文章: 音视频入门基础:AAC专题(1)——AAC官方文档下载 音视频入门基础:AAC专题(2)——使用FFmpeg命令生成AAC裸流文件 音视频入门基础:AAC…...
Spring Boot 中的 @Scheduled 定时任务以及开关控制
Scheduled注解是Spring框架(包括Spring Boot)中用于实现定时任务的一种方式。以下是对Scheduled注解的详细解析: 一、基本概念 Scheduled注解允许开发者在Spring容器中定义定时任务。通过简单地在一个方法上添加Scheduled注解,S…...
基于PXE与NFS共享的Ubuntu安装配置过程
假设存在服务器A、B、C 其中A为待装系统的服务器,DHCP(IP池:192.168.0.150~192.168.0.160),假设需要安装的系统为Ubuntu 22.04 Desktop 其中B为PXE服务端服务器,IP: 192.168.0.100,这里将以Cent…...
Dots 常用操作
游戏中有多个蚂蚁群落,每个蚂蚁属于一个群落,如何设计数据结构? 方法1:为蚂蚁组件添加一个属性 ID,会造成逻辑中大量分支语句,如果分支语句逻辑不平衡可能带来 Job 调度问题,每个蚂蚁会有一份蚂…...
力扣-图论-20【算法学习day.70】
前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非…...
ModbusTCP从站转Profinet主站案例
一. 案例背景 在复杂的工业自动化场景中,企业常常会采用不同品牌的设备来构建生产系统。西门子SINAMICS G120变频器以其高性能、高精度的速度和转矩控制功能,在电机驱动领域应用广泛。施耐德M580可编程逻辑控制器则以强大的逻辑控制和数据处理能力著称&…...
Linux 线程池
1.概念介绍 线程池是一种多线程处理形式,它维护着多个线程,这些线程处于等待状态,随时准备接受任务并执行。线程池的主要目的是为了提高系统的性能和资源利用率,避免在处理短时间任务时频繁创建和销毁线程所带来的开销。 线程池…...
计算机视觉目标检测-1
文章目录 摘要Abstract1.目标检测任务描述1.1 目标检测分类算法1.2 目标定位的简单实现思路1.2.1 回归位置 2.R-CNN2.1 目标检测-Overfeat模型2.1.1 滑动窗口 2.2 目标检测-RCNN模型2.2.1 非极大抑制(NMS) 2.3 目标检测评价指标 3.SPPNet3.1 spatial pyr…...
2024最新鸿蒙开发面试题合集(一)-HarmonyOS NEXT Release(API 12 Release)
1. HarmonyOS应用打包后的文件扩展名是? 打包后的文件扩展名为.hap(HarmonyOS Ability Package),这是HarmonyOS应用的标准包格式 2. 页面和自定义组件生命周期有哪些? 页面和自定义组件生命周期说明 有Entry装饰器的component组件的生命…...
HarmonyOS NEXT 实战之元服务:静态案例效果--航空出行
背景: 前几篇学习了元服务,后面几期就让我们开发简单的元服务吧,里面丰富的内容大家自己加,本期案例 仅供参考 先上本期效果图 ,里面图片自行替换 效果图1完整代码案例如下: import { authentication } …...
详解 Python 中的json.loads和json.dumps方法:中英双语
中文版 详解 Python 中的 json.loads 和 json.dumps 方法 在 Python 的标准库中,json 模块用于处理 JSON 数据格式。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于前后端交互以及数据存储。json.loads …...
成方金融科技后端部分笔试题 - 解析
单选题 1.以下关于JAVA自动类型转换,描述错误的是哪一项?(B) A.byte->short B.char->short C.char->int D.float->double 2.请选择运行以下代码后,系统显示的内容什么?(B) public class Test {static {int x1;}static int x,y;publ…...
互联网视频云平台EasyDSS无人机推流直播技术如何助力野生动植物保护工作?
在当今社会,随着科技的飞速发展,无人机技术已经广泛应用于各个领域,为我们的生活带来了诸多便利。而在动植物保护工作中,无人机的应用更是为这一领域注入了新的活力。EasyDSS,作为一款集视频处理、分发、存储于一体的综…...
Vue3 中使用axios
1.安装axios、js-cookie、pinia axios命令行: npm install axios js-cookie命令行: npm install js-cookie store命令行: npm install pinia 2.配置文件 (1)缓存文件配置 src/plugins/auth.js const sessionCache {set (key, valu…...
【JAVA高级篇教学】第五篇:OpenFeign 微服务调用注意事项
在微服务架构中,OpenFeign 是一种常用的 HTTP 客户端工具,用于实现服务之间的调用。它提供了声明式的接口调用方式,大幅简化了开发工作。然而,在实际使用中,需要注意一些细节,尤其是在处理 GET、POST 请求和…...
Llama 3 简介(一)
目录 1. 引言 1.1 Llama 3 的简介 1.2 性能评估 1.3 开源计划 1.4 多模态扩展 ps 1. 缩放法则 2. 超额训练(Over-training) 3. 计算训练预算 4. 如何逐步估算和确定最优模型? 2. 概述 2.1 Llama 3 语言模型开发两个主要阶段 2.2…...
路由器做WPAD、VPN、透明代理中之间一个
本文章将采用家中TP-Link路由器 路由器进行配置DNS DNS理解知识本文DNS描述参考:网络安全基础知识&中间件简单介绍_计算机网络中间件-CSDN博客 TP LINK未知的错误,错误编号:-22025 TP-LINK 认证界面地址:https://realnam…...
Xcode 16 编译弹窗问题、编译通过无法,编译通过打包等问题汇总
问题1:打包的过程中不断提示 :codesign 想要访问你的钥匙串中的密钥“develop 或者distribution 证书” 解决:打开钥匙串,点击证书---显示简介---信任----改为始终信任 (记住 :不能只修改钥匙的显示简介的…...
【编辑器扩展】打开持久化路径/缓存路径/DataPath/StreamingAssetsPath文件夹
代码 [MenuItem("Assets/Open Explorer/PersistentDataPath")]public static void OpenPersistentDataPath(){Application.OpenURL(Application.persistentDataPath);}[MenuItem("Assets/Open Explorer/DataPath")]public static void OpenDataPath(){Appl…...
shardingsphere分库分表项目实践1-让shardingsphere运行起来
学习新技术最快的方式就是: 1. 先找一个比较完善的demo跑起来 2. 弄清楚用法:配置、原理、使用场景 3. 移植到自己项目上,按照自己需求进行修改优化。 找demo项目的方法:优先去官方git库找,如果没有或者过于简单那么…...
Java预加载
预加载(Preload)是一种在程序运行之前预先加载所需资源或对象的优化技术,旨在提高程序的性能和响应速度。以下是对预加载的详细解释: 一、预加载的定义 预加载是指在程序实际运行之前,将预计会频繁使用的资源&#x…...
Vue3之状态管理Vuex
Vuex作为Vue.js的官方状态管理库,在大型或复杂的前端项目中扮演着至关重要的角色。本文将从Vuex的原理、特点、应用场景等多个方面进行深入解析,并通过代码示例展示如何在Vuex中实现特定功能。 一、Vuex原理 Vuex是一个专为Vue.js应用程序开发的状态管…...
优化 invite_codes 表的 SQL 创建语句
-- auto-generated definition create table invite_codes (id int auto_incrementprimary key,invite_code varchar(6) not null comment 邀请码,6位整数,确保在有效期内…...
ctfhub disable_functions关卡
1.CTFHub Bypass disable_function —— LD_PRELOAD 2.CTFHub Bypass disable_function —— ShellShock 3.CTFHub Bypass disable_function —— Apache Mod CGI 4.CTFHub Bypass disable_function —— 攻击PHP-FPM 5.CTFHub Bypass disable_function —— GC UAF 6.CTFHub B…...
Pikachu 漏洞练习平台 XXE漏洞学习记录
懒得自己搭建的可以直接FOFA找别人的靶场玩 FOFA "Pikachu 漏洞练习平台" 开始 随便输入个包含命名实体(内部实体)的xml数据(以下代码中xxe是命名实体的实体名称): <?xml version"1.0"?>…...
机器学习基础 衡量模型性能指标
目录 1 前言 编辑1.1 错误率(Error rate)&精度(Accuracy)&误差(Error): 1.2 过拟合(overfitting): 训练误差小,测试误差大 1.3 欠拟合(underfitting):训练误差大,测试误差大 1.4 MSE: 1.5 RMSE: 1.6 MAE: 1.7 R-S…...
C#—内建接口: IEnumerable与IEnumerator接口详解
IEnumerable接口 在C#中,IEnumerable 是一个泛型接口,它表示一个可以通过 IEnumerator 迭代器进行迭代枚举的集合。这个接口是非常基础且重要的,因为它允许开发者以一致的方式遍历任何实现了该接口的集合,无论是数组、列表、自定…...
java日志框架:slf4j、jul(java.util.logging)、 log4j、 logback
SLF4J--抽象接口 SLF4J (Simple Logging Facade for Java) 是一个为各种 Java 日志框架提供简单统一接口的库。它的主要目的是将应用程序代码与具体的日志实现解耦,使得在不修改应用程序代码的情况下,可以轻松地切换不同的日志框架。 jul-to-slft4j.ja…...
SpringBoot 事务
事务是一组操作的集合, 是一个不可分割的操作.会把所有的操作作为一个整体, 一起向数据库提交或者是撤销操作请求. 所以这组操作要么同时成功, 要么同时失败. 为什么需要事务? 我们在进行程序开发时, 也会有事务的需求. 比如转账操作: 第一步:A 账户 -100 元. …...
airflow docker 安装
mkdir -p /root/airflow cd /root/airflow && mkdir -p ./dags ./logs ./plugins ./configcd /root/airflow/ wget https://airflow.apache.org/docs/apache-airflow/2.10.4/docker-compose.yaml nano docker-compose.yamlAIRFLOW__CORE__LOAD_EXAMPLES: false #初始化…...
如何用gpt来分析链接里面的内容(比如分析论文链接)和分析包含多个文件中的一块代码
如何用gpt来分析链接里面的内容,方法如下 这里使用gpt4里面有一个网路的功能 点击搜索框下面这个地球的形状即可启动搜索网页模式 然后即可提出问题在搜索框里:发现正确识别和分析了链接里面的内容 链接如下:https://arxiv.org/pdf/2009.1…...
linux 常用 Linux 命令指南
常用 Linux 命令指南 以下是一些常用的 Linux 命令,分类并附带简单说明,适合日常操作和快速参考。 1. 文件与目录操作 ls: 列出当前目录下的文件和子目录ls -l # 显示详细信息 ls -a # 显示隐藏文件cd: 切换目录cd /path/to/directorypwd: 显示当前工作目录pwdmkdir: 创…...
《战神:诸神黄昏》游戏运行时提示找不到emp.dll怎么办?emp.dll丢失如何修复?
《战神:诸神黄昏》游戏运行时提示找不到emp.dll怎么办?emp.dll丢失的修复方法 在畅游《战神:诸神黄昏》这款史诗级游戏的过程中,如果突然遭遇“找不到emp.dll”的错误提示,无疑会打断你的冒险之旅。作为一名深耕软件开…...
PHP中替换某个包或某个类
在使用composer组件时,有时候需要对包进行一些自定义修改,有一些教程中写需要修改composer.json,然后发布到Packagist,但如果只是适应自己需求所作的小修改,其实并没有必要发布到Packagist,而这样做也是Pac…...
亚信安全春节14天双倍假期通告
亚信安全14天双倍假期来袭 “网安福利王”再次实至名归 2024年 8773小时,31582680秒 亚信安全一直驰骋于云网安世界 奋战在“安全 数智化”的壮阔征途上 如今,新春的脚步渐近 长达14天的春节长假 能让我们暂且放下忙碌的工作 去除班味,…...
kubernetes存储架构之PV controller源码解读
kubernetes存储之PV controller源码解读 摘要 本文介绍kubernetes存储架构的基础,并重点对PV controller的源码进行了学习 引入 从一个业务场景出发,假如你所在的公司,有个物理机,上面部署了web服务器,随着业务…...
Kubernates
kubernates是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。 架构…...
1.使用 Couchbase 数仓和 Temporal(一个分布式任务调度和编排框架)实现每 5 分钟的增量任务
在使用 Couchbase 数仓和 Temporal(一个分布式任务调度和编排框架)实现每 5 分钟的增量任务时,可以按照以下步骤实现,同时需要注意关键点。 实现方案 1. 数据层设计(Couchbase 增量存储与标记) 在 Couchb…...
设计模式的主要分类是什么?请简要介绍每个分类的特点。
大家好,我是锋哥。今天分享关于【设计模式的主要分类是什么?请简要介绍每个分类的特点。】面试题。希望对大家有帮助; 设计模式的主要分类是什么?请简要介绍每个分类的特点。 1000道 互联网大厂Java工程师 精选面试题-Java资源分…...
Webpack学习笔记(5)
1.拆分开发环境和生产环境配置 很多配置在开发环境和生产环境存在不一致的情况,比如开发环境没有必要设置缓存,生产环境需要设置公共路径等等。 2.公共路径 使用publicPath配置项,可以通过它指定应用程序中所有资源的基础路径。 webpack.…...
Unity 6 中的新增功能
Unity 6 是 Unity 的最新版本。 一、编辑器和工作流程 Unity 6 中引入的更改 在 Linux 上实现了将文件和资源从 Unity 拖放到外部应用程序的功能。将 Asset Manager for Unity 包添加到 Package Manager > Services > Content Management 部分中。此包允许用户轻松浏览…...
【前端 Uniapp】使用Vant打造Uniapp项目(避坑版)
一、基本介绍 Uniapp 是基于 Vue.js 的开发框架,通过一套代码可以同时发布到多个平台的应用框架。而 Vant 是针对移动端 Vue.js 的组件库。通过这样的组合,我们可以快速构建出一个跨平台的移动应用。Vant 已经支持多种小程序和 H5 平台,也对…...