Удалить сообщение после использования в KAFKA

Я использую Apache Kafka для производства и потребления файла размером 5 ГБ. Я хочу знать, есть ли способ, когда сообщение из темы автоматически удаляется после его использования. Есть ли у меня какой-либо способ отслеживать потребленные сообщения? Я не хочу удалять это вручную.

5 ответов

Решение

В Kafka ответственность за то, что было потреблено, является ответственностью потребителя, и это также является одной из главных причин, почему Kafka обладает такой большой горизонтальной масштабируемостью.

Использование высокоуровневого пользовательского API автоматически сделает это за вас, зафиксировав потребленные смещения в Zookeeper (или более поздняя опция конфигурации используется специальной темой Kafka для отслеживания потребляемых сообщений).

Простой потребительский API поможет вам разобраться, как и где отслеживать отслеживаемые сообщения самостоятельно.

Очистка сообщений в Kafka выполняется автоматически либо путем указания времени хранения для темы, либо путем определения дисковой квоты для нее, поэтому для вашего случая одного файла объемом 5 ГБ этот файл будет удален по истечении заданного вами периода хранения независимо от был ли он потреблен или нет.

Вы не можете удалить сообщение Kafka о потреблении

В Kafka нет механизма для непосредственного удаления сообщения при его использовании.

Самая близкая вещь, которую я нашел при попытке сделать это, - это трюк, но он не тестировался и по замыслу не работает с самыми последними сообщениями:

Потенциальный трюк для этого заключается в использовании комбинации (а) сжатой темы и (б) настраиваемого разделителя (в) пары перехватчиков.

Процесс будет следующим:

  1. Используйте перехватчик производителя, чтобы добавить GUID в конец ключа перед его записью.
  2. Используйте настраиваемый разделитель, чтобы игнорировать GUID для целей разделения
  3. Используйте сжатую тему, чтобы затем можно было удалить любое отдельное сообщение, которое вам нужно, через Producer.send(ключ +GUID, null)
  4. Используйте перехватчик потребителя, чтобы удалить GUID при чтении.

Но вам не нужна эта возможность

У вас есть один или несколько потребителей, и вы хотите, чтобы сообщение было использовано ими только один раз?

Поместите их в одну группу потребителей

Хотите избежать сообщений о переполнении диска?

Настройте срок хранения с точки зрения дискового пространства и / или времени

Насколько мне известно, вы можете удалить использованные данные из журналов, уменьшив время хранения. Время по умолчанию для журнала установлено на 168 часов, после чего данные автоматически удаляются из созданной вами темы Kafka. Итак, мое предложение состоит в том, чтобы уменьшить server.properties который находится в папке конфигурации и изменить 168 до минимального времени. так что их нет данных по истечении определенного времени, которое вы установили для log.retention.hours. Так что ваша проблема будет решена.

log.retention.hours = 168

Продолжайте кодировать

Вы можете использовать группу consumer_group: Kafka гарантирует, что сообщение будет прочитано только одним потребителем в группе. https://www.tutorialspoint.com/apache_kafka/apache_kafka_consumer_group_example.htm

Я только что запустил эту проблему и создал скрипт, который можно периодически запускать, чтобы «пометить» использованные записи как удаленные. Kafka не сразу освободит место, а удалит разделы со смещениями за пределами «активных».

https://gist.github.com/ThePsyjo/b717d2eaca2deb09b8130b3e917758f6

Другие вопросы по тегам