为api调用添加重试功能的好方法?

时间:2016-11-30 20:31:13

标签: php

我有一个api类来联系REST api进行邮件列表管理。它包括subscribe()unsubscribe()update()等方法。

在我的客户端代码中,我有

这样的行
Api::subscribe($email, array(..));

由于偶尔会出现故障,我们希望为每次调用添加重试功能。如果第一次呼叫失败,我们想要在我们最终放弃之前重试一次或两次。

直截了当的方法是

public static function subscribe($email, array $lists ) {
  $success = FALSE;
  $retries = 3;
  while ( ! success && retries > 0 ) {
    // API call goes here
    $retries--;
  }
}

冲洗并重复每种方法。

为了DRY(不要重复自己)的利益,我想知道是否有一种漂亮的,设计模式的方式来重试我的调用,而不必为每个方法重复while循环。

如果没有,简单的方法是最合适的,那很好。我只是想知道是否有更好的方法,我不知道。

1 个答案:

答案 0 :(得分:3)

public function retry($apiCall, $retries) {
    $success = false;
    while (!$success && $retries > 0 ) {
        $success |= $apiCall();
        $retries--;
    }
}

public static function subscribe($email, array $lists) {
  retry(function() {
    // your API call here
  }, 3);
}

您只需构造一个anomymous函数并将自治函数传递给处理重试的代码。显然,这应该更复杂一些,允许返回值(可以非常简单地添加)或者可以观察到。

使其可观察的一种方法是传递回调:

public function retry($apiCall, $retries, $callback) {
    $success = false;
    while (!$success && $retries > 0 ) {
        $success |= $apiCall();
        $retries--;
    }
    $callback($success);
}

您只需传递执行通知的正确回调即可。您可以通过传递更多关于事件类型和失败类型,重试次数等的详细参数来进行扩展,具体取决于您的具体需求。