SpyMemcachedが指数バックオフ戦略を採用しているかの調査
はじめに
Memcachedは、高速なキャッシュ機能を提供するために広く利用されています。そのクライアントライブラリとして人気のあるSpyMemcachedも、効率的な接続管理が重要です。本記事では、SpyMemcachedが再接続時に指数バックオフ(Exponential Backoff)戦略を採用しているかどうかを、最新のソースコードを基に調査しました。
ソースコードの確認
SpyMemcachedの最新ソースコードは、GitHubリポジトリで公開されています。以下に、再接続戦略に関連する主要な部分を抜粋し、分析を行いました。
- 接続最大遅延時間の設定
再接続試行時の最大遅延時間を設定する部分。
public class ConnectionFactoryBuilder {
// 省略
/**
* Set the maximum reconnect delay.
*/
public ConnectionFactoryBuilder setMaxReconnectDelay(long to) {
assert to > 0 : "Reconnect delay must be a positive number";
maxReconnectDelay = to;
return this;
}
// 省略
}
2.最大遅延時間の単位
maxReconnectDelayは秒単位で設定され、ミリ秒に変換されています。
public class MemcachedConnection extends SpyThread {
// 省略
maxDelay = TimeUnit.SECONDS.toMillis(f.getMaxReconnectDelay());
// 省略
}
3 .再接続試行間隔の計算式
再接続試行間隔は、ノードに対する再接続試行の回数を取得した後、2の再接続試行回数乗を計算し、ミリ秒に変換して最小値を取ることで決定されます。
public class MemcachedConnection extends SpyThread {
// 省略
protected void queueReconnect(final MemcachedNode node) {
// 省略
long delay = (long) Math.min(maxDelay, Math.pow(2, node.getReconnectCount()) * 1000);
// 省略
}
// 省略
}
調査結果
上記のソースコードから、SpyMemcachedが指数バックオフ戦略を採用していることが確認できました。具体的には、再接続試行間隔が以下のように計算されています:
再接続試行回数が0回目の場合:
delay = min(maxDelay, 2^0 * 1000) = min(maxDelay, 1000ms)
初回の再接続試行間隔は1秒です。
再接続試行回数が1回目の場合:
delay = min(maxDelay, 2^1 * 1000) = min(maxDelay, 2000ms)
2回目の再接続試行間隔は2秒です。
再接続試行回数が2回目以降の場合:
delay = min(maxDelay, 2^2 * 1000) = min(maxDelay, 4000ms)
しかし、maxReconnectDelayが2秒(2000ms)に設定されているため、3回目以降の再接続試行間隔も2秒に固定されます。
結論
SpyMemcachedは、再接続試行時に指数バックオフ戦略を採用しています。ただし、maxReconnectDelayが2秒に設定されているため、再接続試行間隔は初回が1秒、2回目以降は2秒に固定されます。この設定により、再接続試行が過度に頻繁に行われることを防ぎ、システムへの負荷を軽減しています。
参考資料