Kafka, старший брат очереди сообщений, говорит об этом на своем официальном сайте, который действительно властен: более 80% из 100 крупнейших компаний мира доверяют и используют Kafka. В настоящее время Kafka имеет 27,6 тысяч звезд и 13,6 тысяч форков на GitHub.
More than 80% of all Fortune 100 companies trust, and use Kafka.
Привет всем, я брат Нэн.
Ваш руководитель по развитию Java в настоящее время открывает доступ к руководству по развитию Java, которое поможет вашим друзьям успешно конкурировать за крупные компании. Сегодняшнее руководство посвящено WebSocket. Следуйте за братом Наном и давайте продвигать Java.
Диаграмма исторических звездных трендов Кафки
Эта статья включена в мое «Руководство по собеседованию по изучению Java» с открытым исходным кодом, расширенное руководство по Java, охватывающее основные знания, необходимые Java-программистам, и ключевые моменты собеседований. Я считаю, что это может помочь вам перейти на Java и перейти в крупные компании. Брат Нэн надеется получить ваши отзывы ⭐ Star ⭐Поддержка,Это самая большая мотивация для моего творчества.,GitHubадрес:https://github.com/hdgaadd/JavaGetOffer。
Интервьюер: Можете ли вы сначала рассказать мне, из каких модулей состоит Kafka?
KafkaПо сути, это продукт, основанный наМодель публикации и подпискисистема обмена сообщениями,Если спроектировано в соответствии со здравым смыслом,Хотите отправить сообщение от отправителя напрямуюпотребитель сообщений?ноKafkaЭто не так задумано,Производитель сообщений Kafka будет классифицировать сообщения.,Затем отправьте его в систему службы промежуточных сообщений.,ипотребитель сообщений Получайте определенные типы сообщений, подписавшись на сообщения определенной категории.。
Фактически, целью этой конструкции также является удовлетворение потребностей в доступе к большому количеству бизнес-сообщений.,Если одно сообщение отправлено и получено,Это запускает процесструбная связьВот и все。Кроме того, если вы знакомы с шаблонами проектированиямодель публикации/подпискизнакомые слова,Будет легче понять концепцию дизайна Kafka.
в общем,Kafka состоит из пяти основных модулей.,Каждый должен понимать функции этих модулей: продюсер сообщений、потребитель сообщений、Broker
、темаTopic
、РазделPartition
。
(1) Производитель сообщений
Производитель сообщения является создателем сообщения. Каждое отправленное сообщение будет отправлено в определенную тему.
(2) Потребитель сообщения
Как производители, так и потребители сообщений являются клиентами Kafka. Потребители сообщений, как следует из названия, являются читателями и потребителями сообщений. В то же время Kafka очень гибок: потребитель может подписаться на несколько тем, а сообщение темы также может обрабатываться несколькими потребителями в разных группах сообщений. Это открывает множество возможностей для нашего постоянно меняющегося бизнес-проекта, позволяя каждому играть свободно.
(3)Broker
Развернуто в одиночку вLinuxизKafkaСервер называетсяBroker
,Это то, что я упомянул вышеСистема обслуживания промежуточных сообщений
,Не недооценивайте его,Одиночный блокBrokerможно легко справитьсяМиллионы в секундуиз消息量。BrokerСодержание ежедневной работы – получатьпродюсер сообщенийиз消息,Установить смещение для каждого сообщения,Наконец, он отправляется на диск для сохранения.
(4)темаTopic
Выше мы знаем, что сообщения Kafka засекречены.,и分类из标识就是темаTopic
。Вы можете посмотреть конкретную реализацию кода, и ее будет легче понять.,продюсер сообщенийProducer
отправить вclock-topic
тема,потребитель сообщений Мониторинг потребленияclock-topic
тема下из消息。
// продюсер сообщений
public class Producer implements ApplicationRunner {
@Resource
private RedissonClient redissonClient;
@Resource
private KafkaTemplate<String, String> kafkaTemplate;
@Override
public void run(ApplicationArguments args) throws Exception {
RBlockingQueue<Clock> blockingFairQueue = redissonClient.getBlockingQueue("delay_queue");
while (true) {
Clock clock = blockingFairQueue.take();
kafkaTemplate.send("clock-topic", "key", clock.toString());
log.info("time out: {} , clock created: {}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()), clock.getTime());
}
}
}
// потребитель сообщений
@KafkaListener(topics = "clock-topic", groupId = "kafka-group")
public void listener(ConsumerRecord<String, String> record, Acknowledgment ack) {
log.info("listener get message: " + record.value());
ack.acknowledge();
}
(5)РазделPartition
Сообщения по каждой теме необходимо отправлять на диск Брокера.,Если мы построим кластер Kafka, состоящий из трех узлов Broker,Как правило, сообщения одной темы будут разделены на три раздела для хранения. Говоря об этом,Поскольку сообщения, отправленные последовательно, хранятся в разных Разделах,Мы не можем гарантировать, что сообщение будет кликнуто.Последовательное потребление,могу только гарантироватьтот же раздел下из消息被Последовательное потребление.
Интервьюер: Что делает разбиение?
Потребление Разделиз作用主要就是для了提高Kafka处理消息изПропускная способность,Кто звонитKafkaИзначально он проектировался как высококачественный Пропускная способность、Высокая доступность、Масштабируемые приложения.
Предположим, что в теме есть N разделов и N потребителей.,Каждый Раздел отправит сообщение соответствующему потребителю.,такN个Потребление者就可以балансировка нагрузкиобрабатывать сообщения。
в то же времяпродюсер сообщенийбудет отправлять сообщения в разные Раздел,Каждый раздел принадлежит отдельному брокеру.,Это делаетBrokerкластерплоское давление,Значительно улучшена «Пропускная способность» Кафки.
Всем нужно обратить внимание еще на одну вещь,Если количество потребителей темы превышает количество Разделов,超过数量из Потребление者是会被праздныйиз,Как правило, N Раздел может быть сопоставлен не более чем N потребителям.
Интервьюер: Вы знаете асинхронный обратный вызов производителя сообщения, верно?
Когда мы вызываем send() для асинхронной отправки сообщения,Вы можете указать функцию обратного вызова,Эта функция будет активирована, когда сервер брокера ответит. Как показано в исходном коде ниже,Мы можем предоставить параметры ответаListenableFuture
Добавьте реализацию функции обратного вызоваcallback
。
public ListenableFuture<SendResult<K, V>> send(String topic, K key, @Nullable V data) {
ProducerRecord<K, V> producerRecord = new ProducerRecord(topic, key, data);
return this.doSend(producerRecord);
}
public interface ListenableFuture<T> extends Future<T> {
void addCallback(ListenableFutureCallback<? super T> callback);
}
Так что же делает эта функция обратного вызова??Обычно мы используем его дляЗапись журнала исключений。
KafkaизАсинхронная отправка сообщенийпо сравнению ссинхронное Для представления нет необходимости блокировать поток до ответа Брокера, что также в определенной степени повышает скорость обработки сообщений. Но Асинхронная отправка我们是不知道消息из Потребление情况из,Теперь вы можете пройтиKafka提供из回调函数来告知程序ненормальная ситуация,Это облегчает вход в программу.
Интервьюер: Можете ли вы сказать мне разницу между отправкой вручную и автоматической отправкой потребителями?
Ручная и автоматическая отправка — это два метода клиентской смещенной отправки Kafka.,提交方式из配置选项是enable.auto.commit
,Эта опция верна по умолчанию.
Что такое коммит смещения?大家可以理解для Потребление者通知当前最新изпозиция чтениядавать Раздел,То есть сообщить Разделу, какие сообщения были использованы.
еслиenable.auto.commit
дляtrue代表提交方式для自动提交,默认для5 секундиз提交时间间隔。Каждый раз5 секунд,Клиент-потребитель автоматически зафиксирует максимальное смещение.
еслиenable.auto.commit
дляfalse代表提交方式для手动提交,我们需要让Потребление者客户端ПотреблениеПосле выполнения программы提交当前измаксимальное смещение。
Интервьюер: Каковы их преимущества и недостатки?
(1) Автоматическая подача
Автоматическая отправка удобнее. Нам даже не нужно настраивать метод отправки, но это может привести к потере сообщения или его повторному использованию.
Если это произойдет 5 секундиз时间间隔自动Поданныймаксимальное смещение,В это время произошел сбой клиентского клиента, на котором выполнялась программа обмена сообщениями.,приведет кСообщение потеряно。
Если сообщение успешно использовано,Потребитель должен автоматически отправить запрос в следующую секунду.,Но если потребительский клиент выйдет из строя в это время,приведет к其他Разделиз Потребление者Повторное потребление。
(1) Подача вручную
Отправка вручную требует, чтобы клиент-потребитель вручную отправил сообщение после использования сообщения. Метод отправки вручную делится на синхронную отправку и асинхронную отправку.
Ручная подачасинхронное представлениеиз话,Прежде чем Брокер ответит на запрос,Клиент всегда будет заблокирован,такиз话限制应用程序изПропускная способность。
Ручная подачаАсинхронная отправкаиз话,С Пропускной способностью проблем не будет. Однако после того, как клиент-потребитель отправит компенсацию Брокеру,ПлеватьBrokerВы получили сообщение?。这种情况就要采用上文我提到изпродюсер сообщенийАсинхронный обратный вызовдля регистрации,Записи журнала облегчают последующее устранение ошибок.,Эффективность работы действительно высокая😏.
Творить непросто, поэтому вы можете ставить лайки, собирать и подписываться, чтобы поддержать его. Ваша поддержка — самая большая мотивация для моего творчества.❤️