c# - 通常要求呼叫者通过队列进行通信?
问题描述
最初,该团队正在考虑为母公司开发 C# 服务。该服务将接收请求,然后该服务将 ping 第三方并返回结果。
我们决定为请求和结果创建一个 AWS SQS 和 SNS 队列,而不是同步的。我们公司将向我们的 AWS 提供凭证,以便父级写入并从请求队列中通知。
那么这个服务就不是一个服务,而是一个处理器。然后它将从队列中读取并将请求发送并将结果写回另一个 SQS,SNS 将通知母公司端的 API。
问题:这是一个好的设计吗?我们绕过了服务的使用,以防止必须有重试逻辑和开发客户端,而我们只是通过队列进行通信。
解决方案
这种方法有很多优点。
- 您允许您的客户和“处理者”专注于他们的职责并通过消息总线进行交互
- 您允许客户端和处理器相互独立和解耦,特别是在使用的技术和编程语言方面。
- 两者都可以在需要时独立缩放。
- 如果其中一个“关闭”,则消息仍然可以在消息总线上累积并且不会丢失(假设您有合适的 TTL 来涵盖这一点)
- 如果提供的服务增长,您可以引入新的队列来处理它们,而不会影响当前的客户端和处理器
- 它们是异步的
- 您可以有多个生产者和/或消费者
- ETC
当然也有缺点
- 延迟增加。在某些情况下,这是一个问题
- 您依赖于第 3 方产品
- 如果使用 AWS、Azure 等,您依赖于第 3 方公司
- 3pp 派对和产品的额外费用
- 调试可能更困难
- 追踪可能更困难
- 安全可能更加困难
- 如果客户端或接收器出现故障,它可能不会立即显现出来。导致消息的积累,每个消息的生存时间都可能有限!(如果这发生在周末会怎样?)
- 确认收到请求很困难
- 确保在进程失败时消息不会丢失更加困难
- ETC
你当然可以在互联网上找到更多关于这些的信息。
因此,作为一种方法,这没有任何问题。唯一的问题是
“这是适合我们用例的架构吗?”
只有您可以通过权衡利弊来确定这一点,也许与您的客户一起。
推荐阅读
- c# - 如何避免计数 - Crystal Report 中的最后一个空白页码
- javascript - 在 ES6 中使用 Gulp 4 - Babel 问题
- python - 为什么我的模型在进行正则化和批量标准化后会过拟合
- linux - 如何在 Raspberry Pi 上重新激活终端?
- android - 触摸问题总是在最前面
- javascript - 为什么App.js中这部分代码不起作用?(我做了一个搜索过滤器)
- javascript - JavaScript 中 setInterval 与 setTimeout 的混淆
- javascript - “状态”类型的参数不能分配给“从不”类型的参数
- java - 如何从另一个 Flux 中排除 Flux 中的所有元素
- node.js - How to optionally set Winston transports when logging to Stackdriver from GKE