繁体   English   中英

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

[英]Making a Post request to a REST API from a WCF service in a transaction

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

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

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

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

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

坏消息:

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

另一方面,SOAP 支持WS-Atomic Transaction协议,但我建议您使用 WCF 之类的技术,所有这些都已经实现。 (net core不支持,所以.net框架为此)。

有点好消息:

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

  1. 应用程序 1创建了一个数据库行,描述了Pending state 中的操作
  2. 应用程序 1发布到 url
  3. 目标 api 以持久方式(在应用程序 1可以访问的事件总线、队列甚至数据库表上)创建具有结果的事件
  4. Application 1的某些服务或后台线程不断读取或侦听该事件总线以获取 api 的结果
  5. 一旦得到结果,它就会更新在1上创建的行。 它会重试直到可能。 你可以在某个时候停止它。

这种方法的缺点是,如果 5 不断失败,您需要手动干预。 涉及更复杂的方面(如补偿动作),但我将把它留给你进一步研究。

另一个坏消息

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM