从事务中的 WCF 服务向 REST API 发出 Post 请求
Making a Post request to a REST API from a WCF service in a transaction
我正在做一个wcf服务事务中的一系列工作。
1.Making POST 对休息 api 的反应。
2.Processing POST 请求响应并将其保存在数据库中。
上面的第 1 步和第 2 步发生在 wcf 事务中,但结果我看到了一个问题,即发生异常时第 2 步未提交但第 1 步完成后造成不一致。
我已经找到通过 saga 模式或 2PC 实现此目的的方法,但找不到任何简单的实现或解决方法。
PS:我现在不需要回滚数据,只是避免提交 POST 请求休息 API。
目前,我正在通过发出另一个补丁请求来处理此问题 api 以恢复在 CATCH BLOCK 中收到的响应。
坏消息:
剩余 apis 没有 2PC。根据定义,Rest 是无状态的,不包括在两阶段提交世界中使用的元数据的信封,所以你在这里运气不好。
另一方面,SOAP 支持 WS-Atomic Transaction 协议,但我建议您使用一些技术,如 WCF,所有这些都已实现。 (net core不支持,所以用.net framework来做这个)
有点好消息:
拯救的最终一致性。 SAGA 模式是在微服务世界中实现这一目标的一种方式。在最简单的形式中,最终一致性可能像下面这样微不足道:
- 应用程序 1 创建一个描述
Pending
状态 中的操作的数据库行
- 应用程序 1 使 post 成为 url
- 目标 api 以持久的方式创建一个事件和结果(在事件总线、队列甚至数据库 table Application 1 可以访问
- 应用程序 1 的某些服务或后台线程不断读取或侦听 api 结果的事件总线
- 获得结果后,它会更新在 1 上生成的行。它会重试直到可能。你可以在某个时候停止它。
这种方法的缺点是,如果 5 不断失败,您需要手动干预。涉及到更复杂的方面(例如补偿操作),但我会留给您进一步研究。
另一个坏消息
没有开箱即用的最终一致性实现:(
如果您可以将 REST Api 切换到启用了 WSAT 协议的 SOAP,那么您就可以拥有开箱即用的分布式事务。
我正在做一个wcf服务事务中的一系列工作。
1.Making POST 对休息 api 的反应。 2.Processing POST 请求响应并将其保存在数据库中。
上面的第 1 步和第 2 步发生在 wcf 事务中,但结果我看到了一个问题,即发生异常时第 2 步未提交但第 1 步完成后造成不一致。
我已经找到通过 saga 模式或 2PC 实现此目的的方法,但找不到任何简单的实现或解决方法。
PS:我现在不需要回滚数据,只是避免提交 POST 请求休息 API。 目前,我正在通过发出另一个补丁请求来处理此问题 api 以恢复在 CATCH BLOCK 中收到的响应。
坏消息:
剩余 apis 没有 2PC。根据定义,Rest 是无状态的,不包括在两阶段提交世界中使用的元数据的信封,所以你在这里运气不好。
另一方面,SOAP 支持 WS-Atomic Transaction 协议,但我建议您使用一些技术,如 WCF,所有这些都已实现。 (net core不支持,所以用.net framework来做这个)
有点好消息:
拯救的最终一致性。 SAGA 模式是在微服务世界中实现这一目标的一种方式。在最简单的形式中,最终一致性可能像下面这样微不足道:
- 应用程序 1 创建一个描述
Pending
状态 中的操作的数据库行
- 应用程序 1 使 post 成为 url
- 目标 api 以持久的方式创建一个事件和结果(在事件总线、队列甚至数据库 table Application 1 可以访问
- 应用程序 1 的某些服务或后台线程不断读取或侦听 api 结果的事件总线
- 获得结果后,它会更新在 1 上生成的行。它会重试直到可能。你可以在某个时候停止它。
这种方法的缺点是,如果 5 不断失败,您需要手动干预。涉及到更复杂的方面(例如补偿操作),但我会留给您进一步研究。
另一个坏消息
没有开箱即用的最终一致性实现:( 如果您可以将 REST Api 切换到启用了 WSAT 协议的 SOAP,那么您就可以拥有开箱即用的分布式事务。