Чтение из кафки с фильтрацией - архитектурная ошибка?
Верно ли утверждение, что читать сообщения из кафки и потом фильтровать его на основе какого-то параметра - плохая идея и это архитектурная ошибка?
Ответы (1 шт):
Если под фильтрацией вы имеете в виду отбор только части нужных вам сообщений по какому-то признаку, то в идеале под каждую цель должен быть выделен некий топик, который вы читаете целиком. Если в Kafka попадают какие-то данные, из которых часть нужна одним консьюмерам, а часть другим, то фильтровать данные на консьюмере - плохая идея, потому что получается, что вы зазря гоняете через Kafka лишние данные. Есть специальная концепция Kafka streams, которая предназначена как-раз для того, чтобы фильтровать данные из Kafka и класть обратно в неё же.
Например, у вас есть некий топик AllData с данными, часть из которых нужна одним консьюмерам, а часть другим. Вы пишете сервис на Kafka streams, который осуществляет фильтрацию и кладёт отфильтрованные данные обратно же в Kafka, скажем в топики SystemData и ClientData. И потом консьюмеры двух разных групп читают эти топики целиком, уже без фильтрации. Такая схема правильная.
Просто считается, что пишутся данные один раз, а читаться могут много раз по разным причинам. Один и тот же топик могут читать разные группы консьюмеров, например. Или консьюмер может периодически перестартовывать и читать заново тот же топик. Поэтому лучше сразу данные отфильтровать и положить в отдельный топик, тогда оверхед на эту фильтрацию будет минимальный - она будет произведена только один раз сразу при записи в фильтруемый вами топик, а не каждый раз при чтении из фильтруемого топика, как в примере из вашего вопроса.
Если же вы точно уверены, что данные из топика читаются строго один раз и только вами, тогда разницы где фильтровать данные, конечно, не будет.