现代应用开发 — 消息传递

消息传递解决方案将您的应用的组件连接起来,使它们能够可靠地交换数据,透明地扩展,并实现高可用性。它们使您能够分离数据生成器的处理,高效地缓冲未处理的消息,并提供消息持久性、处理可扩展性和应用弹性。

面向消息的应用程序涵盖一系列体系结构 - 组件之间的数据传输可能是明确定义的分布式和聚合处理管道的一部分,或者组件可以将消息发布到独立发展的多个独立下游系统。有三种常见的现代消息传递模式,每一种模式都有共享和不同的应用要求:

事件流处理

事件流处理应用摄取大量高速的数据流,这些数据必须实时处理。必须处理原始数据以提取可能由其他应用程序组件使用的洞察,以便进行监视,或者可以存储这些洞察以供日后分析。

下面是 maf-messaging-streaming.png 的说明
插图 maf-messaging-streaming.png 的说明

maf-messaging-streaming-oracle.zip

此事件流处理应用程序示例使用 Oracle Cloud Infrastructure Streaming 或 Oracle Transactional Event Queues (TEQ) 作为底层消息传递解决方案,使用 Oracle Cloud Infrastructure Functions 进行实时处理,使用 Oracle Autonomous Database 作为后备存储。

发布/订阅

发布 - 订阅或发布/订阅是一种通信模式,其中数据生成器将数据发布到特定的主题,然后任何数量的下游使用者都可以通过订阅这些主题来使用这些主题。生产者与消费者之间的耦合是相当松散的,这样消费者可以独立发展,而不会影响上游生产者。

下面是 maf-messaging-publishers-subscribeers.png 的说明
插图 maf-messaging-publishers-subscribeers.png 的说明

maf-messaging-publishers-subscribeers-oracle.zip

此示例说明如何使用 Oracle Cloud Infrastructure Streaming 或 Oracle TEQ 来实施发布/订阅消息模式。

消息队列

通过消息排队,可以进行分布式有状态的处理,其中上游和下游组件紧密绑定,并一起实施应用程序工作流。消息传递解决方案必须支持至少一次传送之类的语义,以确保在使用消息之前不会丢失消息。

下面是 maf-messaging-queuing.png 的说明
插图 maf-messaging-queuing.png 的说明

maf-messaging-queuing-oracle.zip

此示例说明如何使用 Oracle Cloud Infrastructure Queue 或 Oracle TEQ 来实施消息排队。

设计原则

