zsyzhou 发表于 2017-4-16 11:03:23

metaq使用memcache作为消费者去重的风险

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本身消息重复消费的情况就微乎其微,同时运行到相同函数的情况就更少了。但是需要注意这种情况
页: [1]
查看完整版本: metaq使用memcache作为消费者去重的风险