如何解决在事务中从 WCF 服务向 REST API 发出 Post 请求 坏消息:有点好消息:另一个坏消息
我正在 wcf 服务事务中做一系列工作。
1.对rest api进行POST响应。 2.处理POST请求响应并将其保存在数据库中。
上述第 1 步和第 2 步发生在 wcf 事务中,但结果我看到了一个问题,即第 2 步出现异常时未提交,但第 1 步已完成导致不一致。
我已经看到通过 saga 模式或 2PC 实现这一目标的方法,但找不到任何简单的实现或解决方法。
PS:我现在不需要回滚数据,只是避免提交 POST REQ 到 REST API。 目前我正在通过发出另一个补丁请求来休息 api 以恢复在 CATCH BLOCK 中收到的响应来处理这个问题。
解决方法
坏消息:
没有 2PC over rest api。根据定义,Rest 是无状态的,不包括用于两阶段提交世界中的元数据的信封,因此您在这里不走运。
另一方面,SOAP 支持 WS-Atomic Transaction 协议,但我建议您使用一些技术,如 WCF,其中所有这些都已经实现。 (net core 不支持它,所以它是 .net 框架)。
有点好消息:
最终的一致性来拯救。 SAGA 模式是在微服务世界中实现这一目标的一种方式。在最简单的形式中,最终的一致性可能是如下微不足道的事情:
-
应用程序 1 创建一个描述
Pending
状态下的操作的数据库行 - 应用程序 1 将帖子发布到网址
- 目标 api,以持久的方式(在应用程序 1 可以访问的事件总线、队列甚至数据库表上)创建带有结果的事件
- 应用程序 1 的某些服务或后台线程不断读取或侦听该事件总线以获取 api 的结果
- 获得结果后,它会更新 1 上的行。它会重试直到可能。你可以在某个时候停止它。
这种方法的缺点是,如果 5 不断失败,您需要手动干预。涉及到更复杂的方面(例如补偿行为),但我会将其留给您进一步研究。
另一个坏消息
没有开箱即用的最终一致性实现:( 如果您可以将 REST Api 切换到启用了 WSAT 协议的 SOAP,那么您就可以拥有开箱即用的分布式事务。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。