Javaでタグ付けしていますが、わりと一般論です。
##はじめに
一般論として、サーバに接続する際エラーが発生すると、即座に再接続しても接続できない可能性も高く、接続できる可能性も高いです。
しかし、エラーによって接続できるまで再接続を繰り返した場合、再接続できない可能性が高くなり、接続できる可能性は低くなる傾向にあります。
ネットワーク機器への負荷を考慮すると、最初は短い間隔で再接続を行い、徐々に間隔を長くするのが理想的であると言えます。
##間隔を求める
「最小の間隔」、「最大の間隔」、「最大の間隔に到達するまでのエラー回数」の3つの定数と、エラー回数を使って間隔を求めます。
// 最大の間隔に到達するまでのエラー回数
public static int MAX_ERRORS = 32;
// 最大の間隔
public static long MAX_INTERVAL = 120000;
// 最小の間隔
public static long MIN_INTERVAL = 1000;
public static long getInterval(int numErrors) {
// 初回(まだエラーがない場合は0を返す)
if (numErrors <= 0) {
return 0L;
}
// エラー回数を最大に丸める
if (numErrors > MAX_ERRORS) {
numErrors = MAX_ERRORS;
}
// エラー回数1からMAX_ERRORSまでを0.0から1.0の値にする
double r = ((double) (numErrors - 1)) / ((double) (MAX_ERRORS - 1));
// 二乗する(お好みで)
r = r * r;
// 線形補間して間隔を求める
double min = (double) MIN_INTERVAL;
double max = (double) MAX_INTERVAL;
double interval = min + (max - min) * r;
return (long) interval;
}
public static void main(String[] args) {
for (int i = 0; i < 40; i++) {
System.out.println(i + ":" + getInterval(i));
}
}
##出力結果
0:0
1:1000
2:1123
3:1495
4:2114
5:2981
6:4095
7:5457
8:7067
9:8925
10:11030
11:13382
12:15983
13:18831
14:21927
15:25270
16:28861
17:32700
18:36786
19:41120
20:45702
21:50531
22:55608
23:60933
24:66505
25:72325
26:78393
27:84708
28:91271
29:98082
30:105140
31:112446
32:120000
33:120000
34:120000
35:120000
36:120000
37:120000
38:120000
39:120000
##まとめ
接続に成功した時や、システムからの通知により接続ができるようになったのがわかった時は、エラー回数を0に戻す必要があります。
間隔を決めるにあたって二乗しているところがありますが、これは好みの問題です。二乗するのを止めると増分が一定になります。r = 1.0D - (1.0D - r) * (1.0D - r);
のような式もありかもしれません。