【问题标题】:How to rollback on micro service when some http requests are successful and some http requests are fail by using jdbcTemplate使用jdbcTemplate在一些http请求成功和一些http请求失败时如何回滚微服务
【发布时间】:2019-04-08 15:26:36
【问题描述】:

我有基于微服务构建的 Spring Boot 项目,并使用 KONG 作为 api-gateway。所有服务都在 Docker 容器中。

在我的情况下,我使用 jdbcTemplate 使用 serviceA 循环 20 次请求删除 serviceB 中的记录。前 10 个请求成功。因此 serviceB 中的 postgresql 数据库中删除了 10 条记录。但是第 11 个请求是错误的。所以我想回滚从数据库中成功删除的所有 10 条记录。

我的问题是在这种情况下我可以回滚吗?如果可以回滚,我该怎么办?我应该使用哪种技术?在这种情况下我可以使用 Spring Cloud Stream 和 Kafka 来回滚吗?

【问题讨论】:

  • 不,你不能回滚,只有当一切都在一个事务中时,你才能回滚。因此,您可能需要通过手动恢复记录或不循环但有可能一次性删除所有内容来弥补这一点。
  • 感谢您的支持。

标签: postgresql spring-boot apache-kafka microservices spring-cloud-stream


【解决方案1】:

一种选择是使用分布式事务,这是一种相当繁重的方法......

除此之外,您可以更改架构,这也不是完美的建议。

寻求一些真正的建议。

这里的一般问题是,如果这是唯一有问题的情况。如果是这样 - 这很容易 - 以允许在一次操作中进行多次删除的方式扩展您的 API。请查看 Oracle/Scim API。所以改变单个组是原子的。当有人将用户从一个组移动到另一个组时,问题就开始了。所以也许你可以通过添加特殊的方法来处理有问题的情况——比如提出的patch

除此之外。您可以使用command 设计模式并对每个操作进行还原。这仍然很棘手,因为并非所有还原都是可能的,但这在很大程度上取决于您的情况。

更新

有类似 Saga 模式的东西。对于特定操作,已准备好恢复操作。并且有经理知道哪里出了问题,需要哪些恢复。 Here 就是那篇文章。有时它会起作用,但是...... 逆转确实是有问题的操作 - 例如发送电子邮件。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    相关资源
    最近更新 更多