У меня есть две таблицы
CREATE TABLE IF NOT EXISTS QueueBucket (
queueName text,
bucketId int,
scheduledMinute timestamp,
scheduledTime timestamp,
messageId uuid,
PRIMARY KEY ((queueName, bucketId, scheduledMinute), scheduledTime, messageId)
) WITH compaction = { 'class' : 'LeveledCompactionStrategy' } AND speculative_retry='NONE' ;
CREATE TABLE IF NOT EXISTS InDelivery (
queueName text,
nodeId uuid,
dequeuedMinute timestamp,
messageId uuid,
bucketid int,
dequeuedTime timestamp,
PRIMARY KEY ((queueName, nodeId,bucketId, dequeuedMinute),dequeuedTime, messageId)
);
В коде я выполняю вставку в QueueBucket и удаление из недоставки в пакетном режиме (в журнале). Но во время нагрузочного тестирования иногда не работает удаление из недоставки, хотя вставка в QueueBucket работает. Чтобы подтвердить это, применяется проверка чтения из недоставки, сразу после которой прочтение удаленного messageId, если messageId все еще существует, распечатывает журнал WARN.
queueDao.insertMsgInfo(queueName, bucketId, QueueUtils.getMinute(scheduledTime), scheduledTime, messageId);
queuDao.deleteInDelivery(queueName, nodeId, bucketId, bucketMinute, dequeuedTime, messageId);
if(queueServiceMetaDao.hasIndeliveryMessage(inDeliveryPK)) {
log.warn("messageId {} of queue {} bucket {} with node {} dequuedTime {} dequeud minute {} could not get deleted from indelivery.",
messageId,queueName,bucketId, nodeId,QueueUtils.dateToString(dequeuedTime),QueueUtils.dateToString(bucketMinute));
}
в методах insertMsgInfo и deleteInDelivery я повторно использую подготовленный оператор.
"INSERT INTO queuebucket (queuename, bucketid , scheduledminute, scheduledtime, messageid ) VALUES ( ? , ? , ? , ? , ? );"
"DELETE FROM indelivery WHERE queuename = ? AND nodeId = ? AND bucketId=? AND dequeuedMinute=? AND dequeuedTime =? AND messageId=? ;"
в hasIndeliveryMessage я передаю те же значения, упакованные в inDeliveryPrimaryKey, которые я передал для удаления данных о недоставке в методе moveBackToQueueBucket.
"SELECT messageId FROM indelivery WHERE queuename = ? AND nodeId = ? AND bucketId=? AND dequeuedMinute=? AND dequeuedTime=? AND messageId=? ;"
Я не понимаю, почему я вижу несколько предупреждений "не удалось удалить из-за недоставки". . Пожалуйста помоги
Я использую cassandra версии 2.2.7, это кластер cassandra с 6 узлами с коэффициентом репликации 5, а используемая согласованность чтения и записи - QUORUM.
Я также просмотрел ссылку Cassandra - удаленные данные все еще там и https://issues.apache.org/jira/browse/CASSANDRA-7810, но эта проблема исправлена. давным-давно. в 2.0.11.
Дальнейшее обновление Согласно Cassandra - Delete not working, я также запустил nodetool ремонт, но проблема не устранена. Следует ли мне также работать компактно?
Дальнейшее обновление: я больше не использую пакет, я просто вставляю его в очередь и удаляю для недоставки, а затем читаю данные, но проблема все еще сохраняется.
Добавление журналов:
2016-07-19 20:39:42,440[http-nio-8014-exec-12]INFO QueueDaoImpl -deleting from indelivery queueName pac01_deferred nodeid 1349d57f-28f5-37d4-9fe1-dfa14dba4a9f bucketId 382 dequeuedMinute 20160719203900000 dequeuedTime 20160719203942310 messageId cc4fb158-f61e-345b-8dcf-3f842fe52d50:
2016-07-19 20:39:42,442[http-nio-8014-exec-12]INFO QueueDaoImpl -Reading from indelivery : queue pac01_deferred nodeId 1349d57f-28f5-37d4-9fe1-dfa14dba4a9f dequeueMinute 20160719203900000 dequeueTime 20160719203942310 messageid cc4fb158-f61e-345b-8dcf-3f842fe52d50 bucketId 382 indeliveryRow Row[cc4fb158-f61e-345b-8dcf-3f842fe52d50]
2016-07-19 20:39:42,442[http-nio-8014-exec-12]WARN QueueImpl -messageId cc4fb158-f61e-345b-8dcf-3f842fe52d50 of queue pac01_deferred bucket 382 with node 1349d57f-28f5-37d4-9fe1-dfa14dba4a9f dequuedTime 20160719203942310 dequeud minute 20160719203900000 could not get deleted from indelivery .
Стоит ли пробовать ВСЕМ согласованность ???