【问题标题】:Post multiple requests to an API but without re-using connections向 API 发布多个请求,但不重复使用连接
【发布时间】:2021-03-05 00:53:59
【问题描述】:

我有一个调用第三方 API 的控制台应用程序,基本上它从数据库中获取记录并通过他们的 WCF API 将它们推送到第三方。

由于各种原因(主要是第三方 API 非常慢 - 7 秒响应),我们想要并行发布多条记录,因此我们已经开始这样做,但是我们现在看到第三方 API 出现了一些奇怪的行为,其中它正在复制记录。

API 的开发人员向我们建议,这是因为我们通过同一个连接发送请求(这是有道理的,因为 .net 将重用连接)并且他们不/不能/不会支持这一点,他们将只支持一个连接上的一个请求,然后必须关闭连接。

我的问题是,我如何在 .net 核心 (2.2) 中执行此操作我们目前正在使用 HttpClient,我希望在可能的情况下重用连接 - 我如何保证我们为每个请求使用新连接?

【问题讨论】:

  • 这是寻找另一个第三方解决方案的完美案例。至少可以说,您得到的答复没有意义,也令人不满意。我的意思是底层套接字连接与简单的并发/数据完整性检查有什么关系¯\_(ツ)_/¯
  • 不幸的是,这不是一个选项,它对业务至关重要(对我们而言),我们已经使用它多年,因此它已完全集成到业务中,但现在我们需要使用它会导致我们的问题。转移到另一种产品会花费我们大量的费用。
  • 是的,我明白了。但是,这里很少有没有真正意义的事情。解决问题的责任将落在开发人员身上。通常,您实际上无法访问 WFC / HttpClient 调用上的套接字层,这一切都是为您完成的。除非他们在谈论更高级别的会议,否则我永远看不出这将如何成为问题。你能显示这些调用的实际最小代码吗?是否涉及令牌,这实际上是 WCF 还是您使用的是 HttpClient
  • 尝试使用 http 客户端和 vs2017 生成的客户端,结果相同。我早上一起举个例子,现在是午夜,我已经受够了这一天!我对服务的理解是,它实际上并没有处理请求,而是将数据转储到队列中,然后由某种描述的 Windows 服务处理,然后向我们返回响应.. 它是如何做到的还不清楚,但这显然是问题所在。该 api 已停产,技术上不支持,所以我们最终应该逐步淘汰它......但这现在无济于事:)
  • 我可能还应该说第三方 API 的开发人员并没有说这绝对是问题 - 只是我们应该调查它作为它的“可能”原因。

标签: c# .net-core


【解决方案1】:

经过一番挖掘,我发现了问题所在,但没有办法解决。

过程是:

  1. 我们发布到 API 中
  2. API 在数据库的暂存表中创建一条记录,并带有一个显示“待处理”状态的标志,然后开始轮询该表以等待更改。
  3. API 然后调用服务器上的可执行文件,该可执行文件查看暂存表以查找任何状态为“待处理”的记录
  4. 可执行文件进行处理,然后将记录的状态更改为“完成”
  5. 一直在轮询表的 API 看到变化的状态,读取记录并将结果返回给客户端。

如果您一次只发布一条记录,那一切都好。但是当我并行执行时,正在发生的事情是:

  1. 我们在几毫秒内调用 API 10 次
  2. API 在暂存表中创建 10 条记录,所有记录均处于“待处理”状态。
  3. API 开始轮询临时表以进行更改,同时调用可执行文件十次
  4. 可执行文件的所有 10 个实例读取所有 10 条记录并处理它们 - 每个实例都不知道还有另外 9 个实例都在做同样的事情。
  5. 可执行文件的所有 10 个实例都完成处理并将暂存表上的状态更改为“完成”
  6. API 看到状态更改并在响应中将所有更改的记录返回给我 - 所以我发送的 10 个请求中的每一个都会返回 10 条记录。

不用说,我们已经与 API 的提供者进行了讨论,它可能是 EOL 并且几乎不支持,但我们正在为这个东西的许可付费,这是一个他们需要的非常愚蠢的过程提供修复或解决方法。

所以最终它与重用连接无关,不知道为什么我们被告知是这样。

【讨论】:

  • 所以问题出在 API 方面:可执行文件的所有 10 个实例读取所有 10 条记录并处理它们
  • 你可以做些什么来解决 - 在你身边创建一个队列并同时发送一条消息(仅在收到前一条消息的响应后发送下一条消息)
  • 这就是我们当时的情况,问题是 API 需要大约 7 秒来处理单个请求。我们每 7 秒收到一个以上的请求,因此队列不断增长,一直增长到永远赶不上的地步。问题完全出在第 3 方 API 上,我们多次证明了这一点。当我们仍然等待他们的修复时,我们限制了系统上的用户数量,以便队列可以保持一次处理一条记录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 2019-06-08
  • 1970-01-01
  • 1970-01-01
  • 2015-06-11
  • 2011-09-05
  • 2018-07-04
相关资源
最近更新 更多