留言

使用 Amazon MSK 流式处理多租户数据 大数据博客

使用 Amazon MSK 流式处理多租户数据

作者:Emanuele Levi,Lorenzo Nicora 和 Nicholas Tunney发布日期:2024年6月20日相关链接:Amazon MSK、最佳实践、中级文章、SaaS永久链接

文章要点

实时数据流在当今数字化的世界中变得越来越重要,SaaS 应用程序依赖持续生成的数据。AWS 为 SaaS 开发商提供了使用 Amazon Kinesis 和 Amazon MSK 实施流媒体应用程序的基础架构。对于多租户模型的流式处理,SaaS 提供者需考虑数据隔离、性能公平性和租户隔离等因素。

在当今实时数据流的世界中,流式处理已经变得极为重要。当前现代的 SaaS 应用程序越来越依赖来自不同数据源如网页和移动应用程序、物联网设备、社交媒体平台和电子商务网站的持续生成数据。实时处理这些数据流对于提供即时和个性化的解决方案至关重要,这也是为何尽可能靠近事件时间处理这些数据至关重要。

AWS 透过提供所需的基础构建块来帮助 SaaS 供应商,使用 Amazon Kinesis Data Streams 和 Amazon Managed Streaming for Apache KafkaAmazon MSK,以及使用 Amazon Managed Service for Apache Flink 实施实时处理应用程序。

在本文中,我们将研究 SaaS 供应商在使用流媒体平台进行内部组件集成时可以采用的实施模式,这些流式数据并不会直接暴露给第三方。我们将特别关注 Amazon MSK。

流式多租户模式

在构建流式应用程序时,您应考虑以下几个维度:

数据分区 事件流和存储需要根据租户所有权在合适的级别物理或逻辑进行隔离。性能公平性 必须控制和限制处理来自不同租户的流式数据的应用程序之间的性能耦合。租户隔离 需要制定健全的授权策略,以确保租户只能访问自己的数据。

所有与多租户系统互动的底层概念是 SaaS 身份。欲了解更多资讯,请参阅 SaaS 架构基础。

SaaS 部署模型

对于 SaaS 供应商来说,租户隔离并不是可选的,其方式会根据部署模型的不同而有所差异。模型受业务需求的影响,而且这些模型并不互相排斥。在个别服务之间权衡开销,达到适当的隔离、复杂程度和成本平衡至关重要。没有通用解决方案,SaaS 供应商需要仔细考虑其业务和客户需求,以深入理解三种隔离策略: 孤岛、池 和 桥接或其组合。

在接下来的部分中,我们将探讨这些部署模型在数据隔离、性能公平性和租户隔离维度上的应用。

孤岛模型

孤岛模型代表了最高级别的数据隔离,但也会带来更高的运行成本。每个租户拥有一个专用的 MSK 集群会增加过度配置的风险,并要求重复管理和监控工具。

针对每个租户拥有专用的 MSK 集群,确保租户数据分区在使用 Amazon MSK Provisioned 模型时在磁碟层面发生。两种 Amazon MSK Provisioned 和 无伺服器 集群支援静态的伺服器端加密。Amazon MSK Provisioned 进一步允许您使用自管的 AWS 密钥管理服务 (AWS KMS) 密钥参见 Amazon MSK 加密。

在孤岛模型中,Kafka ACL 和配额并不是严格要求,除非您的业务需求要求它们。因为只有单一租户会使用整个 MSK 集群的资源,这就保证了性能公平性。这意味著特定租户的流量高峰不会影响其他租户,而也没有跨租户数据访问的风险。然而,为每个租户拥有一个专用集群还需要对每个租户进行正确的规划,这比池模式或桥接模型有更高的过度配置风险。

您可以透过 AWS 身份和访问管理 (IAM) 策略在 MSK 集群层级实施租户隔离,创建每集群的凭据,具体取决于所使用的认证方案。

使用 Amazon MSK 流式处理多租户数据 大数据博客

池模型

池模型是最简单的模型,租户共享资源。所有租户使用一个 MSK 集群,数据根据事件类型分为不同的主题例如,所有与订单相关的事件都发送到 orders 主题,而所有租户的事件都发送到同一主题。以下图表说明了这种架构。

该模型最大化了操作的简便性,但减少了可用的租户隔离选项,因为 SaaS 供应商无法区别每个租户的操作参数,所有隔离责任都委托给生产数据和消费数据的应用程序。池模型也不提供任何物理数据分区或性能公平性的机制。拥有这些需求的 SaaS 供应商应考虑桥接模型或孤岛模型。如果您没有需要考虑如每租户加密密钥或特定租户数据操作的需求,那么池模型提供的低复杂度是一个可行的选择。让我们更深入了解这些权衡。

flyingbird 飞鸟机场

