AWS SNS —主题应该有多通用,何时应该重用/创建主题?

悲惨

我们正在引入SNS + SQS来处理微服务体系结构中的事件产生和传播,到目前为止,微服务体系结构依赖于HTTPS调用来相互通信。我们正在考虑将多个SQS队列连接到一个SNS主题。然后,队列中的事件将由在EC2中运行的lambda或服务消耗。

我的问题是,主题应该有多通用?我们什么时候应该创建新主题?

假设我们有一个用户域,它需要发布两个事件-创建和删除。我们正在考虑的两个选择是:

选项A有两个主题,“用户创建”和“用户删除”。每个主题都保证一个事件类型。

  • 消费者不必担心丢弃他们不感兴趣的事件,因为他们知道已经知道来自“用户创建”主题的消息仅与用户创建有关。
  • 代码的多个不同部分发布到同一主题

选项B有一个主题“用户”,它接受多种事件类型

  • 使用者将有额外的责任来过滤事件或根据事件的类型采取不同的操作(他们还可以配置其队列订阅以过滤某些事件类型)

  • 可以确保每个主题都有一个发布者

是否有人强烈偏爱其中一种选择,为什么会这样呢?

在相关说明中,您将在哪里为每种资源包括云配置?(应该将队列资源创建与使用者一起部署,还是应该独立于任何发布者/使用者生活?)

吓人的

我认为您应该使用选项B,并将与给定“域”(例如“用户”)有关的所有事件都保留在一个主题中:

  • 使您的基础架构保持简单
  • 您可能会引入对多种事件类型(例如“创建”和“删除”)感兴趣的服务。要从两个主题中使用此功能来获得正确的订购,是一种技巧。想象一个“用户删除”事件在“用户创建”事件之前到达
  • 吞吐量可能是一个问题,这实际上取决于您的域(创建和删除用户听起来并不像一个大问题)
  • 考虑一下主题中数据结构的变化,同时引入两个或多个主题的变化会很快变得很复杂

关于另一个问题:将主题/基础结构配置与服务分开。它是一个单独的基础架构(如数据库),应该分开存放;特别是如果您在系统中引入更多的消费者和生产者。

编辑:这可能是一个示例“设置”:

  • 存储库user-service包含服务/ lambda代码,该服务及其主题订阅的cloudformation / terraform模板
  • 存储库sns包含有关SNS主题的所有cloudformation / terraform模板
  • 存储库sqs包含有关SQS主题的所有cloudformation / terraform模板

您可以考虑将SNS&SQS基础代码保存在单个存储库中(后两个),但是我强烈建议将特定于服务/ lambda的所有内容都保存在单独的存储库中。

通常,将您的主题视为“数据库”会有所帮助,这种思路应该为您提出所有问题的正确方向。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章