使用以下设计原则构建消息传送应用程序或平台。
  • 使用 REST API 构建应用作为服务套件进行通信

    使用 Kafka 和 JMS 等行业标准 API,可以提供应用互操作性,并无缝构建混合和多云消息传递应用。Oracle Cloud Infrastructure (OCI) 流处理提供了一个 Kafka 兼容 API,Oracle 事务处理事件队列 (TEQ) 同时支持 Kafka 和 JMS API。Kafka 和 JMS 都得到了第三方产品的广泛支持。例如,您可以使用 Confluent Kafka JMS 连接器在 Oracle TEQ 和 Kafka 之间传输消息。您还可以使用 Oracle Container Engine for Kubernetes 集群上部署的 Kafka Connect 与第三方产品连接。可以使用 RESTful API 定义(具有 OpenAPI 规范)或使用行业标准 STOMP 协议调用 Oracle Cloud Infrastructure Queue

  • 使用托管服务消除应用开发和运维的复杂性

    通过内置基础设施维护和安全打补丁(例如 OCI 流处理、OCI 队列以及 Oracle Autonomous Database (ADB) 的 Oracle TEQ 和高级排队 (Advanced Queuing,AQ) 功能)使用完全托管的服务。这些服务具有高可用性,可以在可用性域之间进行自动复制,并支持扩展自动化来应对不断变化的负载。

  • 将应用层保持无状态

    消息传递相关状态(例如消息队列中的位置)绝不应存储在应用程序或本地文件系统中,因为这样做可能会在应用程序实例失败时导致数据丢失。应用可能会缓存消息内容进行处理,但消息传递解决方案应该始终是所有消息传递数据的唯一事实来源。相关元数据(例如消息队列中的位置)应存储在数据库或对象存储中,以避免丢失消息并确保幂等的操作。这有助于实现故障恢复,同时还可轻松扩展或收缩服务,而不会丢失正确性。

  • 检测端对端监视和跟踪

    保持对应用程序的运行状况、性能和运行状态的权威性了解。使用 Oracle Cloud Observability and Management Platform 服务组合,可以在应用堆栈的所有层(从数据生成者和使用者到消息传递管道本身)中获得可见性和具体可行的洞察。监视队列长度和处理持续时间,以捕获错误和瓶颈并检测订阅主题的服务问题。

  • 通过自动数据复制和故障恢复消除单点故障

    将消息传递数据备份到持久存储,以满足法规和合规性需求。使用跨区域备份进行灾难恢复。将幂等性整合到消息传递应用中,例如在 OCI 队列中使用消息可见性超时。在不阻塞主执行管道的情况下,将不可恢复的错误写入单独的流、死信队列或持久存储。

  • 实施自动化深度防御方法来保护您的应用及其数据

    实施 Oracle Cloud Infrastructure Identity and Access Management (IAM) 策略,仅允许授权用户从 OCI 流和队列创建、发送或接收数据。使用专用端点和服务网关保护消息传递端点访问,从而限制互联网访问,从而应用最低可访问性原则。使用 OCI 流处理、OCI 队列和 TEQ 的现成功能对静态和传输中的数据进行加密,从而实现数据保密性。但是,如果需要增加密钥轮换的所有权,请使用 Oracle Cloud Infrastructure Vault 服务安全地管理主密钥。

体系结构

下图显示了如何使用 OCI 流处理来实施事件流
后面是 maf-messaging.png 的说明
插图 maf-messaging.png 的说明

maf-messaging-oracle.zip

使用 OCI 流处理实现事件流处理和发布/订阅消息传递模式,使用 Oracle Cloud Infrastructure Queue 实施消息排队。使用 Oracle Autonomous Database 保存已处理的事件数据。OCI 函数可用于在事件数据被下游应用程序组件使用或持久保存到数据库之前对其进行处理。

通过为应用和数据库使用专用子网,以及为消息传递服务实施网络隔离。使用专用端点保护对流的访问。使用 Oracle Cloud Infrastructure Identity and Access Management (IAM) 策略限制对队列的访问

使用 Oracle Cloud Infrastructure Object Storage 实现长期消息保留。使用 Service Connector 等无服务器服务将数据从 OCI 流处理无缝迁移到对象存储,并启用对象存储的跨区域备份以实现多层备份。使用在容错 Oracle Container Engine for Kubernetes (OKE) 环境中部署的 Kafka MirrorMaker 2.0 实施跨区域灾难恢复策略,以便在流之间异步复制数据。此设置启用恢复时间目标 (Recovery Time Objective,RTO) 和恢复点目标 (Recovery Point Objective,RPO) 分钟。使用远程 VCN 对等连接可确保在数据传输过程中延迟最短。

使用死信队列来隔离有问题的消息。创建队列时会自动创建死信队列。死信队列有助于避免失败的消息阻止主要执行管道。然后,可以分析死信队列中的消息,以确定它们失败的原因。

通过将已处理消息的偏移存储在外部存储(例如对象存储)中,将幂等性整合到应用中。通过查询外部存储来检测和放弃重复项。对易于恢复并允许重放消息的错误进行分类。

