Ключи сообщений Apache Kafka
Kafka Producers собираются записывать данные в темы, а темы состоят из разделов. Теперь производители в Kafka будут автоматически знать, к какому брокеру и разделу писать, на основе вашего сообщения, и в случае сбоя брокера Kafka в вашем кластере производители автоматически восстановятся после него, что делает Kafka устойчивым и что делает Kafka таким хорошим и используемым Cегодня. Итак, если мы посмотрим на диаграмму, чтобы иметь данные в наших разделах тем, у нас будет производитель слева, отправляющий данные в каждый из разделов наших тем.
Итак, откуда производитель знает, как отправить данные в раздел темы? Для этого мы можем использовать Message Keys .
Ключи сообщений Кафки
Таким образом, наряду со значением сообщения мы можем отправить ключ сообщения, и этот ключ может быть любым, что вы хотите, это может быть строка, это может быть любое число, и получается, что если вы не отправите ключ, ключ имеет значение null, тогда данные будут отправлены в циклическом режиме, чтобы сделать это очень простым. Это означает, что ваше первое сообщение будет отправлено в раздел 0, затем ваше второе сообщение будет отправлено в раздел 1, затем в раздел 2 и так далее. Вот почему он называется циклическим перебором, но если вы отправите ключ вместе со своим сообщением, все сообщения с одним и тем же ключом всегда будут отправляться в один и тот же раздел.
Так что это очень важное свойство Kafka, потому что это означает, что если вам нужно упорядочить для определенного поля, например, если у вас есть автомобили, и вы хотите получить все позиции GPS в порядке для этого конкретного автомобиля, тогда вам нужно убедиться, чтобы ваш ключ сообщения был установлен в качестве уникального идентификатора для вашего автомобиля, то есть carID , и поэтому в нашем примере автомобильного GPS, который мы обсуждали в этой статье, Темы, разделы и смещения в Apache Kafka, нам нужно выбрать ключ сообщения равным в carID , чтобы у нас были все позиции автомобиля для этого конкретного автомобиля по порядку как часть одного и того же раздела.
Note: Please refer to the Topic Example that has been discussed in this article, Topics, Partitions, and Offsets in Apache Kafka, so that you can understand which example we are discussing here.
Итак, второй пример снова, если у нас производитель отправляет данные в 2 раздела, а ключ - carID, тогда carID_123 всегда будет идти в разделе 0, carID_234 также всегда будет идти в разделе 0, а carID_345 и carID_456 всегда будут идти в разделе 1. Идея здесь снова в том, что вы никогда не найдете данные carID_123 в разделе 1 из-за этого ключевого свойства, которое мы только что упомянули.
Итак, теперь давайте обсудим, как выглядит сообщение Кафки.
Анатомия послания Кафки
Сообщения Kafka создаются производителем, и первая фундаментальная концепция, которую мы обсудили, — это Ключ . Ключ может быть нулевым, а тип ключа — двоичным. Таким образом, двоичные числа — это 0 и 1, но это могут быть строки и числа, и мы увидим, как это происходит, чтобы преобразовать строку или число в двоичное число.
Пожалуйста, обратитесь к изображению выше. Итак, у нас есть ключ, который представляет собой двоичное поле, которое может быть нулевым, а затем у нас есть значение, которое является содержимым вашего сообщения, и опять же, оно также может быть нулевым. Таким образом, ключ-значение — это одна из двух самых важных вещей в вашем сообщении, но есть и другие вещи, которые входят в ваше сообщение. Например, ваше сообщение может быть сжато, поэтому тип сжатия может быть указан как часть вашего сообщения. Например, none означает отсутствие сжатия, но у нас есть четыре различных типа сжатия, доступных в Kafka, которые упомянуты ниже.
- gzip
- быстрый
- лз4
- зстд
У нас также есть дополнительные заголовки для вашего сообщения. Таким образом, заголовки представляют собой пары ключ-значение, и вы можете иметь много из них в части одного сообщения, и их обычно устанавливают на случай, если вы пытаетесь добавить метаданные в свои сообщения. Как только сообщение будет отправлено в тему Kafka, оно получит номер раздела и идентификатор смещения. Таким образом, раздел и смещение будут частью сообщения Kafka, а затем, наконец, отметка времени рядом с сообщением будет добавлена либо пользователем, либо системой, а затем это сообщение будет отправлено Kafka. Итак, помните, что ключ является двоичным, а значение двоичным, но когда мы начнем писать сообщения в Kafka, мы, очевидно, будем использовать некоторые объекты более высокого уровня, поэтому для преобразования этих объектов в двоичные файлы мы будем использовать Producer . Сериализатор .
Сериализатор производителя
Сериализатор укажет, как преобразовать эти объекты в байты, и они будут использоваться для ключа и значения. Скажем, например, что у нас есть значение «hello world» в виде строки и ключа «123», и это целое число. В этом случае нам нужно установить KeySerializer как IntegerSerializer , и то, что он будет делать внутри, заключается в том, что он преобразует это целое число в байты, и эти байты будут частью ключа, который будет двоичным, и то же самое для значение, которое представляет собой «привет, мир» в виде строки. Мы собираемся использовать StringSerializer в качестве ValueSerializer для преобразования этой строки в байты, и снова это даст нам наше значение как часть двоичного поля.
Ниже приведены некоторые распространенные сериализаторы.
- Строка (включая JSON, если ваши данные соседние)I
- Целое число и число с плавающей запятой
- Avro и Protobuf для расширенных типов данных