导读:这篇文章概述了麦当劳食品配送平台的架构。如果对各位有用,欢迎分享这篇文章。
本文将以故事形式描述麦当劳的架构流程与方法。
2024 年 3 月,德国柏林。Maria 在医院轮班结束后,正在午休。
但那天她没有带午餐,所以她又饿又累。于是她决定通过移动应用程序从麦当劳订餐。
麦当劳使用六边形架构来降低复杂性
可以将六边形架构想象为一种将核心应用程序与数据库和用户界面等外部服务分开的模式。
通过六边形架构连接外部服务
应用程序域位于六边形架构内部。业务逻辑遵循领域驱动设计(DDD )原则,这意味着它不应该泄漏到六边形的外面。
端口是应用程序与外部服务交互的接口。而适配器是端口的实现。这意味着端口定义契约或接口,而适配器提供实现来履行协议。
通过消息代理发送事件此外,麦当劳使用事件驱动架构和六边形架构。它提供模块化并保持架构的松散耦合。我们将事件驱动架构想象为一种使用事件在服务之间进行通信的模式。生产者将事件发布到消息代理。消费者订阅这些事件并做出相应的反应。因此它们使用六边形核心来表示领域逻辑。而适配器则产生和消费事件。
当域事件发生时,它们向消息代理发布事件。外部服务订阅消息代理以获取事件。
提高事件驱动架构的可靠性麦当劳使用模式注册表来维护定义明确的事件契约,这将有助于模式验证。此外,它们将事件模式缓存在服务中以提高系统性能。模式中描述了事件的预期数据字段和类型。此外,它们还运行备用数据库,以防止消息代理不可用时丢失数据。因此,事件会写入备用数据库,并在消息代理再次正常运行后发布回消息代理。此外,如果模式验证失败,它们会将事件路由到死信Topic,然后使用实用工具来修复这些事件。
麦当劳每天为大约 37000 个地区和 6400 万+用户提供服务。
系统可扩展性是一个难题。大规模分布式网络的可扩展性更加困难。然而他们将平台扩展到每秒 20,000 个订单,延迟低于 100 毫秒。
麦当劳后端架构
以下是麦当劳食品配送平台的架构与流程:
1. 从菜单中选择食物
Maria打开移动应用程序,将看到一个包含食品的菜单。
向用户展示菜单
他们使用反向代理服务器来托管所有 API 端点,并使用它将请求路由到微服务。这表示着架构具有 REST API 的API 网关模式。
系统将菜单和餐厅的工作时间存储在 SQL 数据库中。并使用无服务器函数查询 SQL 数据库,以创建 JSON 数据格式的菜单。
它们通过 HTTP 响应向用户显示可用食品的菜单与价格。
2. 通过忠诚度奖励获得折扣
Maria 从菜单中选择了巨无霸汉堡。然后她可以通过过去的购买积分购买。以及在后续中能够获得相关折扣。
折扣价格与奖励
他们将用户事件发布到消息队列中。它允许服务通过异步模式相互通信。此外,先进先出 ( FIFO ) 队列可保证事务的排序和一次性处理。
他们使用无服务器函数来轮询消息队列,然后处理其中的消息。接着使用无服务器来添加新功能,而无需担心基础设施。它还可以通过避免服务器配置来实现最大容量来帮助自己降低成本。
3. 点餐
Maria 在手机上下订单,可以是app也可能是微信小程序。
Maria 在手机上下订单,可以是app也可能是微信小程序。
验证订单系统创建 WebSocket 连接以与客户端进行双向通信。当创建新订单时,客户端会向 API 网关发送一个事件。接下来,API 网关将该事件转发到事件总线,它有一个可以识别新订单的路由系统。将事件总线视为服务之间消息的中心枢纽。事件总线触发无服务器函数来检查餐厅是否有订购的食物。简而言之,它验证特定订单是否可以完成。
然后,当餐厅接受订单时,它会向客户端发送一个事件。
此时使用内存缓存和 Redis 来处理订单。它提供高性能和低延迟。此外,他们还将 Redis 备份到关系数据库中,以确保在发生中断时保持持久性。
而验证订单的无服务器函数则在那里等待回调。它用于在食物准备好由送货司机取货时通知用户。此外,它们将无服务器函数的回调任务令牌存储在键值数据库中。
他们使用预计到达时间 ( ETA ) 和食物准备时间来通知司机接载。它有助于避免额外的等待时间。
完成订单
当司机靠近餐厅时,他们使用单独的无服务器功能来触发事件。事件总线将识别是否是现有订单的事件,如果是,则查询键值数据库以获取回调任务令牌。
然后它将该事件转发给等待的无服务器函数。然后等待的无服务器函数将释放订单。它还通知用户已经取走了他们的食品。
4. 提供反馈
Maria 对她吃到的汉堡很是满意。与此同时,她收到了麦当劳的反馈调查通知。
Maria 对她吃到的汉堡很是满意。与此同时,她收到了麦当劳的反馈调查通知。
用户反馈架构
餐厅需要有关用户体验的数据来改进员工的服务。
他们进行调查并收集社交媒体评论,并进行提取-转换-加载(ETL )来分析信息,然后数据存储在 S3 或相关对象存储中。
随后,他们将数据发送到自然语言处理(NLP )服务进行情感分析。此外,处理后的数据会发送到内部模型以提高其准确性。最后,果数据存储在数据仓库中,用以创建操作报告。
他们的食品配送平台运行微服务来支持更多功能。并使用负载均衡器在微服务之间分配流量。
然而,每个微服务都有不同的规模和运行时配置文件。这意味着面向客户的服务被认为至关重要。而后台处理服务是可以容忍失败的。
他们将经常变化的服务转移到单独的微服务中。这样他们就可以更快地部署和迭代。
他们进行冒烟测试来检查 API 的响应能力。将冒烟测试想象为一种快速且基本的测试来检查功能。
此外,他们还使用断路器逻辑和指数退避来实现弹性。并注重自动化以减少运营工作量。
麦当劳仍然是世界上最大的快餐连锁店之一。