用于捕获Web服务的结果并将结果发送到其他Web服务的体系结构

时间:2019-01-16 09:47:11

标签: c# design-patterns architecture

我正在用C#开发应用程序。 我正在调用一个Web服务(让我们称之为WS1),并且希望将结果发送到1个或多个其他(外部)Web服务(例如WS2和WS3)。

如果其中一个接收Web服务(例如WS2)关闭,我想确保此呼叫不会丢失,并在以后的时间再次尝试。

要实现这一目标,有什么好的架构? 是否有人链接到描述此类架构的在线文档?

3 个答案:

答案 0 :(得分:0)

在深入研究体系结构之前,您可能需要问一些问题。我假设WS1和WS2都属于您/您的团队。

  1. 一旦WS2停机,您要等待多长时间才能恢复正常运行?
  2. WS1和WS2期望的响应时间是多少?
  3. 是否还有其他正在使用WS1的下游服务,并且该服务是否具有SLA /响应时间预期?
  4. WS1如何期望消耗WS2的响应?

简而言之,事件驱动方法最适合这里。也就是说,您可以在WS1和WS2之间有一个队列,以便WS1将消息发布到请求队列中,WS2在准备好后将其拾取并将响应放入WS1可以从中读取的响应队列中。 例。 AWSAzure

根据您回答先前查询的方式,此方法可能有效也可能无效。有时,最好将常规的基于REST的调用与重试策略一起使用(示例exponential back off策略)。借助此功能,您还可以更快地获得有关故障的反馈。如果以上问题的答案是

,则可以选择此选项
  1. 如果等待时间短,即以秒为单位
  2. 期望响应时间非常快。在这种情况下,最好立即报告失败,而不是等待失败。
  3. 如果下游应用程序对WS1具有同步依赖性,则WS1无法无休止地等待WS2处理请求
  4. WS2没有可预测的响应渠道

注意,如果您使用基于事件的体系结构,则WS2可能不再是Web服务:)

答案 1 :(得分:0)

我认为,您的Web服务体系结构可能需要负载均衡器。 您可以使用树莓派pi或任何PC,安装linux并运行nginx作为负载均衡器,就像im正在做的事情一样。

您可以在以下位置阅读更多内容 How to configure Nginx as Load Balancer

答案 2 :(得分:-3)

如果我理解正确,那么您正在寻找一种事件驱动的体系结构,可以在其中重播请求。

SNS与SQS的架构解耦相似,可以是主题,也可以是队列。区别在于您是要轮询还是推送这些请求。

SNS用例: 您会将消息推送到SNS主题,该主题将在其中存储消息最多14天。然后,您可以安排SNS主题以将消息传递到其余端点。如果失败,则可以通过将消息放在DLQ(死信队列)上来处理。如果成功,则该消息将从主题中删除。

SQS用例: 您会将消息推送到SNS主题,该主题将在其中存储消息最多14天。然后,如果事件进程将其从队列中删除,则可以轮询队列中的事件。否则,您可以使用DLQ策略,或者只是将消息留在队列中。

一些不错的读物是SNS Fanout strategies