Как сделать так, чтобы сообщения Kafka не терялись?

Kafka

Это 9-й день моего участия в августовском испытании обновлений.Подробности о мероприятии:Испытание августовского обновления

текст

如何保证 Kafka 的消息不丢失?.png

  1. Вместо использования производителя.send(msg) используйте производителя.send(msg, обратный вызов).
  2. Установить acks=все. acks — это параметр Producer, который представляет ваше определение «зафиксированного» сообщения. Если установлено значение «все», это означает, что все брокеры реплик должны получить сообщение до того, как сообщение будет «зафиксировано». Это определение самого высокого уровня «совершенного».
  3. Установите повторы на большее значение. Повторы здесь также являются параметром Продюсера, который соответствует упомянутому выше автоматическому повтору Продюсера. Когда происходит мгновенное дрожание сети, отправка сообщения может завершиться ошибкой.В это время источник, настроенный с повторными попытками> 0, может автоматически повторить попытку отправки сообщения, чтобы избежать потери сообщения.
  4. Установите unclean.leader.election.enable = false. Это параметр на стороне брокера, который определяет, какие брокеры имеют право работать в качестве лидера раздела. Если Брокер слишком сильно отстает от первоначального Лидера, как только он станет новым Лидером, это неизбежно приведет к потере сообщений. Поэтому вообще необходимо установить этот параметр в false, то есть такая ситуация не допускается.
  5. Установите replication.factor >= 3. Это также параметр на стороне брокера. На самом деле, что я хочу здесь выразить, так это то, что лучше всего сохранить еще несколько копий сообщения, ведь основным механизмом предотвращения потери сообщения является избыточность.
  6. Установите min.insync.replicas > 1. Это по-прежнему параметр на стороне брокера, который определяет количество реплик, в которые должно быть записано сообщение, прежде чем оно будет считаться «зафиксированным». Установите значение больше 1, чтобы повысить надежность сообщения. Никогда не используйте значение по умолчанию 1 в реальной среде.
  7. Убедитесь, что replication.factor > min.insync.replicas. Если они равны, то пока одна реплика выйдет из строя, весь раздел не будет работать. Мы хотим не только повысить надежность сообщений и предотвратить потерю данных, но и сделать это без ущерба для доступности. Рекомендуется установить replication.factor = min.insync.replicas + 1.
  8. Убедитесь, что потребление сообщения завершено, а затем отправлено. На стороне потребителя есть параметр enable.auto.commit, лучше всего установить его в false и отправить смещение вручную.