9

構成可能なリキューを数回試行した後にメッセージを拒否するメカニズムを実装するにはどうすればよいですか?

つまり、キューを購読している場合、同じメッセージが X 回以上再配信されないことを保証したいと考えています。

私のコードサンプル:

q.subscribe({ack: true}, function(data,headers,deliveryInfo,message) {
  try{
    doSomething(data);
  } catch(e) {
   message.reject(true);
  }
}
4

2 に答える 2

1

私の意見では、最善の解決策は、アプリケーションでこれらのエラーを処理し、アプリがメッセージを処理できないと判断したときにエラーを拒否することです。

情報を失いたくない場合、アプリは同じメッセージをエラー キューに送信した後にのみメッセージを拒否する必要があります。

コードはテストされていません:

q.subscribe({ack: true}, function () {
  var numOfRetries = 0;
  var args = arguments;
  var self = this;
  var promise = doWork.apply(self, args);
  for (var numOfRetries = 0; numOfRetries < MAX_RETRIES; numOfRetries++) {
    promise = promise.fail(function () { return doWork.apply(self, args); });
  }

  promise.fail(function () {
    sendMessageToErrorQueue.apply(self, args);
    rejectMessage.apply(self, args);
  })
})
于 2014-02-25T09:19:14.983 に答える
0

考えられる解決策の 1 つは、定義した何らかのハッシュ関数を使用してメッセージをハッシュし、キャッシュ オブジェクトでそのハッシュをチェックすることです。存在する場合は、構成可能な最大値までキャッシュに 1 つ追加し、存在しない場合は 1 に設定します。簡単で汚いプロトタイプを次に示します (mcacheオブジェクトはすべてのサブスクライバーのスコープ内にある必要があることに注意してください)。

var mcache = {}, maxRetries = 3;

q.subscribe({ack: true}, function(data,headers,deliveryInfo,message) {
  var messagehash = hash(message);
  if(mcache[messagehash] === undefined){
    mcache[messagehash] = 0;
  }
  if(mcache[messagehash] > maxRetries) {
    q.shift(true,false); //reject true, requeue false (discard message)
    delete mcache[messagehash]; //don't leak memory
  } else {
    try{
      doSomething(data);
      q.shift(false); //reject false
      delete mcache[messagehash]; //don't leak memory
    } catch(e) {
      mcache[messagehash]++;
      q.shift(true,true); //reject true, requeue true
    }
  }
}

メッセージに GUID がある場合は、ハッシュ関数でそれを返すだけです。

于 2014-02-18T19:33:35.087 に答える