web-dev-qa-db-ja.com

偽のクライアントとSpringの再試行

Spring Cloud Feignクライアントを使用して外部サービスを呼び出す安らかなサービスがあります

@FeignClient(name = "external-service", configuration = FeignClientConfig.class)
public interface ServiceClient {

    @RequestMapping(value = "/test/payments", method = RequestMethod.POST)
    public void addPayment(@Valid @RequestBody AddPaymentRequest addPaymentRequest);

    @RequestMapping(value = "/test/payments/{paymentId}", method = RequestMethod.PUT)
    public ChangePaymentStatusResponse updatePaymentStatus(@PathVariable("paymentId") String paymentId,
            @Valid @RequestBody PaymentStatusUpdateRequest paymentStatusUpdateRequest);

}

ログファイルで、過去3か月間に次のエラーが3〜4回検出されました。

json.ERROR_RESPONSE_BODY:接続の実行が拒否されましたPOST http:// external-service/external/payments json.message:送信支払いの追加支払い失敗その他の理由:{ERROR_RESPONSE_BODY =接続の実行が拒否されましたPOST http:// external-service/external/payments 、EVENT = ADD_PAYMENT_FAILURE、TRANSACTION_ID = XXXXXXX} {} json.EVENT:ADD_PAYMENT_FAILURE json。 stack_trace:feign.RetryableException:接続が実行を拒否しましたPOST http:// external-service/external/payments at feign.FeignException.errorExecuting(FeignException.Java:67) feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.Java:104)at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.Java:76)at feign.ReflectiveFeign $ FeignInvocationHandler.invoke(ReflectiveFeign.Java:103)

FeignクライアントにSpring Retryを追加することは可能ですか? addPayment操作に注釈を付けたいもの

@Retryable(value = {feign.RetryableException.class }, maxAttempts = 3, backoff = @Backoff(delay = 2000, multiplier=2))

しかし、これは不可能です。他にどのようなオプションがありますか?

7
Satya

RetryerFeignClientConfigを追加できます

@Configuration
public class FeignClientConfig {

    @Bean
    public Retryer retryer() {
        return new Custom();
    }

}

class Custom implements Retryer {

    private final int maxAttempts;
    private final long backoff;
    int attempt;

    public Custom() {
        this(2000, 3);
    }

    public Custom(long backoff, int maxAttempts) {
        this.backoff = backoff;
        this.maxAttempts = maxAttempts;
        this.attempt = 1;
    }

    public void continueOrPropagate(RetryableException e) {
        if (attempt++ >= maxAttempts) {
            throw e;
        }

        try {
            Thread.sleep(backoff);
        } catch (InterruptedException ignored) {
            Thread.currentThread().interrupt();
        }
    }

    @Override
    public Retryer clone() {
        return new Custom(backoff, maxAttempts);
    }
}

Retryer.Defaultに基づくRetryerのサンプル設定で更新されました。

9
Jeff

リボンを使用している場合、プロパティを設定できます。再試行には以下のプロパティを使用できます。

myapp.ribbon.MaxAutoRetries=5
myapp.ribbon.MaxAutoRetriesNextServer=5
myapp.ribbon.OkToRetryOnAllOperations=true

注:「myapp」はサービスIDです。

これをチェックアウト Github実装 動作例

1
Yogi