DynoQueue POP的时候有时候会出现cannot add XX to the unack shard。
经过分析,有一种场景是由于queue的数据不足,而以下代码会导致id重复获取并进行多次获取数据导致。
POP函数取ID核心代码如下:
prefetchIds();
while (prefetchedIds.size() < messageCount && ((clock.millis() - start) < waitFor)) {
Uninterruptibles.sleepUninterruptibly(200, TimeUnit.MILLISECONDS);
prefetchIds();
}
return _pop(shardName, messageCount, prefetchedIds);
private int doPrefetchIdsHelper(String queueShardName, AtomicInteger prefetchCounter,
ConcurrentLinkedQueue<String> prefetchedIdQueue, double prefetchFromTs) {
if (prefetchCounter.get() < 1) {