在事务中从 WCF 服务向 REST API 发出 Post 请求

Posted

技术标签:

【中文标题】在事务中从 WCF 服务向 REST API 发出 Post 请求【英文标题】:Making a Post request to a REST API from a WCF service in a transaction 【发布时间】:2021-05-30 00:10:22 【问题描述】:

我在做wcf服务事务的一系列工作。

1.对rest api进行POST响应。 2.处理POST req响应并将其保存在db中。

上面的第 1 步和第 2 步是在 wcf 事务中发生的,但结果我看到了一个问题,即在出现异常时第 2 步没有被提交,但第 1 步完成创建不一致。

我已经找到了通过 saga 模式或 2PC 实现这一目标的方法,但找不到任何简单的实现或解决方法。

PS:我现在不需要回滚数据,只是避免将 POST REQ 提交到 REST API。 目前我正在通过向 rest api 发出另一个补丁请求来处理这个问题,以恢复在 CATCH BLOCK 中收到的响应。

【问题讨论】:

【参考方案1】:

坏消息:

rest api 没有 2PC。根据定义,Rest 是无状态的,不包括在两阶段提交世界中使用的元数据信封,所以你在这里不走运。

另一方面,SOAP 支持WS-Atomic Transaction 协议,尽管我建议您使用一些技术,如 WCF,所有这些都已经实现。 (net core不支持,所以用.net framework来做)。

有点好消息:

救援的最终一致性。 SAGA 模式是在微服务领域实现这一目标的一种方式。在最简单的形式中,最终的一致性可能是微不足道的,如下所示:

    应用程序 1 创建一个 DB 行来描述 Pending 状态下的操作 应用程序 1 将帖子发送到网址 目标 api 以持久的方式(在 应用程序 1 可以访问的事件总线、队列甚至数据库表上)创建带有结果的事件 Application 1 的某些服务或后台线程不断读取或侦听该事件总线以获取 api 的结果 一旦获得结果,它就会更新在 1 上创建的行。它会重试直到可能。您可以在某个时候停止它。

这种方法的不利之处在于,如果 5 不断失败,您需要手动干预。涉及到更复杂的方面(例如补偿动作),但我会留给您进一步研究。

其他坏消息

最终的一致性没有开箱即用的实现:( 如果您可以将 REST Api 切换到启用了 WSAT 协议的 SOAP,那么您可以拥有开箱即用的分布式事务。

【讨论】:

以上是关于在事务中从 WCF 服务向 REST API 发出 Post 请求的主要内容,如果未能解决你的问题,请参考以下文章

REST WCF 服务中的事务

如何同时使用 SOAP WCF 服务和 REST API

角度不会向节点js rest API发出发布请求

如何在 WCF 服务中调用 REST API?

无法从 reactjs 中的 axios 向 id=1 文章的 django REST API 后端发出 GET 请求

如何确保只有我的 javascript 客户端 Web 应用程序向 REST API 发出请求?