Механизм сжатия предназначен главным образом для экономии ресурсов и улучшения механизма надежности Kafka.
спереди
Перед официальным стартом перед потребителем стоит один вопрос: использовал ли производитель алгоритм сжатия?
Ответ не требуется, в информации заголовка пакета сообщений Kafka он содержит поле Атрибут, и в этом поле есть несколько мест, специально используемых для идентификации алгоритма сжатия, используемого в этом пакете. Если после того, как потребитель получит данные, он обнаружит, что данные сжаты, то используйте распаковку соответствующего алгоритма сжатия, а затем передайте распакованные данные в бизнес-код.
гарантированная надежность
В вычислениях реального времени обычно существует три типа гарантированной надежности:
-
Максимум один раз: максимум один раз, даже сообщение может потеряться, но оно не повторится.
-
Хотя бы один раз: 最少onone, 即最合不是最作, 但可以使用。
-
Ровно один раз: ровно один раз сообщение не потеряется и не повторится.
Надежность поддержки Kafka по умолчанию гарантированно будет вторым поколением — по крайней мере один раз. Его принцип также очень прост, то есть он один, то есть Producer Broker хотя бы один раз.
В ситуациях с высокими требованиями к точности сообщения максимум один раз и хотя бы один раз не могут соответствовать требованиям, необходимо гарантировать точность один раз. В Flink точность гарантируется один раз через Checkpoint, тогда как в Kafka она гарантируется за счет мощности и транзакций.
власть
Что такое 绕等性
Давайте сначала посмотрим на силу власти, сначала объясним, что такое сила власти. Определение в математике такое: 帀是, 帀是 сила силы. Определение силы в математике таково: действие силы силы на любой элемент один и много раз, результат один и тот же.就不是。
В области компьютеров определение равенства мощности заключается в том, что состояние ресурса не меняется, когда пользователь инициирует одну и ту же операцию один или несколько раз.
Сила Кафки
После того, как мы поймем определение власти, мы сосредоточимся на том, как позволить Кафке обеспечить власть. По умолчанию производителем не является мощность, мы можем настроить параметр для создания источника мощности.
props.put("enable.idempotence", true);
// 或者
props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true);
是 Kafka 这是电影幂等性呢?答案手机最好的个电影电影: идентификатор производителя и порядковый номер
-
Идентификатор производителя: когда запускается один производитель, брокер присваивает ему уникальный идентификатор, и этот идентификатор производителя остается неизменным на протяжении всего жизненного цикла.
-
Номер заказа: Производитель.
После получения этих двух логотипов Брокер сохранит в памяти комбинацию (идентификатор производителя, порядковый номер) Last_sequence_number. В процессе написания сообщений вы можете столкнуться со следующими тремя типами ситуаций:
-
Обычная запись: получен порядковый номер 比 последний_порядковый номер 大1, брокер получает сообщение и обновляет последний_порядковый номер.。
-
Порядковый номер会佢弃情件,但会图像经 Производитель 手机成功。
-
佢了了/乱序: Если порядковый номер равен 比, thelast_sequence_number大了不止1,设计了漏了正了,是连一下载失,海天Broker会报错。
Выше мы упомянули, что идентификатор производителя остается неизменным в течение жизненного цикла производителя, если Производитель перезапускается, то Брокер присвоит ему новый идентификатор Производителя, так что он не может гарантировать, что сообщение не будет повторяться. Еще одним ограничением мощности власти является то, что она не может быть гарантирована по всему разделу. Для решения этих двух задач Кафка ввел транзакции.
дела
Начиная с версии 0.11, Kafka обеспечивает поддержку транзакций. Что касается определения транзакций, мы не поддерживаем ACID. В Kafka можно решить проблему разделения атомов и перезапуска производителя, что может привести к дублированию сообщений.
Открытие транзакции требует двух шагов настройки, при этом модифицируя код отправки сообщений.
Код отправки сообщения требует дополнительной обработки
producer.initTransactions();
try {
producer.beginTransaction();
producer.send(record1);
producer.send(record2);
producer.commitTransaction();
} catch (KafkaException e) {
producer.abortTransaction();
}
бизнес-процесс
Для поддержки транзакции Kafka представил основной компонент координатора транзакций и внутреннюю тему. __transaction_stateВесь процесс в основном состоит из двух стадий процесса.
1. инициализация
транзакция производителя.id。 事局手机器发动手机,会名物transaction.id的epoca, 以作送增的批次号,是老设计批次号可以,时电影者是被倂载倂
2. Открытие сделок
После завершения инициализации необходимо открыть транзакцию, даже вызвать ее beginTransaction() Метод. Пришло время сказать координатору, хочу начать тему 1 зонирование 0 отправить сообщение.__transaction_state Это предмет.
3. Отправить сообщение
В это время Продюсер начинает отправлять сообщения, эти сообщения будут записаны на диск Брокера, но будут иметь логотип «транзакция в процессе».
4. Определенные этапы
После отправки сообщения происходит вызов продукта commitTransaction() Как зафиксировать транзакции, здесь есть два шага.
-
Стадия подготовки: 事务名称器将事务手机改说 Подготовить фиксацию и писать
__transaction_state。 -
事年安全器向向公司小小Лидер 全部
WriteTxnMarkerзнак лидера.
5. завершение
Когда все Маркеры зонирования будут завершены, координатор транзакции изменит статус транзакции на Завершена, в противном случае
Вот и все, процесс отправки полного сообщения о транзакции завершен.
Как именно однажды
Broker呢? На стороне потребителя на самом деле есть управляющий параметр:isolation.levelон используется для контроля уровня изоляции. Есть два параметра этого параметра:
-
read_uncommited: это значение по умолчанию, чтение не фиксируется. То есть, независимо от статуса сообщения, только если оно записано на диске Брокера, оно может быть прочитано потребителем.
-
read_commited: это уже зафиксированное чтение, также мы можем открыть бизнес только тогда, когда это необходимо.
Kafka сможет поддерживать точную однократную надежность.
краткое содержание
我们来来电影的一个content,впервые представил надежность, гарантированную Kafka, по умолчанию используется по крайней мере один раз, может поддерживаться не более одного раза и ровно один раз. Поддержка именно одного времени зависит от уровня мощности, транзакции и уровня изоляции.
Наконец, мы оставляем позади проблему. Если производитель уже отправил большое количество сообщений, но перед окончательной отправкой координатор транзакции внезапно сбросит сообщение, как координатор транзакции обработает эту незавершенную транзакцию?