一個可能的解決方案是使用散列某種定義散列函數的消息,然後檢查緩存對象的散列。如果存在,請將緩存中的內容添加到可配置的最大值,如果不存在,請將其設置爲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,你可以直接在散列函數中返回它。
可能唯一複製http://stackoverflow.com/q/17654475 – pinepain
你是如何確定的消息?你在消息有效載荷中有你自己的ID嗎? –
在我的情況(但我不是OP) - 是的,消息可以通過他們的UUID識別。唉,在訂閱者中只有一個簡單的計數器是不夠的,因爲我有多個訂閱者到同一個隊列來平衡工作,重試次數應該是全局的,而不是每個工作者本地的。 –