AWS SNS — 主题应该有多通用以及我们什么时候应该 reuse/create 个主题?
AWS SNS — How generic should topics be and when should we reuse/create topics?
我们正在引入 SNS + SQS 来处理微服务架构中的事件生成和传播,到目前为止,微服务架构一直依赖 HTTPS 调用来相互通信。我们正在考虑将多个 SQS 队列连接到一个 SNS 主题上。队列中的事件随后将由 EC2 中的 lambda 或服务 运行 使用。
我的问题是,主题应该有多通用?我们什么时候应该创建新主题?
比如说,我们有一个用户域需要发布两个事件——创建和删除。我们正在考虑的两个选项是:
选项 A:有两个主题,"user-created" 和 "user-deleted"。每个主题保证一个事件类型。
- 消费者不必担心丢弃他们不感兴趣的事件,因为他们知道来自 "user-created" 主题的消息仅与用户创建相关。
- 代码的多个不同部分发布到同一主题
选项 B:有一个主题,"users",接受多种事件类型
消费者将有额外的责任过滤事件或根据事件类型采取不同的行动(他们还可以配置他们的队列订阅来过滤某些事件类型)
可以确保每个主题只有一个发布者
有没有人对这两个选项有强烈的偏好,为什么会这样?
在相关说明中,您将在何处包含每个资源的云配置? (队列资源创建应该与消费者一起部署,还是他们应该独立于任何publishers/consumers?)
我认为你应该选择选项 B,将与给定 "domain"(例如 "user")有关的所有事件都放在一个主题中:
- 让您的基础架构变得简单
- 您可能会引入对多种事件类型感兴趣的服务(例如 "create" 和 "delete")。从两个主题中获得正确的排序有点棘手;想象一个 "user-delete" 事件在 "user-create" 事件
之前到达
- 吞吐量可能是个问题,这实际上取决于您的域(创建和删除用户听起来不像是一个大容量问题)
- 考虑一下主题中数据结构的变化,同时引入两个或多个主题的变化会很快变得复杂
关于您的其他问题:将您的 topic/infrastructure 配置与您的服务分开。它是一个单独的基础设施(如数据库),应该保持独立;特别是如果您将更多的消费者和生产者引入您的系统。
编辑:这可能是一个例子"setup":
- 存储库
user-service
包含 service/lambda 代码,cloudformation/terraform 服务模板及其主题订阅
- 存储库
sns
包含与 SNS 主题相关的所有 cloudformation/terraform 个模板
- 存储库
sqs
包含所有 cloudformation/terraform 个涉及 SQS 主题的模板
您可以考虑将 SNS 和 SQS 基础代码保存在单个存储库(最后两个)中,但我强烈建议将特定于某个 service/lambda 的所有内容保存在单独的存储库中。
通常,将您的主题视为 "database" 会有所帮助,这种思路应该为您的所有问题指明正确的方向。
我们正在引入 SNS + SQS 来处理微服务架构中的事件生成和传播,到目前为止,微服务架构一直依赖 HTTPS 调用来相互通信。我们正在考虑将多个 SQS 队列连接到一个 SNS 主题上。队列中的事件随后将由 EC2 中的 lambda 或服务 运行 使用。
我的问题是,主题应该有多通用?我们什么时候应该创建新主题?
比如说,我们有一个用户域需要发布两个事件——创建和删除。我们正在考虑的两个选项是:
选项 A:有两个主题,"user-created" 和 "user-deleted"。每个主题保证一个事件类型。
- 消费者不必担心丢弃他们不感兴趣的事件,因为他们知道来自 "user-created" 主题的消息仅与用户创建相关。
- 代码的多个不同部分发布到同一主题
选项 B:有一个主题,"users",接受多种事件类型
消费者将有额外的责任过滤事件或根据事件类型采取不同的行动(他们还可以配置他们的队列订阅来过滤某些事件类型)
可以确保每个主题只有一个发布者
有没有人对这两个选项有强烈的偏好,为什么会这样?
在相关说明中,您将在何处包含每个资源的云配置? (队列资源创建应该与消费者一起部署,还是他们应该独立于任何publishers/consumers?)
我认为你应该选择选项 B,将与给定 "domain"(例如 "user")有关的所有事件都放在一个主题中:
- 让您的基础架构变得简单
- 您可能会引入对多种事件类型感兴趣的服务(例如 "create" 和 "delete")。从两个主题中获得正确的排序有点棘手;想象一个 "user-delete" 事件在 "user-create" 事件 之前到达
- 吞吐量可能是个问题,这实际上取决于您的域(创建和删除用户听起来不像是一个大容量问题)
- 考虑一下主题中数据结构的变化,同时引入两个或多个主题的变化会很快变得复杂
关于您的其他问题:将您的 topic/infrastructure 配置与您的服务分开。它是一个单独的基础设施(如数据库),应该保持独立;特别是如果您将更多的消费者和生产者引入您的系统。
编辑:这可能是一个例子"setup":
- 存储库
user-service
包含 service/lambda 代码,cloudformation/terraform 服务模板及其主题订阅 - 存储库
sns
包含与 SNS 主题相关的所有 cloudformation/terraform 个模板 - 存储库
sqs
包含所有 cloudformation/terraform 个涉及 SQS 主题的模板
您可以考虑将 SNS 和 SQS 基础代码保存在单个存储库(最后两个)中,但我强烈建议将特定于某个 service/lambda 的所有内容保存在单独的存储库中。
通常,将您的主题视为 "database" 会有所帮助,这种思路应该为您的所有问题指明正确的方向。