2017-02-10 5 views
1

Я вижу в некоторых ответах вокруг переполнения стека и в целом в Интернете идея о том, что Kafka не поддерживает потребление, признает или что ровно столько раз, когда потребление трудно достичь.Kafka только один раз гарантия на потребление

В следующей записи в качестве образца Is there any reason to use RabbitMQ over Kafka?, я могу прочитать следующие высказывания:

RabbitMQ будет держать все государства о потребляются/признаваемых/неподтвержденные сообщения, в то время как Кафка не

или

Точно как только гарантии с Kafka трудно получить.

Это не то, что я понимаю, прочитав официальную Кафка документации по адресу: https://kafka.apache.org/documentation/#design_consumerposition

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

Это делает эквивалент подтверждений сообщений очень дешевых

Может кто-нибудь, пожалуйста, объясните, почему «только один раз гарантии потребления» в Кафке трудно достигать? и как это отличается от Kafka против другого более традиционного Message Broker как RabbitMQ? Что мне не хватает?

+0

Возможный дубликат [Apache Kafka: точно в версии 0.10] (http://stackoverflow.com/questions/38884267/apache-kafka-exactly-once-in-version-0-10) –

+0

Что вы подразумеваете под «только один раз гарантии потребления» обычно называют «ровно один раз». –

+0

1.AFAIK, ** потребление ** ровно один раз - проблема потребителя. Apache Kafka является брокером, поддерживающим пара-подэлемент. Таким образом, он традиционно не отслеживает смещение для потребителя. Это до потребителя, чтобы управлять тем, как потреблять. например Для обработки потока ваниль [Apache Storm] (http://storm.apache.org/releases/2.0.0-SNAPSHOT/Guaranteeing-message-processing.html) гарантирует хотя бы один раз, когда [Apache Trident] (http: // storm.apache.org/releases/2.0.0-SNAPSHOT/Trident-tutorial.html) - это точно один раз. – Confused

ответ

5

Если вы имеете в виду ровно один раз, то проблема такая. Потребитель Kafka, как вы знаете, использует механизм опроса, то есть потребители спрашивают сервер для сообщений. Кроме того, вам нужно вспомнить, что сообщение о коммитете потребителя смещается, то есть оно сообщает кластеру, что является следующим ожидаемым смещением. Итак, представьте, что может случиться.

Потребительский опрос для сообщений и получить сообщение со смещением = 1.

A) Если потребитель совершает это смещение непосредственно перед обработкой сообщения, то это может привести к сбою и никогда не получит это сообщение еще раз, потому что он уже совершил, в следующем опросе Kafka вернет сообщение со смещением = 2. Это то, что они называют не более чем одним семантическим.

B) Если потребитель сначала обрабатывает сообщение и затем фиксирует смещение, то может произойти то, что после обработки сообщения, но до совершения, потребитель сбой, поэтому в этом случае следующий опрос снова получит одно и то же сообщение со смещением = 1, и это сообщение будет обработано дважды. Это то, что они называют хотя бы один раз.

Для достижения ровно один раз вам необходимо обработать сообщение и зафиксировать это смещение в атомной операции, где вы всегда выполняете оба или ни одно из них. Это не так просто. Один из способов сделать это (если возможно) - сохранить результат обработки вместе со смещением сообщения, которое сгенерировало этот результат. Затем, когда потребитель начинает, он ищет последнее обработанное смещение за пределами Кафки и стремится к этому смещению.

Смежные вопросы