Распределенная system обмена сообщениями, broker message (базовый до понимания kafka, rabbitmq)
Здравствуйте, это codeshow.
В этом классе мы изучим распределенную систему обмена сообщениями.
В системе обмена сообщениями сообщение — это данные, которыми можно обмениваться между двумя или более отношениями.
Данные здесь обычно представляют собой двоичные данные. Отправляйте и получайте данные с помощью сериализаторов, таких как json или Protocol Buffers.
С системой обмена сообщениями посередине одна сторона имеет publisher, а другая сторона имеет отношения подписчика.
publisher— это клиент, который создает сообщения и отправляет их в очереди сообщений. Отправка сообщения в очередь называется publish .
Подписчик — это клиент, который получает сообщения из очереди сообщений. Получение сообщений из очереди называется consume .
Сообщения publish publisher , а сообщения проходят через систему обмена сообщениями к подписчикам.
Сообщения всегда идут в одну сторону: от publisher в систему обмена сообщениями к подписчикам.
Для справки мы используем термины «producer» вместо «publisher » и «consumer» вместо «подписчик».
Кроме того, pub и sub используются для сокращения publisher и подписчика.
Чтобы понять отношения между publisher и подписчиком, я объясню код в качестве примера.
package main
import "time"
func main() {
c := make(chan string)
go pub(c)
go sub(c)
select {}
}
func sub(c <-chan string) {
for {
message := <-c
println(message)
}
}
func pub(c chan<- string) {
c <- "Hello World 1"
time.Sleep(1 * time.Second)
c <- "Hello World 2"
time.Sleep(1 * time.Second)
c <- "Hello World 3"
time.Sleep(1 * time.Second)
c <- "Hello World 4"
time.Sleep(24 * time.Hour)
}
В этом коде в основной функции создается канал строкового типа.
Функция pub publish символ «Hello World».
И подпрограмма выводит «Hello World», когда сообщение поступает в канал в бесконечном цикле for.
Внутри функции pub мы publish строку в канал,
Подфункция consume строку через канал.
Модуль, который consume и обрабатывает сообщения, также называется worker.
Отношения между publisher, системой обмена сообщениями и подписчиком обсуждались ранее.
В приведенном выше старом языковом коде функция pub действует как publisher, а подфункция действует как подписчик.
И вы можете думать о переменной c строкового типа канала между этим pub и sub как о системе обмена сообщениями.
Если язык не обеспечивает обмен сообщениями, как GoLanguage, это делает фреймворк.
Взяв в качестве примера Java Spring Framework, он выдает сообщения типа ApplicationEvent.
И вы можете подписаться на publish сообщения через аннотацию EventListener.
В настоящее время о системе обмена сообщениями заботится среда Spring.
Обратите внимание, что сообщения и события похожи.
Разница между ними заключается в том, что обмен сообщениями обычно хранит сообщения в хранилище под названием «Очередь», поэтому подписчики могут обрабатывать их позже, а не сразу.
События отправляются подписчикам в момент их возникновения, а события уничтожаются.
Как объяснялось выше, обмен сообщениями имеет хранилище под названием «Очередь».
Вот почему это называется очередью сообщений.
Как правило, системы обмена сообщениями предназначены для доставки и обработки сообщений в распределенной среде.
Таким образом, ни каналы языка Go, ни EventListeners Spring Framework не являются системами обмена сообщениями в ограниченном контексте.
Однако и предыдущее, и последующее следуют архитектуре, управляемой событиями, и могут рассматриваться как системы обмена сообщениями в широком смысле.
Теперь давайте рассмотрим kafka и rabbitmq, которые являются наиболее часто используемыми распределенными системами обмена сообщениями.
Во-первых, kafka и rabbitmq — это системы обмена сообщениями, работающие в распределенной среде.
Также называется broker message .
Распределенные системы обмена сообщениями обычно обеспечивают масштабируемость, высокую доступность и надежность.
- Для масштабируемости kafka и rabbitmq могут настроить cluster.
Это позволяет горизонтальное масштабирование за счет увеличения количества узлов.
Пропускную способность можно увеличить за счет горизонтального масштабирования. - Высокая доступность означает, что система обмена сообщениями остается работоспособной, даже если некоторые узлы не работают.
- Надежность — это надежное поведение доставки сообщений, например, отсутствие потери опубликованных сообщений и отсутствие отправки дубликатов сообщений подписчикам.
kafka и rabbitmq удовлетворяют вышеуказанным критериям как распределенные системы обмена сообщениями.
И publisher publish по одному сообщению за раз, но через систему обмена сообщениями это сообщение может быть реплицировано и доставлено в несколько queue.
Например,
kafka делит сообщения на topic.
И эта topic снова разбита на несколько partition.
А на стороне подписчика несколько worker могут использовать одно сообщение через группы consumer .
rabbitmq состоит из exchange и queue.
Обмены определяют маршрутизацию, в какие queue доставляются сообщения.
У Rabbitmq есть 4 типа обмена: прямой, разветвленный, topic и заголовки.
Сообщения могут не только пересылаться на различные биржи, но также может выполняться маршрутизация от биржи к бирже.
По сравнению с kafka, rabbitmq имеет очень гибкий и удобный дизайн маршрутизации сообщений.
Вместо этого, поскольку rabbitmq является queue , если consumer удаляет сообщение из queue , сообщение удаляется из queue.
С другой стороны, в kafka единицами хранения являются topic и partition , а не queue .
topic— это логическая единица, которая отличает сообщения, а фактически сохраняемая единица — это partition.
Кроме того, когда consumer получает сообщения из partition, он не удаляет сообщения, как queue.
Запомните конкретное offset и подпишитесь на данные после offset . Это как массив.
В этом отличие Rabbitmq может прикреплять несколько подписчиков к одной queue, а kafka может прикреплять к одному partition только одну группу consumer .
Разница между ними также заключается в разнице в хранении.
rabbitmq в основном находится в памяти , kafka— на диске.
Вот почему мы используем kafka в качестве постоянного хранилища данных, такого как база данных.
Эта разница в поведении отражается в конструкции системы обмена сообщениями в зависимости от того, для чего предназначена система обмена сообщениями.
rabbit mq предназначен для организации очереди message .
Таким образом, по сравнению с kafka, очередь сообщений очень гибкая в отношении маршрутизации, создания и удаления queue .
kafka нацелена на обработку больших сообщений по сравнению с rabbitmq.
Таким образом, по сравнению с rabbitmq, он имеет более высокую производительность для массовой пакетной обработки.
Выше мы рассмотрели распределенные системы обмена сообщениями и кратко рассмотрели rabbitmq и kafka.
Мы подробнее рассмотрим kafka и rabbitmq через код.
Наконец, мы суммировали 5 причин, по которым мы используем системы обмена сообщениями.
- Коммуникация: данные могут передаваться между publisher и подписчиком. Это освобождает вас от ограничений между разными языками, платформами и неоднородностями.
- Асинхронный. По сравнению с синхронным обменом данными асинхронный обмен данными может повысить производительность по сравнению с процедурным обменом данными.
- Высокая доступность. В распределенной системе обмена сообщениями нормальная работа гарантируется, даже если некоторые системы обмена сообщениями не работают, хотя производительность может снизиться.
- Повторная попытка: даже если worker выходит из строя, сообщения остаются в queue, поэтому, если worker возвращается, он может продолжить работу после предыдущей неудачной операции. Даже при сокращении реального времени согласованность данных становится надежной.
- Слабая связанность: благодаря косвенным вызовам через систему обмена сообщениями, а не прямым вызовам, стороне publisher не нужно знать всю бизнес-логику после публикации сообщения. Это роль publisher только до публикации. Затем сообщение доставляется абоненту через систему обмена сообщениями. Теперь за обработку сообщения отвечает подписчик. Слабая связь, достигаемая за счет косвенных, а не прямых вызовов publisher, позволяет нашему программному обеспечению быть более гибким и масштабируемым.
Настройки подписки и лайков очень полезны для создателей контента.
Спасибо