实施消费者隔离的一个常用策略是使用租户 ID 来识别各事件。Kafka 提供的选项是将租户 ID 作为事件元数据标头或作为有效载荷中的显式字段进行传递。透过这种方法,租户 ID 将用作所有应用中消息有效载荷和事件标头中的标准化字段。这将减少组件处理和转发消息时的语意分歧风险,因为事件标头在不同的处理框架中处理方式不同,可能在转发时被删除。而相反,事件体通常作为单一物件转发,除非事件被显式转换,否则不会丢失任何包含的信息。在事件标头中包含租户 ID 可能简化服务的实施,让您可以不需要对消息有效载荷进行反序列化就能指定需要恢复或迁移的租户。

当使用标头或事件中的字段指定租户 ID 时,消费者应用无法选择性地订阅特定租户的事件。在 Kafka 中,消费者是订阅主题并接收所有发送到该主题的所有租户事件。只有在接收到事件后,消费者才能检查租户 ID 以过滤感兴趣的租户,这使得访问隔离几乎不可能。这意味著敏感数据必须加密,以确保租户在查看这些事件时无法读取其他租户的数据。在 Kafka 中,仅能在集群级别设定伺服器端加密,而共享集群的所有租户将使用相同的伺服器端加密密钥。

在 Kafka 中,数据保留仅能在主题上设置。在池模型中,所有租户的事件都被发送到同一主题,因此无法针对单一租户执行数据特定操作,例如删除所有租户的数据。Kafka 的不可变、只追加特性只允许删除整个主题,而不能选择性删除属于特定租户的事件。如果流中的特定客户数据需要遵循被遗忘权,例如遵守 GDPR,那么池模型不适用于该数据,应考虑孤岛模型以处理特定数据流。

桥接模型

在桥接模型中,所有租户共用一个 Kafka 集群,但来自不同租户的事件会被分别隔离到不同的主题。使用这个模型,为每个租户提供一组相关事件的主题。您可以通过采用主题命名约定例如,在主题名称中包含租户 ID来简化操作。这实际上会为每个租户创建一个命名空间,并允许不同的管理者来管理不同的租户,设置带有 前缀 ACL 的权限,从而避免命名冲突例如,与订单相关的事件对于租户1发送到 tenant1orders,而租户2的订单则发送到 tenant2orders。以下图表说明了这种架构。

在桥接模型中,无法进行使用每个租户密钥的伺服器端加密。来自不同租户的数据存储在同一 MSK 集群中,伺服器端加密密钥仅能在集群层级指定。出于相同原因,数据分隔仅能在文件层级实现,因为不同的主题存储在不同的文件中。Amazon MSK 将所有主题存储在同一 Amazon Elastic Block Store (Amazon EBS) 卷中。

桥接模型提供每个租户的自定义设置,例如保留政策或最大消息大小,因为 Kafka 允许您按主题设置这些参数。这个模型还简化了针对每个租户分隔和解耦事件处理的流程,让不同租户处理数据的应用程序之间有更强的隔离。

总结一下,桥接模型提供了以下功能:

租户处理分隔 消费者应用能够选择性订阅特定租户的主题,并仅接收该租户的事件。SaaS 供应商可以针对特定租户删除数据,有选择性地删除属于该租户的主题。选择性的处理扩展 在 Kafka 中,并行消费者的最大数量由主题的分区数量决定,而每个主题的分区数量可以设定,因此每个租户可设置。性能公平性 您可以使用 Kafka 配额来实现性能公平性,这在 Amazon MSK 中得到支援,防止处理特定繁忙租户的服务消耗过多集群资源,影响其他租户。欲了解有关 Amazon MSK 中 Kafka 配额的更多详细资讯,请参阅以下的 两部分系列文章。租户隔离 您可以使用 IAM 访问控制 或 Apache Kafka ACLs,具体取决于与 Amazon MSK 一起使用的认证方案。无论是 IAM 还是 Kafka ACLs,您都可以按主题控制访问权限。您可以授权应用程序仅访问其应该处理的租户的主题。

SaaS 环境中的权衡

尽管每个模型在数据分区、性能公平性和租户隔离方面提供了不同的能力,但它们也伴随著不同的成本和复杂性。在规划过程中,重要的是要确定您愿意为典型客户做出哪些权衡,并对您的客户订阅提供 分层结构。

下表总结了流式应用程序中的三种模型支持的能力。

池桥接孤岛每租户静态加密否否是可以针对单一租户实施被遗忘权否是是每租户保留政策否是是每租户事件大小限制否是是每租户可重播性是必须在消费者中实施逻辑是是

反模式

在桥接模型中,我们讨论了通过主题进行的租户分隔。另一种替代方法可能是通过分区进行分隔,其中所有类型的消息都发送到同一主题例如,订单,但每个租户都有专用的分区。这种方法有许多缺

Amazon RDS Proxy 对 PostgreSQL 扩展查询协议的多路复用支持 数据库博客 在 Amazon QuickSight 资产部署 API 的两个导出选项之间进行选择 商业智能博客