此体系结构使用以下服务和技术:

  • Oracle Cloud Infrastructure 流处理提供了一个完全托管、可扩展且持久的存储解决方案,可以摄取连续的高容量数据流,您可以实时使用和处理这些数据。您可以使用流式处理来摄取大量数据,例如应用程序日志、运行遥测、Web 点击流数据;或用于发布 - 订阅消息传送模型中连续生成和处理数据的其他用例。

  • 队列

    Oracle Cloud Infrastructure 队列提供了一个可扩展的系统来处理消息,同时处理复杂的管理任务,例如保证至少一次处理、跟踪和客户端隔离。此集中式服务还管理消息排序和处理状态,从而允许无状态客户机进程卸载游标跟踪。

  • 函数

    Oracle Cloud Infrastructure Functions 是一个完全托管的多租户、高度可扩展的按需函数即服务 (FaaS) 平台。它由 Fn Project 开源引擎提供支持。使用函数可以部署代码,直接调用代码或触发代码以响应事件。Oracle Functions 使用 Oracle Cloud Infrastructure Registry 中托管的 Docker 容器。

  • 服务连接器

    Oracle Cloud Infrastructure 服务连接器中心是一个云消息总线平台,用于编排 OCI 中服务之间的数据移动。您可以使用服务连接器将数据从源服务移动到目标服务。通过服务连接器,您还可以选择指定要在将任务(例如函数)传送到目标服务之前对数据执行的任务。

    您可以使用 Oracle Cloud Infrastructure 服务连接器中心快速构建用于安全信息和事件管理 (SIEM) 系统的日志记录聚合框架。

以数据库为中心的替代架构

此体系结构使用事务事件队列 (TEQ) 在现代应用程序中实施消息传递模式。TEQ 是 Oracle Autonomous Database 的一项内置功能。

下面是 maf-messaging-alternate.png 的说明
插图 maf-messaging-alternate.png 的说明

maf-messaging-alternate-oracle.zip

该架构简单易用,无需使用外部流处理或排队服务,并提供事务性消息传递功能来简化常见微服务模式。

TEQ 将数据和消息处理整合到一个可扩展的基础设施中,从而简化生命周期管理、安全性和灾难恢复,同时提供高性能。TEQ 支持常见的消息传递模式,包括流处理、排队和发布/订阅。您可以使用 TEQ 在消息传递和数据库操作中实施事务,轻松实施事务发件箱等消息传递模式,以及只需很少或没有额外代码就可实现一次消息传递。Oracle TEQ 为数据库中运行的应用程序提供即时消息。这意味着无需维护消息 ID 即可检查重复的消息或在应用程序级别构建幂等使用者。TEQ 支持事件处理中典型的小消息,以及与业务工作流关联的大型有效负载,还可以充当安全事件网格。

消除外部流或排队服务可以简化状态管理。事件和消息存储在应用程序使用的同一数据库中。这样,您可以在事件、消息和应用更改之间轻松实现和维护一致性。如果出现需要时间点恢复或灾难恢复的故障,则所有内容(事件、消息和应用程序数据)将自动恢复到一致的状态。

TEQ 从 Autonomous Database 的高可用性中获益。TEQ 中的消息传递数据由 ADB 使用 Autonomous Data Guard 的跨区域复制自动备份和保护。您可以使用 Oracle Real Application Clusters 和 Oracle Active Data Guard 以高可用性方式部署 Oracle TEQ,两者都是 Oracle Autonomous Database 的内置功能。Oracle Real Application Clusters 在区域内提供可用性,而 Oracle Active Data Guard 提供跨区域的灾难恢复保护。

如果应用程序执行以下任何操作,请使用此体系结构:

  • 需要实施消息队列,并且需要诸如事务处理发件箱之类的语义
  • 不需要对数据库和消息传递基底进行独立扩展

