Как транслировать большие файлы через Кафку? - PullRequest
5 голосов
/ 09 июня 2019

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

Мой подход заключается в том, чтобы разбить файл на пронумерованные блоки и отправить несколько сообщений (например, 1 FileCreatedMessage с метаданными и идентификатором, за которым следует n FileContentMessage, содержащий блок и его порядковый номер). На принимающей стороне сообщения могут поступать не по порядку. Поэтому я буду хранить блоки из сообщений, заказывать их, объединять и сохранять результат.

Существует ли какой-либо подход, который позволяет мне передавать данные через Kafka с тем или иным сообщением без дополнительных затрат на реализацию логики разделения, упорядочения и объединения для нескольких сообщений?

Я заметил Kafka Streams. Кажется, он решает другие проблемы, чем этот.

Ответы [ 2 ]

2 голосов
/ 10 июня 2019

Я стараюсь не использовать Кафку для хранения больших файлов. Вместо этого я сохраняю файл в распределенной файловой системе (обычно HDFS, но есть и другие хорошие), а затем помещаю URI в сообщение Kafka вместе с любыми другими метаданными, которые мне нужны. Вы должны быть осторожны со временем репликации в распределенной файловой системе, если обрабатываете тему Kafka на платформе с распределенной потоковой передачей (например, Storm или Flink). Могут быть случаи, когда сообщение Kafka обрабатывается до того, как DFS сможет реплицировать файл для доступа локальной системы, но это легче решить, чем проблемы, вызванные хранением большого файла в Kafka.

2 голосов
/ 09 июня 2019

Кафка не подходит для отправки больших файлов.Во-первых, необходимо убедиться, что фрагменты одного сообщения будут поступать в один и тот же раздел, чтобы они обрабатывались одним экземпляром потребителя.Слабым местом здесь является то, что ваш потребитель может потерпеть неудачу в середине, потеряв куски, как он понял.Если вы храните чанки в некотором хранилище (базе данных) до тех пор, пока все они не будут доставлены, вам понадобится отдельный процесс для их сборки.Вам также необходимо подумать о том, что произойдет, если вы потеряете чанк или у вас возникнет ошибка во время обработки чанка.Мы думали об этом вопросе в нашей компании и решили вообще не отправлять файлы через Kafka, хранить их в хранилище и отправлять ссылку на них внутри сообщения.

В этой статье обобщены плюсы и минусы.

Потоки Кафки здесь вам не помогут, поскольку это фреймворк, который содержит высокоуровневые конструкции для работы с потоками, но онпросто работает над Кафкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...