Относительно Q1: Да, вы можете получить то же поведение от KafkaBolt
, установив это свойство, KafkaBolt просто оборачивает KafkaProducer
.
Что касается семантики на стороне потребления, у вас есть то же самоеварианты с Storm, как вы делаете с Kafka. Когда вы читаете сообщение от Kafka, вы можете выбрать фиксацию до или после выполнения вашей обработки (например, запись в базу данных). Если вы сделаете это раньше, и программа потерпит крах, вы потеряете сообщение. Давайте назовем это at-most-once processing
. Если вы сделаете это после, вы рискуете обработать одно и то же сообщение дважды, если после обработки произойдет сбой программы, но до принятия, под названием at-least-once processing
.
Итак, что касается Q2: Да, использование привязанных кортежей и блокировка обеспечатВы с at-least-once
семантикой. Если вы не используете привязанный кортеж, вы получите at-most-once
.
Да, есть еще что-то, что Storm предлагает для точного обеспечения семантики, называемой Trident, но это требует от вас писать свою топологию по-другому, и ваше хранилище данных должно бытьадаптированы к нему, так что дедупликация сообщений может произойти. См. Документацию по адресу https://storm.apache.org/releases/2.0.0/Trident-tutorial.html.
Также просто предупреждаю вас: когда в документации по Storm (или Kafka) говорится о семантике «точно один раз», существуют некоторые предположения относительно того, какой тип обработки вы будете выполнять. Например, когда документы Storm о Trident говорят ровно один раз, есть предположение, что вы адаптируете свою базу данных, чтобы при получении сообщения вы могли решить, было ли оно сохранено. Когда документация Кафки говорит об одномоментном предположении, предполагается, что ваша обработка будет считывать данные из Кафки, выполнять некоторые вычисления (скорее всего без побочных эффектов) и записывать обратно в Кафку.
Это просто говорит о том, что для некоторых типов обработки вам все равно может потребоваться выбор между at-least-once
и at-most-once
. Если вы можете сделать свою обработку идемпотентной, at-least-once
- хороший вариант.
Наконец, если ваша обработка соответствует модели «читать из Kafka, делать вычисления, записывать в Kafka», вы, вероятно, можете получить более хорошую семантику изKafka Streams чем Storm, так как Storm не может обеспечить семантику, которую Кафка может предоставить в этом случае точно.