此体系结构使用以下服务和技术:

  • 事务处理事件队列 (TEQ) 和高级队列 (AQ)

    事务处理事件队列 (TEQ) 和高级排队 (Advanced Queuing,AQ) 是与 Oracle Database 集成的强大功能丰富的消息排队系统。事务处理事件队列 (TEQ) 是高性能分区的内存中实施,每个队列具有多个事件流。高级排队 (Advanced Queuing,AQ) 适用于更简单的工作流用例。这些功能利用 Oracle Database 来持久保存消息并提供高吞吐量和可扩展性。

  • 函数

    Oracle Cloud Infrastructure Functions 是一个完全托管的多租户、高度可扩展的按需函数即服务 (FaaS) 平台。它由 Fn Project 开源引擎提供支持。使用函数可以部署代码,直接调用代码或触发代码以响应事件。Oracle Functions 使用 Oracle Cloud Infrastructure Registry 中托管的 Docker 容器。

不推荐的体系结构

  • 单体消息和服务总线应用

    RabbitMQ 等消息传递解决方案可以通过开放标准和 API 支持与其他组件的集成。然而,这些解决方案需要大量的中小企业管理工作,如果没有自我管理的复杂拓扑,可能无法提供分布式冗余和高可用性。

  • 自我管理云或内部部署环境中的 Kafka 集群

    此解决方案虽然提供了可扩展性和高可用性,但需要大量的专业开发人员知识和广泛的 SME 操作管理开销。在选择此选项之前,请仔细考虑,因为生产的提前期和总拥有成本 (TCO) 的风险。

考虑事项

实施消息传送设计模式时,请考虑这些实施选项。

根据您的应用需求选择合适的消息传递平台

基础平台和服务可能会出现类似的情况并共享常见功能。但是,每个平台都具有独特的特性和优势,可以更好地满足您的应用需求。例如:

  • 如果您的应用需要提供消息重放和发布子功能的实时高吞吐量消息传递平台,请使用 OCI 流处理或事务处理事件队列。
  • 如果您需要可扩展的可靠点对点缓冲区来异步移动数据,请使用事务处理事件队列。
  • 使用服务连接器中心 (Service Connector Hub,SCH) 启用与基础结构资源的集成。
  • 使用与 Oracle Autonomous Database 集成的消息传递设计新微服务时,在数据库中使用事务处理事件队列 (TEQ)。

公共案例分析

Oracle 基于流处理的体系结构

Tango Eye 将监视视频转化为零售行业切实可行的洞察。

  • Oracle Cloud Infrastructure (OCI) 流处理   充当各种微服务的低维护发布 - 订阅消息传送系统。 
  • Oracle Cloud Infrastructure Functions 在不进行工程设计监督的情况下执行无服务器作业。
  • Oracle Cloud Infrastructure Object Storage 的生命周期策略可自动归档和清除数据,无需降低 Tango Eye 基于人工智能的分析价值。

基于 Oracle TEQ 的体系结构

FedEx 使用 Oracle E-Business Suite 以及通过 Oracle TEQ 构建的业务活动经理来支持每天交付的 1550 万包的应收账款。

  • FedEx 已使用 Exadata Cloud Service 将 E-Business Suite 迁移到 Oracle Cloud Infrastructure Object Storage。E-Business Suite 工作流和业务事件系统完全基于 Oracle Advanced Queuing (AQ) 消息传送构建。
  • Oracle AQ 易于使用,适用于工作流编排。对于高吞吐量事件,Oracle TEQ 是可与 apache Kafka 互操作的每队列包含多个事件流的高性能直接接入替换对象。

部署

通用健康组织 (Universal Health Organization,UHO) 是一个遵循现代应用开发框架原则的示例应用程序。特别是,它实施了 Web 或移动、消息传递和事件驱动的架构模式的元素,可在 GitHub 上使用。
  1. 转到 GitHub
  2. 将系统信息库克隆或下载到本地计算机。
  3. 按照 README 文档中的说明进行操作。

更改日志

此日志列出重大更改:

确认

Authors: Harshad Kasture, Randall Barnes, Matthias Brantner

Contributors: Hassan Ajan, James Emerson, Parvez Syed Mohamed, Sajan Parihar, Wei Hu, Sreya Dutta, Joshua Stanley