Прежде всего, zookeeper нужен только потребителю высокого уровня. SimpleConsumer
для работы не требуется zookeeper.
Основная причина, по которой zookeeper необходим высокоуровневому потребителю, заключается в отслеживании потребляемых смещений и балансировке нагрузки.
А теперь поподробнее.
Что касается отслеживания смещения, представьте следующий сценарий: вы запускаете потребителя, принимаете 100 сообщений и закрываете потребителя. В следующий раз, когда вы запустите своего потребителя, вы, вероятно, захотите возобновить работу с вашего последнего потребленного смещения (которое равно 100), а это означает, что вам нужно где-то сохранить максимальное потребляемое смещение. Здесь начинается работа zookeeper: он хранит смещения для каждой группы / темы / раздела. Таким образом, в следующий раз, когда вы запустите своего потребителя, он может спросить: «Эй, смотритель, с какого смещения я должен начать потребление?». Kafka фактически движется к тому, чтобы иметь возможность хранить смещения не только в zookeeper, но и в других хранилищах (на данный момент доступны только zookeeper
и kafka
хранилища смещений, и я не уверен, что kafka
хранилище полностью реализовано).
Что касается балансировки нагрузки, количество создаваемых сообщений может быть довольно большим для обработки на одной машине, и вы, вероятно, захотите добавить вычислительную мощность в какой-то момент. Допустим, у вас есть тема со 100 разделами, и для обработки этого количества сообщений у вас есть 10 машин. На самом деле здесь возникает несколько вопросов:
- как эти 10 машин должны делить разделы между собой?
- что произойдет, если одна из машин умрет?
- что произойдет, если вы захотите добавить еще одну машину?
И снова здесь начинается работа zookeeper: он отслеживает всех потребителей в группе, и каждый потребитель высокого уровня подписывается на изменения в этой группе. Дело в том, что когда потребитель появляется или исчезает, zookeeper уведомляет всех потребителей и запускает перебалансировку, чтобы они разделяли разделы примерно поровну (например, для балансировки нагрузки). Таким образом, он гарантирует, что если один из потребителей умрет, другие продолжат обработку разделов, принадлежащих этому потребителю.
person
serejja
schedule
13.01.2015