MSK 与 SQS + SNS

MSK vs SQS + SNS

我正在决定是应该使用 MSK(来自 AWS 的托管 kafka)还是 SQS + SNS 的组合来实现发布子模型?

背景

目前,我们有一个微服务架构,但我们不使用任何消息服务,只使用 REST api(不要问为什么 - 与设计该架构的一些第 3 方供应商有关)。现在,我想改造它并开始使用消息传递来进行微服务之间的通信。

最初,计划是开始发布实体事件供任何其他微服务使用 - 这些事件也将存储在 S3 的数据湖中,这也将作为启动数据团队的基础。

稍后,我想将某些功能从 REST 移动到异步通信。

无论如何,我的主要问题是 - 我应该决定使用 MSK 还是应该使用 SQS + SNS? (我已经了解了基本概念,但想从其他社区了解是否还有其他优缺点)?

提前致谢

MSK VS SQS+SNS 算不上1:1比较。选择取决于各种用例。请找出两者之间的一些具体区别

  1. 可扩展性 -> 由于允许并行性和消息排序的分区的固有设计,MSK 具有更好的可扩展性选项。 SNS 有 300 个限制 publish/Second,要达到与 MSK 相同的性能,出于相同目的需要有更多的 SNS 主题。

示例:主题:订单服务 在 MSK -> 一个主题+ 10 个分区 SNS -> 10 个主题

如果client/message生产者为了同一个目的使用了10个SNS主题,那么客户端需要拥有所有10个SNS主题的信息和消息的分布。 在MSK中,很简单,key需要在消息中发送,kafka会根据Key值分配partition。

  1. Administration/Operation -> 与 MSK 相比,SNS+SQS 设置要简单得多。 MSK 面临更多的运营挑战(即使这是托管服务)。 MSK 需要更深入的技能才能以最佳方式使用。

  2. SNS +SQS VS SQS -> 我相信您对同一消息有多个订阅(扇出),这就是您引用 SNS +SQS 的原因。 如果你有一个消息的一个订阅,那么只有 SQS 也足够了。

  3. 重播消息-> MSK可用于重播已处理的消息。 对于 SQS 来说这将是棘手的,尽管可以通过复制队列来实现,以便可以用于重放。