麦当劳的事件驱动架构


基于事件的架构实现了集成灵活性、可扩展性和多种实时能力。然而,这种架构的成功实施需要一个强大的平台来支持它。
在科技界,事件是程序识别并对系统硬件和软件产生影响的行为。在麦当劳,我们将整个技术堆栈中的事件用于异步、事务和分析处理用例,包括移动订单进度跟踪和向客户发送营销通信(交易和促销)。
统一事件平台旨在为跨不同域的服务和应用程序之间的实时数据流提供可扩展、安全且可靠的平台。它确保一致性并降低维护和采用事件架构所涉及的实施和操作复杂性。

在这篇由两部分组成的帖子中,我们将引导您完成实施过程并解释其工作原理。

挑战:虽然基于事件的集成在麦当劳并不是什么新鲜事,但我们拥有分布在全球各地的具有不同技能水平的开发团队,我们已经看到用于构建平台的各种技术和模式。缺乏标准化方法会导致实施不一致且操作复杂,从而影响可用性、可靠性和数据质量。当我们开始构想这个平台时,我们建立了一些高级设计目标,以使我们的团队能够朝着正确的方向工作。

设计目标:

  • 可扩展:需要自动扩展以适应流经它的越来越多的事件,而不会降低服务质量。
  • 可用:需要高度可用以承受其组件中的故障。
  • 高性能:事件应实时交付,并具有处理高并发工作负载的能力。
  • 安全:数据必须遵守有关加密、访问控制等的数据安全准则。
  • 可靠:必须可靠且控制到位,以避免丢失任何事件。
  • 一致:必须在围绕错误处理、弹性、模式演变、监控和灾难恢复的模式实现中保持一致性。
  • 简单:需要最大限度地降低实施和运营复杂性,并使团队能够轻松地在平台上构建。

考虑到这些目标,我们选择了一组工具、技术和模式来创建一个统一的平台。

引擎盖下:

在高层次上,可以创建事件并将其发送到体系结构,并且消费者(其他应用程序)进一步处理这些事件。它有几个关键组件:

  • 事件代理:我们使用 AWS Managed Streaming for Kafka Service (MSK) 来托管主题和事件,并为生成和使用事件提供语义,因为它与我们使用的其他 AWS 服务集成。在减少运营开销和灵活定制我们的用例之间取得良好的平衡非常重要。
  • Schema Registry:发布到基于事件的架构的事件遵循定义明确的契约,确保下游消费应用程序的数据质量,同时为事件模式变化时的生产应用程序提供清晰的演进路径。注册表在事件版本之间运行模式验证和兼容性检查。
  • 备用事件存储:为避免在 MSK 不可用时丢失消息,平台连接了备用数据存储,它将事件写入数据库。该架构提供工具和实用程序来读取消息并将它们发布回 MSK,一旦可用。
  • 自定义软件开发工具包 (SDK):我们构建了特定于语言的库,为生产者和消费者提供 API,以使用内置逻辑编写和读取架构事件,以执行模式验证、处理错误和实现重试模式。SDK 充当我们开发团队的加速器,提高他们的生产力并提供一致的方法来实施最佳实践。
  • 事件网关:麦当劳基于事件的架构旨在支持我们的应用程序内部生成的事件和外部合作伙伴应用程序产生的事件,这些事件通过具有身份验证和授权层的事件网关进行路由。网关提供了灵活性和抽象性,而不会暴露我们的内部主题管理。
  • 支持实用程序和工具:我们的开发人员和服务可靠性工程师拥有一套工具来纠正死信主题中的事件,提供集群运行状况的可见性并执行任何集群管理任务。