メッセージを取り込んで、確立されたメッセージングレートに準拠しているかどうかを判断するアルゴリズムを作成しています。レートリミッタが正しく動作しない
たとえば、ANY 50秒のウィンドウで5つ以上のメッセージを送信することはできません。したがって、このウィンドウはローリングウィンドウでなければなりません。
私はthis post.からこのトークンバケットアルゴリズムを実装しましたが、一貫して動作させることはできません。いくつかのテストケースを渡しますが、他のテストケースは渡しません。これにより、ここにどこかに論理的な問題が隠されていると思うようになります。ここで
は、私がこれまで持っているものです。
public class Messaging {
//times in millis
double time_before;
double time_now;
double now;
double time_passed;
double allowance;
//constants
static double per = 50000; // 50 seconds
static double rate = 5; //5 messages
public Messaging(){
time_before = System.currentTimeMillis();
allowance = rate;
}
public void onEvent(){
time_now = System.currentTimeMillis();
time_passed = time_now - time_before;
time_before = time_now;
allowance += time_passed * (rate/per);
if (allowance > rate){
allowance = rate;
System.out.println("Reset Allowance");
}
if (allowance < 1.0){
System.out.println("Discard");
}else{
System.out.println("Forward message");
allowance -= 1.0;
}
}
しかしこれは動作しません!唯一の最後のメッセージが破棄されているのはなぜ
Forward message. Time: 1469830426910
Forward message. Time: 1469830431912
Forward message. Time: 1469830436913
Forward message. Time: 1469830441920
Forward message. Time: 1469830446929
Forward message. Time: 1469830451937
Forward message. Time: 1469830456939
Forward message. Time: 1469830461952
Forward message. Time: 1469830466962
Discard. Time: 1469830471970
Total time passed: 50067
:上記のコードを実行する
public static void main(String[] args) {
Messaging orders = new Messaging();
for (int i = 0; i < 10; i++) {
orders.onEvent();
try {
Thread.sleep(5000);
} catch (Exception ex) {
}
}
}
はこれを提供しますか? 5番目のメッセージの後に自動的に失敗するように、十分に減額してはいけませんか?
私はこの特定の実装について助けてください。実際の実装は、キューなどを持たない独自の言語で行われます。
出力にタイムスタンプがないため、何もわかりません。何が起こっているのかを私たちが伝える方法はありません。 1つの提案:フィルタリングコードをタイムスタンプから切り離し、デバッグに関係なく、繰り返し可能なテストデータのセットを供給することができます。そうすればコードを踏んで、これを理解することができます。 –
@JimGarrisonタイムスタンプの出力を追加しました。私はさまざまなバリエーションをテストしていますので、ちょうど今すぐThread.sleepを使用して、x秒ごとに入ってくるメッセージをシミュレートします。コードを踏んで、私は 'allowance + = time_passed *(rate/per);という行に伝えることができます。これは問題を作り出すものですが、私は何度もこの実装を行っていますので、鉱山で間違っている場合、またはこのアルゴリズムがスライディングウィンドウで機能しない場合 – cheenbabes
それは彼が何を意味するのかとはかなり違う - 私は現在、私がそれを説明することを望む答えを書いている。 –