Штормовой болт после кафки - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть топология Storm, где я должен отправлять вывод в kafka, а также обновлять значение в redis. Для этого у меня есть Kafkabolt, а также RedisBolt. Вот как выглядит моя топология -

tp.setSpout("kafkaSpout", kafkaSpout, 3);

tp.setBolt("EvaluatorBolt", evaluatorBolt, 6).shuffleGrouping("kafkaStream");

tp.setBolt("ResultToRedisBolt",ResultsToRedisBolt,3).shuffleGrouping("EvaluatorBolt","ResultStream");

tp.setBolt("ResultToKafkaBolt", ResultsToKafkaBolt, 3).shuffleGrouping("EvaluatorBolt","ResultStream");

Проблема в том, что оба концевых болта (Redis и Kafka) прослушивают один и тот же поток из предыдущего болта (ResultStream), поэтому оба могут выйти из строя независимо. Что мне действительно нужно, так это то, что если результат успешно опубликован в Kafka, то только я обновляю значение в Redis. Есть ли способ получить выходной поток из kafkaBolt, где я могу успешно опубликовать сообщения в Kafka? Затем я могу, вероятно, прослушать этот поток в моем RedisBolt и действовать соответственно.

1 Ответ

0 голосов
/ 09 сентября 2018

В настоящее время это невозможно, если вы не измените код болта. Скорее всего, было бы лучше немного изменить свой дизайн, так как выполнение дополнительной обработки после записи кортежа в Kafka имеет некоторые недостатки. Если вы записываете кортеж в Kafka, но не можете писать в Redis, вы получите дубликаты в Kafka, так как обработка начнется заново на носике.

Может быть лучше, в зависимости от вашего варианта использования, записать результат в Kafka, а затем попросить другую топологию прочитать результат из Kafka и записать в Redis.

Если вам все еще нужно иметь возможность выпускать новые кортежи из болта, это должно быть довольно легко реализовать. У болта недавно появилась возможность добавить пользовательский обратный вызов Producer, чтобы мы могли расширить этот механизм.

См. Обсуждение в https://github.com/apache/storm/pull/2790#issuecomment-411709331 для контекста.

...