【问题标题】:Retry failed service call but use different implementation重试失败的服务调用,但使用不同的实现
【发布时间】:2021-09-28 16:01:49
【问题描述】:

我正在使用的代码具有以下结构。

public interface SomeService {
    Optional<SomeClass> getThing();
    // more methods
}

public abstract class SomeServiceBase implements SomeService {
    Optional<SomeClass> getThing() {
       // logic
       this.onGetThing();
    }

    protected abstract Optional<SomeClass> onGetThing();
}

此外,还有 3 个不同的类扩展 SomeServiceBase,每个类都调用不同的第 3 方外部 API 以获得一些结果,它们都实现了自己的 onGetThing() 版本。

class FooService extends SomeServiceBase { @Override protected Optional<SomeClass> onGetThing() { } }
class DooService extends SomeServiceBase { @Override protected Optional<SomeClass> onGetThing() { } }
class RooService extends SomeServiceBase { @Override protected Optional<SomeClass> onGetThing() { } }

有一个工厂服务连接上述所有三个服务,并根据从客户端传递到 API 的“提供者”返回正确的服务。

Optional&lt;SomeClass&gt; myThing = SomeServiceFactory.getService(provider).getThing();

我需要做的是,如果FooService 没有返回结果,我想用DooService 重试。但我正在努力寻找一种以某种通用的可重用方式实现这一点的好方法。任何帮助表示赞赏。如果我需要提供更多详细信息,请告诉我。

【问题讨论】:

    标签: java spring spring-boot retry-logic


    【解决方案1】:

    也许你可以看看断路器模式。 如果原始调用引发异常,它允许您使用“回退”。
    如果我可以继续使用您的示例:

    • FooService 周围提供/开发了一个断路器
    • 如果FooService 上的一切正常,将返回原始回复
    • 否则,如果 FooService 未提供响应或引发异常,您将转到链接的后备
    • 在您的后备中,您将实现对DooService 的调用

    您可以尝试Resilience4J(您有一些具有不同实现方式的示例)或Netflix Circuit Breaker(但已弃用)

    【讨论】:

    • 谢谢,这个主意不错。我去看看是什么情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多