Не существует единственного «лучшего» способа сделать это, все будет зависеть от опыта вашей команды / организации и конкретных c требований к вашему проекту.
Самому Kafka безразлично, что сообщения действительно содержат. В большинстве случаев он просто видит значения сообщений и ключи как непрозрачные массивы байтов. преобразовать его в Kafka, потому что этого требует KafkaProducer
. Возможно, у вас уже есть настраиваемый сериализатор строк, может быть, вы можете сериализовать POJO в JSON с помощью Jackson или чего-то подобного. Или, может быть, вы просто отправляете в качестве сообщения огромную строку, разделенную запятыми. Это полностью зависит от вас.
Важно то, что потребитель, когда он извлекает сообщение из kafka topi c, может правильно и надежно прочитать данные из каждого поля в сообщении, без каких-либо ошибки, конфликты версий и т. д. c. Большинство существующих механизмов serde / schema, таких как Avro, Protobuf или Thrift, пытаются облегчить вам эту работу. Особенно сложные вещи, такие как обеспечение обратной совместимости новых сообщений с предыдущими версиями того же сообщения.
- Большинство людей в конечном итоге используют комбинацию:
- механизмов Serde для создания байта массивы для создания в Kafka, некоторые популярные: Avro , Protobuf , Thrift .
- Raw JSON strings
- Огромная строка с каким-то внутренним / настраиваемым форматом, который может анализироваться / анализироваться.
- Некоторые компании используют централизованную службу схем. Это сделано для того, чтобы вашим потребителям данных не нужно было заранее знать, какую схему содержит сообщение, они просто извлекают сообщение и запрашивают соответствующую схему у службы. У Confluent есть собственное решение для реестра с настраиваемой схемой, которое поддерживает Avro в течение многих лет, а через несколько недель go официально поддерживает Protobuf. Это не требуется , и если вы владеете сквозным производителем / потребителем, вы можете решить выполнить сериализацию самостоятельно, но многие люди к этому привыкли.
- В зависимости от типа сообщения иногда требуется сжатие, потому что сообщения могут быть очень повторяющимися и / или большими, поэтому в конечном итоге вы сэкономите довольно много места для хранения и пропускной способности, если отправляете сжатые сообщения, за счет некоторой загрузки ЦП и задержка. С этим также можно справиться самостоятельно на стороне производителя / потребителя, сжимая массивы байтов после того, как они были сериализованы, или вы можете запросить сжатие сообщений непосредственно на стороне производителя (ищите
compression.type
в документации Kafka).