metaq使用的是消费者分组+offset作为判断去重标志的key的,代码如下:
private String cacheKey(final Long id, String group) {
return group + id;
}
其中id为服务端传递过来的msgid,生成规则可以看
http://blog.csdn.net/liudunxu123/article/details/18009091
使用memcached并不能完全的杜绝相同消费者分组的多个进程的重复消费,原因如下:
一种情况如下:
两个相同分组的消费者进程,消费同一条消息,同时运行到如下函数:
private boolean isProcessed(final Long id, String group) {
if (messageIdCache != null) {
return messageIdCache.get(this.cacheKey(id, group)) != null;
}
else {
return false;
}
}
会发现当前的key是不存在的,还是会重复消费两次。
不过metaq本身消息重复消费的情况就微乎其微,同时运行到相同函数的情况就更少了。但是需要注意这种情况