Может ли уплотнение Kafka перезаписывать сообщения с тем же ключом раздела?

Я использую следующий код для записи в Kafka:

String partitionKey = "" + System.currentTimeMillis();
KeyedMessage<String, String> data = new KeyedMessage<String, String>(topic, partitionKey, payload);

И мы используем версию Kafka 0.8.1.1.

Возможно ли, что при записи нескольких потоков некоторые из них (с разной полезной нагрузкой) записывают с одним и тем же ключом раздела, и из-за этого Кафка перезаписывает эти сообщения (из-за одного и того же ключа раздела)?

Документация, которая заставила нас задуматься в этом направлении: http://kafka.apache.org/documentation.html#compaction


person user2250246    schedule 30.10.2014    source источник


Ответы (2)


Я нашел еще несколько материалов по адресу https://cwiki.apache.org/confluence/display/KAFKA/Log+Compaction

Существенные моменты:

  1. До версии 0.8 Kafka поддерживала только один механизм хранения: удаление старых сегментов журнала.
  2. Сжатие журнала предоставляет альтернативу, заключающуюся в сохранении самой последней записи для каждого уникального ключа, а не только последних записей журнала.
  3. Для каждой темы есть возможность выбрать «удалить» или «сжать».
  4. Сжатие гарантирует уникальность каждого ключа в конце журнала. Он работает путем повторного копирования журнала от начала до конца, удаляя ключи, которые позже встречаются в журнале.
  5. Любой потребитель, который остается в пределах заголовка журнала (~ 1 ГБ), увидит все сообщения.

Таким образом, независимо от того, имеем ли мы сжатие журнала или нет, из этого следует, что Kafka удаляет старые записи, но записи в заголовке журнала защищены от этого.

Проблема с отсутствующими записями возникает только в том случае, если нижестоящие клиенты не могут очистить очереди Kafka в течение очень долгого времени (например, для ограничения размера/времени темы).

Я думаю, что это должно быть ожидаемым поведением, поскольку мы не можем хранить записи вечно. Их нужно когда-нибудь удалить.

person user2250246    schedule 04.11.2014

Звучит очень возможно. Сжатие сохраняет последнее сообщение для каждого ключа. Если у вас есть несколько сообщений с общим ключом, после сжатия будет сохранено только последнее. Обычным вариантом использования является репликация базы данных, когда интересно только последнее состояние.

person Gwen Shapira    schedule 01.11.2014
comment
Спасибо, Гвен. Но ваш ответ больше похож на предложение, как должно быть, чем на подтверждение. Мой вопрос больше о том, что данные не доходят до потребителей из-за сжатия. Отличается ли сжатие журнала от доставки сообщений? Возможно ли, что журналы сжаты, но клиенты все равно получают все сообщения с одним и тем же ключом? Если эта функция представлена ​​только в версиях 8.1*, будет ли это изменение несовместимо с предыдущими выпусками? - person user2250246; 03.11.2014
comment
1. Сжатие журнала отличается от доставки сообщения. Сжатие происходит на сервере независимо от того, использует ли кто-либо сообщения. - person Gwen Shapira; 04.11.2014
comment
2. Если клиенты читают сообщения вскоре после их написания, это будет сделано до уплотнения, и они получат все сообщения. - person Gwen Shapira; 04.11.2014
comment
В документации Kafka упоминается, что начиная с 0.8.1 очиститель журнала по умолчанию отключен. @ user2250246: вы включили сжатие глобально или для конкретной темы? Если он не включен явно, это должно быть что-то еще, что приводит к потере сообщений. - person Denis Makarenko; 04.11.2014