«Легко учиться» — RocketMQ

Java RocketMQ
«Легко учиться» — RocketMQ

Чем больше вы знаете, тем больше вы не знаете

Ставьте лайки и смотрите снова, формируйте привычку

эта статьяGitHub github.com/JavaFamilyОн был включен, и есть карты мозга, личная контактная информация и группы технического обмена для интервью с ведущими производителями.Добро пожаловать в Star и советы

рыбы

В первых двух главах серии об очередях сообщений говорилось оочередь сообщенийБазовые знания о , а также о более распространенных проблемах и общих решениях для распределенных транзакций, а затем в фактическом процессе разработки, какое промежуточное программное обеспечение очереди сообщений мы используем чаще?

Shuai C, промежуточное программное обеспечение очереди сообщений, с которым я столкнулся, так как моя работа включает в себя:RocketMQ,Kafka,Самостоятельное изучение, Да, потому что я в основном связываюсь с компаниями электронной коммерции. Условно говоря, они больше подходят для объема бизнеса и сценариев. Кроме того, в Ханчжоу есть много компаний, основанных на Alibaba, и мои коллеги или боссы компании в основном Али. Когда вы вышел, чтобы начать бизнес, когда вы использовали стек технологийПлатформа с открытым исходным кодом AlibabaЭто стало первым выбором.

Даже самостоятельно разработанное промежуточное ПО более или менее саморазрабатывается, опираясь на преимущества RocketMQ и Kafka. Затем я кратко представлю их в следующих двух главах. Они сияют в бизнес-сценариях и полях больших данных соответственно.

Это потеря морали или уничтожение человечества, давайте последуем за Ао Бингом во внутренний мир RocketMQ.

текст

Введение в RocketMQ

RocketMQ — это промежуточное ПО для сообщений с открытым исходным кодом, распределенное на основе Java, ранее известное как MetaQ, промежуточное ПО для сообщений модели очереди, разработанное Alibaba со ссылкой на характеристики Kafka. Позже оно было открыто для Apache Foundation и стало лучший проект Apache с открытым исходным кодом, который обладает характеристиками высокой производительности, высокой надежности, высокой производительности в реальном времени и распределенной работы.

Давайте посмотрим на имя, которое дал ему Али:RocketРакета Али надеется, что он попадет в рай, но я думаю, что это имя действительно крутое.

Давайте сначала взглянем на его последний официальный сайт.

Оглядываясь назад на свое путешествие

2007 г.: Taobao реализовал проект «Цветной камень», который используется для изменения системы транзакций с одной машины на распределенную.В этом процессе родился механизм обмена сообщениями первого поколения Alibaba, Notify.

2010 год: Отдел Alibaba B2B также разработал свой собственный механизм сообщений на основе версии ActiveMQ 5.1, названный Napoli, этот механизм сообщений широко используется в B2B, не только в области транзакций, но также во многих фоновых асинхронных развязках и т. д. также широко используется .

2011 год: В отрасли появился движок сообщений Kafka, который сейчас пользуется уважением во многих областях больших данных.После того, как Alibaba изучила общий механизм и архитектурный дизайн Kafka, дизайн, основанный на Kafka, был полностью переписан и запущен на Java.MetaQ 1.0Версия, в основном используемая для решения проблемы последовательных сообщений и массового накопления.

2012: Alibaba открыла исходный код своего промежуточного программного обеспечения для распределенных сообщений третьего поколения собственной разработки——RocketMQ.

После нескольких лет технической полировки Alibaba заявила, что на основе технологии RocketMQ текущая емкость сообщений, удваивающих одиннадцать дней, может достигать триллионов.

ноябрь 2016 г.: Али жертвует RocketMQApacheSoftware Foundation официально стал проектом-инкубатором.

Али сказал, что это сделает проект высшего уровня.Это большой шаг для Али., потому что присоединение к Open Source Software Foundation требует оценки и наблюдения рецензента.

Откровенно говоря, в индустрии до сих пор сохраняется стереотип участия китайцев в открытом коде, и среди 342 проектов в Apache Foundation пока только пять китайских техников во главе с Kylin, CarbonData, Eagle, Dubbo и RocketMQ. , проект.

20 февраля 2017 г.: RocketMQ официально выпустила версию 4.0 Эксперты говорят, что новая версия подходит для электронной коммерции, финансов, больших данных и модели программирования Интернета вещей.

Выше приведена общая история развития RocketMQ.На самом деле Alibaba создала три продукта на основе ядра RocketMQ, а именно:MetaQ,NotifyиAliware MQ.

Эти три используют разные модели,MetaQМодель вытягивания в основном используется для решения проблемы последовательных сообщений и массового накопления;NotifyМодель push в основном используется для обработки сообщений о транзакциях, в то время как облачные продуктыAliware MQДоступна коммерческая версия.

Герои, которые пережили несколько двойных 11 крещений

Готовясь к Double Eleven в 2016 году,RocketMqКоманда сосредоточилась надве вещи, оптимизировать медленные запросы и унифицированный механизм хранения.

  • Оптимизация медленных запросов: это в основном для устранения дрожания, вызванного медленными запросами ко всему кластеру в сценариях с массовым параллелизмом и высоким уровнем параллелизма.проблема с глюком. Это очень сложная техническая работа.После более чем месяца контроля и настройки товарищи по команде обнаружили, что 99,996% задержек приходится на 10 мс из обзора Double Eleven.И 99,6% задержки в пределах 1 мс. Оптимизация в основном направлена ​​наRocketMQОптимизация алгоритмов уровня хранения, настройка JVM и операционной системы. Для получения более подробной информации вы можете обратиться к «Распределенному механизму сообщений при наводнении данных на триллионном уровне».
  • Унифицированный механизм хранения: В основном решает высокая доступность и стоимость механизма сообщений. Исходя из сосуществования нескольких поколений механизмов обработки сообщений, мы полностью пересадили и заменили модули хранения Notify.

RocketMQ был создан для финансовой сферы Интернета., стремление к высокой надежности, высокой доступности, высокому параллелизму и малой задержке — это модель, которую Alibaba успешно взращивала изнутри.Помимо тысяч приложений Alibaba Group, согласно нашей неполной статистике, существует как минимум сотни отечественных единиц, используется научно-исследовательскими и образовательными учреждениями.

RocketMQВ Ali Group он также широко используется для заказа, транзакций, пополнения, потоковых вычислений, отправки сообщений, обработки потока журналов,binglogраздача и т.д.

функция у него

мы идем прямоGitHubПоглядиApacheМогло бы быть лучшее описание его

Да,функция полная до взрыва.В принципе развития вполне хватает,что? Не можете понять профессиональную лексику на английском языке?

Шуай Бин от теплого человека.Китайские функции следующие ↓

  • Модель обмена сообщениями публикации/подписки
  • Новости транзакций финансового уровня
  • Различные межъязыковые клиенты, такие как Java, C/C++, Python, Go
  • Подключаемые транспортные протоколы, такие как TCP, SSL, AIO
  • Встроенное отслеживание сообщений, также поддерживает открытое отслеживание
  • Универсальная интеграция больших данных и потоковой экосистемы
  • Перематывать сообщения по времени или смещению
  • Надежный FIFO и строго упорядоченная доставка сообщений в одной очереди
  • Эффективная двухтактная модель потребления
  • Совокупная емкость миллионов сообщений в одной очереди
  • Несколько протоколов обмена сообщениями, таких как JMS и OpenMessaging.
  • Гибкая распределенная масштабируемая архитектура развертывания
  • Молниеносная система обмена пакетными сообщениями
  • Различные механизмы фильтрации сообщений, такие как SQL и Tag
  • Образы Docker для изолированного тестирования и изолированных от облака кластеров
  • Многофункциональная панель администратора для настройки, метрик и мониторинга
  • Аутентификация и авторизация

Каков состав его проектной структуры?

Адрес GitHub: https://github.com/apache/rocketmq

Его основной модуль:

  • Rocketmq-broker: Получайте сообщения от производителей и сохраняйте их (позвонив в RocketMQ-Store), потребители получают сообщения отсюда.
  • RocketMQ-клиент: Предоставляет клиентский API для отправки и получения сообщений.
  • Rocketmq-namesrv: NameServer, как и Zookeeper, здесь сохраняет TopicName сообщения, метаинформацию очереди и другие среды выполнения.
  • RocketMQ-common: некоторые общие классы, методы, структуры данных и т.д.
  • RocketMQ-Remoting: клиент/сервер на основе Netty4 + сериализация fastjson + собственный бинарный протокол.
  • rockemq-store: хранилище сообщений, индексов и т. д.
  • Rocketmq-filtersrv: сервер фильтрации сообщений, следует отметить, что для достижения такого рода фильтрации вам необходимо загрузить код в MQ! (В целом, мы используем тег достаточно для удовлетворения большинства потребностей в фильтрации, если более гибкая и сложная фильтрация потребностей, вы можете рассмотреть компонент filterrv).
  • RocketMQ-Tools: инструменты командной строки.

Его архитектурная композиция или понять, почему он такой быстрый? так сильна? такой умный?

В основном он состоит из четырех основных компонентов:NameServer,Broker,Producerа такжеConsumerЧетыре части.

Tip:Мы видим, чтоRocketMQчто-либокластерразвернутый, это онвысокая пропускная способность,Высокая доступностьОдна из причин заключается в том, что режим кластера также очень причудлив, который может поддерживать режим с несколькими ведущими, режим асинхронной репликации с несколькими ведущими и несколькими подчиненными, режим синхронной двойной записи с несколькими ведущими и несколькими подчиненными.

И этот режим подобен Кафке! (Я несу здесь ерунду, она была разработана Alibaba на основе многих особенностей Кафки).

Давайте представим компоненты каждого кластера отдельно.

Сервер имен:

В основном отвечает за управление исходными данными, в том числеTopicи управление маршрутной информацией.

NameServerЭто полнофункциональный сервер, и его роль аналогична Zookeeper в Dubbo, но NameServer легче, чем Zookeeper. Главным образом потому, что каждый узел NameServer независим друг от друга без какого-либо обмена информацией.

NameServerДавление не слишком велико, и основные накладные расходы связаны с поддержанием пульса и предоставлением реляционных данных Topic-Broker.

Но следует отметить, что когда брокер отправляет пульс на сервер имен, он передает всеTopicинформация, еслиTopicСлишком большое количество (десятки тысяч) приведет к тактовому импульсу, данные темы будут состоять только из десятков M, при плохом состоянии сети произойдет сбой передачи по сети и тактовый импульс, из-за чего сервер имен ошибочно получит тактовый сигнал брокера. отказ.

NameServerОн спроектирован таким образом, чтобы практически не сохранять состояние и масштабироваться горизонтально, без связи между узлами и путем развертывания нескольких компьютеров, чтобы пометить себя как псевдокластер.

Каждый Брокер зарегистрируется на Сервере имен при его запуске, и Производитель отправит сообщение в соответствии с темой.NameServerПосле получения информации о маршрутизации Брокера Потребитель также будет регулярно получать информацию о маршрутизации Темы.

Таким образом, с функциональной точки зрения NameServer должен быть похож на ZooKeeper.Говорят, что ранняя версия RocketMQ использовала ZooKeeper, который позже был заменен на NameServer, реализованный сам по себе.

Давайте взглянемDubboДействительно ли роль регистрационного центра одинакова?Между учителями и учениками действительно много общего:

Producer

Производитель сообщений отвечает за генерацию сообщений.Как правило, бизнес-система отвечает за генерацию сообщений.

  • ProducerРаспределенное развертывание пользователями, сообщения распространяютсяProducerотправлено через несколько режимов балансировки нагрузкиBrokerКластер, отправка с низкой задержкой, поддержка быстрого отказа.

  • RocketMQПредоставляет три способа отправки сообщений: синхронный, асинхронный и односторонний.

  • Отправить синхронно: Синхронная отправка означает, что после того, как отправитель сообщения отправит данные, он отправит следующий пакет данных после получения ответа от получателя. Обычно используется для важных уведомлений, таких как электронные письма с важными уведомлениями и маркетинговые текстовые сообщения.

  • Асинхронная отправка: асинхронная отправка означает, что после того, как отправитель отправит данные, он не ждет, пока получатель отправит ответ, а затем отправляет следующий пакет данных. Обычно используется в бизнес-сценариях, где связь может занять много времени и является конфиденциальной. на время отклика, например уведомление после загрузки видео пользователем. Запустите службу транскодирования.

  • односторонняя отправка: односторонняя отправка означает, что он отвечает только за отправку сообщений, не дожидаясь ответа от сервера, и функция обратного вызова не запускается.Это подходит для некоторых сценариев, которые занимают очень короткое время, но не требуют высокой надежности, таких как журнал коллекция.

Broker

Роль ретранслятора сообщений, ответственная засохранить сообщение, чтобы переслать сообщение.

  • BrokerЭто сервер, который предоставляет определенные услуги.Один узел Broker поддерживает длительное соединение и пульсацию со всеми узлами NameServer и периодически отправляетTopicИнформация регистрируется на NameServer, между прочим, базовая связь и соединениеРеализация на основе Nettyиз.
  • BrokerОтвечает за хранение сообщений, поддерживает облегченные очереди с темами в виде широты, одна машина может поддерживать десятки тысяч очередей и поддерживать модель push-pull сообщений.
  • На официальном сайте есть данные, свидетельствующие о том, что:Возможность накопления сотен миллионов сообщений, а также можетСтрого гарантируем порядок сообщений.

Consumer

Потребитель сообщений отвечает за потребление сообщений.Как правило, фоновая система отвечает за асинхронное потребление.

  • ConsumerОн также развертывается пользователями, поддерживает режимы потребления PUSH и PULL, поддерживаетПотребление кластераитрансляция сообщение,поставкаМеханизм подписки на сообщения в реальном времени.

  • Pull: Извлечение Потребители активно извлекают информацию с сервера сообщений. Пока сообщения извлекаются пакетами, пользовательское приложение запускает процесс потребления, поэтому извлечение называется активным потреблением.

  • Push: Push Consumer инкапсулирует извлечение сообщений, ход потребления и другие внутренние работы по обслуживанию и оставляет интерфейс обратного вызова выполненным, когда сообщение поступает в пользовательское приложение для реализации. Поэтому Push называется типом пассивного потребления, но с точки зрения реализации он все равно извлекает сообщения с сервера сообщений.В отличие от Pull, Push должен сначала зарегистрировать прослушиватель потребления и начинать потреблять сообщения только тогда, когда прослушиватель срабатывает.

модель предметной области сообщений

Message

Message(сообщение) – это информация, которая должна быть передана.

Сообщение должно иметь тему (Topic), а тему можно рассматривать как адрес, на который должно быть отправлено ваше письмо.

Сообщение также может иметь необязательную пару «тег» и «ключ-значение», которую можно использовать для установки бизнес-ключа и поиска этого сообщения в брокере для поиска проблем во время разработки.

Topic

Topic(Тема) можно рассматривать как класс спецификации сообщения, который является типом сообщения первого уровня. Например, систему электронной коммерции можно разделить на: новости транзакций, новости логистики и т. д. Сообщение должно иметь Тему.

TopicОтношения между производителями и потребителями очень свободны.Тема может иметь 0, 1 или несколько производителей, отправляющих сообщения в нее, и производитель также может отправлять сообщения в разные темы одновременно.

Тема также может быть подписана 0, 1 или несколькими потребителями.

Tag

Tag(теги) можно рассматривать как подтемы, которые являются типом сообщений второго уровня, используемым для предоставления пользователям дополнительной гибкости. Используя теги, сообщения с разными целями одного и того же бизнес-модуля могут использовать одну и ту же тему, но разныеTagидентифицировать. Например, сообщения о транзакциях можно разделить на: сообщения о создании транзакций, сообщения о завершении транзакций и т. д. Сообщение может не иметьTag.

Теги помогают поддерживать чистоту и согласованность кода, а также могут предоставлятьRocketMQПредоставляемая система запросов помогает.

Group

Группировка, группа может подписаться на несколько тем.

Делится на ProducerGroup и ConsumerGroup, которые представляют определенный тип производителей и потребителей.В общем случае, одна и та же служба может использоваться как группа, и одна и та же группа обычно отправляет и потребляет одни и те же сообщения.

Queue

существуетKafkaЭто называется разделом, и каждая очередь упорядочена внутри.RocketMQЕсть два типа очередей: чтение и запись. Вообще говоря, количество очередей чтения и записи одинаковое, если они несовместимы, возникнет много проблем.

Message Queue

Message Queue(очередь сообщений), тема делится на одну или несколько подтем, очередь сообщений.

В теме можно установить несколько очередей сообщений. При отправке сообщения выполняется тема сообщения. RocketMQ будет опрашивать все очереди в теме для отправки сообщения.

Физическая единица управления сообщением. В теме может быть несколько очередей.Введение очередей позволяет распределять и группировать хранение сообщений, а также имеет возможность горизонтального масштабирования.

Offset

существуетRocketMQВсе очереди сообщений являются постоянными структурами данных с бесконечной длиной.Так называемая бесконечная длина означает, что каждая единица хранения в очереди имеет фиксированную длину, а доступ к единице хранения осуществляется с помощью смещения.Смещение представляет собой длинный тип Java, 64 бита, теоретически не переполнится через 100 лет, поэтому он считается бесконечным по длине.

Очередь сообщений также можно рассматривать как массив бесконечной длины,Offsetявляется индексом.

шаблон потребления сообщений

Существует два режима потребления сообщений:Clustering(потребление кластера) иBroadcasting(широковещательное потребление).

По умолчанию это потребление кластера. В этом режиме кластер потребителей потребляет несколько очередей темы вместе, и очередь может использоваться только одним потребителем. млн. потребителей продолжают тратить.

Широковещательное сообщение о потреблении будет отправлено каждому потребителю в группе потребителей для потребления.

Message Order

Message Order(порядок сообщения) Существует два вида:Orderly(последовательное потребление) иConcurrently(потребляются параллельно).

Последовательное потребление означает, что порядок потребления сообщений такой же, как порядок, который производитель отправляет для каждой очереди сообщений, поэтому, если вы имеете дело со сценарием, в котором глобальный порядок является обязательным, вам необходимо убедиться, что в используемой теме есть только одно сообщение. очередь.

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

На что похож полный процесс общения?

Производитель устанавливает длительное соединение с одним из узлов (выбранным случайным образом) в кластере NameServer и периодически получает его от NameServer.TopicИнформация о маршрутизации и предоставление услуги TopicBroker Masterустановить длительное соединение иBrokerОтправить сердцебиение.

Producerможет отправлять сообщения только главному брокеру, ноConsumerОн отличается тем, что устанавливает длительное соединение с Мастером и Слейвом, которые одновременно предоставляют услуги Топика, может подписываться на сообщения от Мастера Брокера и от Слейва Брокера.

Подробности следующие:

Я выше сказал, что онDubboВроде не чушь несу, даже процесс регистрации у него очень похожDubboпроцесс раскрытия услуги.

Вы думаете, что это очень просто, но вам также интересно, как инициализируется и запускается каждый шаг?

Красавчик, ты знаешь, все такиеТаланты с сильной тягой к знаниям, я не готов, давайте разберем пошагово.

В основном молодые люди из группы талантов просили меня написать это. . . (Способ вступить в группу есть в конце статьи)

Процесс запуска NameService

в каталоге org.apache.rocketmq.namesrvNamesrvStartupЭтот класс запуска в основном описывает его процесс запуска.Мы можем взглянуть на код:

  • Первым шагом является инициализация конфигурации

  • СоздайтеNamesrvControllerinstance и запустите две временные задачи:

  • Сканировать каждые 10 секундBroker, удалить неактивныйBroker;

  • Печатайте конфигурацию KV каждые 10 секунд.

  • Третий шаг — зарегистрировать функцию ловушки, запустить сервер и слушать Брокера.

NameServiceТам еще много чего,я представлю тут его процесс запуска.Также можно посмотреть код.Все равно очень интересно.Например регистрация роутинга будет посылать пакеты heartbeat,аПоток обработки пакетов Heartbeat,удаление маршрута,открытие маршрутаи Т. Д.

Tip: Изначально я хотел опубликовать много исходного кода, а затемКриво (Java3y)После долгого обсуждения принял решение не выкладывать, процесс всем понятен! Я в основном занимаюсь грамотностью и некоторым разбором болевых точек.Все равно у всех уходит время на то, чтобы вникнуть.Мне недостаточно все представить.

Producer

Ссылка очень длинная и включает в себя много деталей, поэтому я опубликую схему связи.

ProducerЭто отправитель сообщения, так как же он его отправил?

Благодаря вращению,Producerтренировать определенныйTopicВсе очереди ниже реализуют балансировку нагрузки на стороне отправителя.

Broker

BrokerВ RocketMQ он обрабатывает запрос производителя на отправку сообщения, запрос потребителя на потребление сообщения и сохраняемость сообщения, а также политику высокой доступности и фильтрацию на стороне сервера, то есть тяжелую работу. в кластере передаетсяBrokerдля обработки.

BrokerМодуль запускается через BrokerStartup, создается экземпляр BrokerController и вызывается метод его инициализации.

всеBrokerисходный код, вы обнаружите, что егоПроцесс инициализации утомительный, многие пулы потоков будут созданы в соответствии с конфигурацией, которая в основном используется дляОтправить сообщение,вытащить сообщение,сообщение запроса,Управление клиентамииуправление потребителями, там тоже многозадача на время, а также зарегистрировал множествообработчик запросов, который используется для отправки сообщений запроса запроса.

Consumer

Не будем об этом, давайте сразу к картинке! Я умру, в следующий раз займусь грамотой, напишу классные сочинения 555

ConsumerЭто прием сообщения, так как же он получает сообщение?

Потребитель пройдет.RebalanceServiceТема, делайте это каждые 10 секунд на основеTopicВся очередь загружается под.

Часто задаваемые вопросы об интервью

Каковы его сильные и слабые стороны

Преимущества RocketMQ:

  • Производительность одной машины: класс 100 000

  • Доступность: очень высокая, распределенная архитектура

  • Надежность сообщений: после оптимизации параметров и настройки сообщения могут быть потеряны до нуля.

  • Поддержка функций: функция MQ относительно завершена, она все еще распределена и обладает хорошей масштабируемостью.

  • Поддерживает стекирование сообщений на уровне 1 миллиарда и не вызывает снижения производительности из-за стекирования.

  • Исходный код - java, мы можем сами прочитать исходный код, настроить MQ нашей компании и контролировать его.

  • Рожденный для финансовой сферы Интернета, для сценариев с высокими требованиями к надежности, особенно для вычетов заказов в электронной коммерции и сглаживания бизнес-пиков, когда приток большого количества транзакций, серверная часть может быть не в состоянии вовремя справиться с ситуацией.

  • RoketMQЭто может быть более надежным с точки зрения стабильности.Эти бизнес-сценарии прошли множество тестов на Alibaba Double 11. Если в вашем бизнесе есть вышеуказанные параллельные сценарии, рекомендуется выбратьRocketMQ

Недостатки RocketMQ:

  • Существует не так много поддерживаемых клиентских языков, в настоящее время java и c++, из которых c++ является незрелым.

  • Общественная деятельность не особенно активна

  • Не реализовано в ядре mqJMSи другие интерфейсы, некоторым системам необходимо изменить много кода для миграции.

дедупликация сообщений

Принцип дедупликации: используйте бизнес-логику для поддержания идемпотентности.

идемпотентность: То есть результаты одного запроса или нескольких запросов, инициированных пользователем для одной и той же операции, согласованы, и не будет побочных эффектов из-за нескольких кликов.Результаты базы данных уникальны и неизменны.

Пока сохраняется идемпотентность, сколько бы ни приходило повторных сообщений, конечный результат будет один и тот же, что необходимо реализовать бизнес-стороне.

стратегия дедупликации: гарантирует, что каждое сообщение имеет уникальный номер (например уникальный серийный номер), и убедитесь, что обработка сообщения прошла успешно и в то же время появился журнал таблицы дедупликации.

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

повтор сообщения

Поле сообщения имеет определение QoS для доставки сообщения, которое делится на:

  • Не более одного раза
  • Хотя бы один раз
  • Ровно раз

QoS: качество обслуживания, качество обслуживания

Почти все продукты MQ утверждают, что делают это.At least once.

Поскольку это хотя бы один раз, дублирования сообщений не избежать, особенно в распределенной сетевой среде.

Например, мигает сетевая причина, не удается вернуть ACK и т. д., информация о подтверждении не передается в очередь сообщений, поэтому очередь сообщений не знает, что она израсходовала сообщение, и снова распределяет сообщение среди других потребителей. .

Различные очереди сообщений отправляют подтверждающую информацию в разных формах, напримерRabbitMQотправить подтверждающее сообщение ACK,RocketMQдолжен вернуть флаг успеха CONSUME_SUCCESS,KafkaНа самом деле существует понятие смещения.

RocketMQВстроенного решения для дедупликации сообщений нет, и необходимо подтвердить, поддерживает ли его последняя версия.

доступность сообщений

Когда мы выбираем режим кластера, нам нужно позаботиться о том, как хранить и реплицировать эти данные,RocketMQМы предоставляем синхронную и асинхронную стратегии для сброса сообщений. При выборе синхронного сброса, если время сброса истекло, будет возвращено значение FLUSH_DISK_TIMEOUT. Если это асинхронный сброс, информация, связанная со сбросом, не будет возвращена. Выберите синхронный сброс. Диск может сделать все возможное чтобы удовлетворить наше сообщение, не теряя его.

В дополнение к выбору хранилища, наша синхронизация master-slave предоставляет два режима синхронизации и асинхронный для репликации.Конечно, выбор синхронизации может улучшить доступность, но время RT для отправки сообщений снизится примерно на 10%.

RocketMQИспользуется гибридная структура хранения, т.BrokerВсе очереди в одном экземпляре совместно используют файл данных журнала (например, CommitLog) для хранения.

иKafkaИспользуется независимая структура хранения с одним файлом на очередь.

Здесь Шуай Бин считает, чтоRocketMQНедостатком использования гибридной структуры хранения является то, что будет много случайных операций чтения, поэтому эффективность чтения будет низкой. Одновременное потребление сообщений требует зависимостейConsumeQueue, построение логической очереди потребления требует определенных накладных расходов.

Реализация щеточного диска RocketMQ

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

Окончательная реализация кисти заключается в использованииNIOMappedByteBuffer.force() в карте записывает данные в сопоставленной области на диск.Если он синхронно очищает диск, вBrokerнаписать сообщениеCommitLogПосле сопоставления области он ожидает завершения записи.

С точки зрения асинхронности он только пробуждает соответствующий поток и не гарантирует время выполнения Процесс показан на рисунке.

Последовательные сообщения:

Кратко скажу, что мы используемRocketMQПростая реализация в нем.

Tip: зачем использоватьRocketMQНапример, эта штука в открытом доступе у Alibaba.Я спрашивал своих друзей, что многие компании используют ее, поэтому, если у читателя есть большая вероятность этого, я буду использовать этот пример.Конкретные подробности я опубликую позже.RocketMQиKafkaсоответствующие главы.

Если производителям и потребителям обычно необходимо обеспечить последовательные сообщения, это может быть в бизнес-сценарии, таком как создание заказа, оплата, доставка и получение.

Это номер заказа? Заказ должен быть номером заказа, это просто.

Под темой несколько очередей, чтобы обеспечить упорядоченную доставку,RocketMQпри условииMessageQueueSelectorМеханизм выбора очереди, у него есть три реализации:

мы можем использоватьМетод хеширования по модулю, пусть тот же заказ будет отправлен в ту же очередь, а затем использовать синхронную отправку, успешно отправляется только сообщение о создании того же заказа, а затем отправляется сообщение об оплате. Таким образом, мы гарантируем упорядоченную доставку.

RocketMQМеханизм очереди в теме может гарантировать, что хранилище соответствуетFIFO(First Input First Output просто относится к принципу «первым поступил — первым вышел»), а остальным нужно, чтобы потребители потребляли только последовательно.

RocketMQГарантируется только заказная доставка, а заказное потребление гарантируется потребительским бизнесом!!!

Здесь легко понять.Когда вы отправляете заказ и ставите его в очередь, если вы хэшируете его с тем же номером заказа, результат все равно тот же?Он должен потребляться потребителем.Гарантирован ли заказ?

Реальное последовательное потребление разного мидлвара имеет свою различную реализацию, я приведу здесь пример, и все его поймут.

Распределенные транзакции:

Половина сообщения

Относится к сообщениям, которые Потребитель не может использовать в данный момент.. Производитель успешно отправил сообщение Брокеру, но сообщение помечено как暂不能投递Сообщение в этом состоянии называется полусообщением. Требуется производитель

к новостям二次确认После этого Потребитель может его потреблять.

проверка сообщения

Из-за сетевого флэш-сегмента, перезапуска приложения производителя и т. д. Привести кProducerКонец никогда не был правильнымПоловина сообщенияпровестиВторое подтверждение. ЭтоBrockСервер будет регулярно сканировать长期处于半消息的消息,встреча

взять на себя инициативу спроситьProducerконечное состояние сообщения (Подтвердить или откатить), сообщениепроверка сообщения.

  1. Служба А сначала отправляет половинное сообщение стороне Брока, и в сообщении содержится информация о том, что служба Б вот-вот наберет +100 юаней.
  2. Когда служба A узнает, что половинное сообщение отправлено успешно, начните шаг 3, чтобы выполнить локальную транзакцию.
  3. Выполнить локальную транзакцию (возможны три случая: 1. Выполнение прошло успешно. 2. Выполнение завершилось неудачно. 3. Нет ответа из-за сетевых и других причин)
  4. Если локальная транзакция прошла успешно, Продукт отправляет фиксацию на сервер Brock, чтобы служба B могла использовать сообщение.
  5. Если локальная транзакция не удалась, то Продукт отправляет Откат, как и сервер Брока, и указанное выше полусообщение будет удалено напрямую.
  6. Если ошибка или успех не возвращаются из-за сети или других причин, интерфейс обратного вызова RocketMQ будет выполнен для проверки транзакции.

фильтрация сообщений

  • BrokerФильтрация сообщений терминала  
    существуетBroker, в соответствии сConsumerТребование выполнять фильтрацию, преимущество заключается в уменьшенииConsumerСетевая передача бесполезных сообщений. Недостатком является то, что это увеличивает нагрузку на брокера, а реализация относительно сложна.
  • ConsumerФильтрация сообщений терминала
    Этот метод фильтрации может быть полностью настроен приложением, но недостатком является то, что многие бесполезные сообщения должны быть переданы вConsumerконец.

Проблема с буфером брокера

БрокерскийBufferОбычно относится к размеру буфера памяти очереди в Брокере.BufferОбычно ограничены по размеру.

Кроме того, RocketMQ не имеет памяти.BufferКонцепция: очереди RocketMQ — это постоянные диски, и данные периодически очищаются.

RocketMQ сильно отличается от других MQ.BufferАбстрагируясь в очередь бесконечной длины, независимо от того, сколько данных поступает, они могут быть загружены.Эта бесконечность является предпосылкой, и Брокер будет регулярно удалять данные с истекшим сроком действия.

Например, Брокер сохраняет сообщения только 3 дня, тогда этотBufferХотя длина не ограничена, данные старше 3 дней будут удалены из конца очереди.

ретроспективное потребление

Ретроспективное потребление относится к сообщению, которое Потребитель успешно использовал. Из-за бизнес-требований его необходимо повторно использовать. Для поддержки этой функции Брокер по-прежнему должен сохранять сообщение после успешной доставки сообщения Потребителю. И повторное потребление, как правило, в соответствии с измерением времени.

Например, из-за сбоя системы потребителя данные, полученные 1 час назад, необходимо повторно использовать после восстановления, поэтому брокеру необходимо предоставить механизм для отката хода потребления в соответствии с измерением времени.

RocketMQПоддерживает ретроспективное потребление по времени, измерение времени с точностью до миллисекунд и может иметь обратную силу в прямом или обратном направлении.

сообщения накапливаются

Основная функция промежуточного программного обеспечения сообщений — асинхронная развязка, а другой важной функцией является блокирование потока данных внешнего интерфейса и обеспечение стабильности серверной системы.Для этого требуется, чтобы промежуточное программное обеспечение сообщений имело определенные возможности накопления сообщений. делится на следующие два типа состояния:

  • сообщения накапливаются в памятиBuffer, как только память будет превышенаBuffer, сообщения могут быть отброшены в соответствии с определенной политикой удаления, как описано в спецификации уведомлений CORBA. Это подходит для предприятий, которые могут терпеть отброшенные сообщения, В этом случае способность накопления сообщений в основном заключается в памяти.Bufferразмер, и после того, как сообщения будут нагромождены, падение производительности будет не слишком большим, потому что объем данных в памяти имеет ограниченное влияние на доступ, предоставляемый внешнему миру.
  • Сообщения накапливаются в постоянных системах хранения, таких как БД, хранилище KV, форма записи файла. Когда сообщение не может попасть в кеш памяти, доступ к диску неизбежен, что приведет к большому количеству операций ввода-вывода чтения.Пропускная способность операций ввода-вывода чтения напрямую определяет возможность доступа после накопления сообщения.
  • Есть четыре основных момента для оценки способности накопления сообщений:
  • Сколько сообщений может быть сложено, сколько байтов? То есть емкость стекирования сообщений.
  • После того, как сообщения будут объединены в стек, повлияет ли стек на пропускную способность отправки сообщений?
  • После того, как сообщения будут накапливаться, пострадают ли обычные потребители?
  • После того, как сообщения собраны в кучу, какова пропускная способность при доступе к сообщениям, накопленным на диске?

сообщение по времени

Временные сообщения относятся к сообщениям, отправленнымBroker, нельзя сразуConsumerПотребление может быть потреблено только после определенного момента времени или после ожидания в течение определенного времени.

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

RocketMQПоддерживаются синхронизированные сообщения, но произвольная точность времени не поддерживается, а также поддерживаются определенные уровни, такие как время 5 с, 10 с, 1 мин и т. д.

Суммировать

Писать такое простое введение в промежуточное программное обеспечение утомительно и скучно, и все, кажется, устали. На данный момент он сломал 10 000 слов. В будущем я буду писать меньше этого типа. Все всегда просят меня писать подробно. Я Я выложил исходный код многих вещей, но его никто не читал.

KafkaЯ не буду вести блог, вы можете идтиGItHubПрочтите это в первый раз. Позже будет учебник о том, как создать проект на сервере, а также личный опыт Даниэля и список личных книг. Я должен написать это первым в этом году, в основном потому, что я очень занят , надеюсь понял.

болтовня

Я не буду вдаваться в подробности, все равно, это большой удар в Интернете.На самом деле это просто обещание, и он не может сказать, почему он мне не отвечает.

То, о чем он говорит, это многопоточная ситуация в следующем сценарии, то есть, первый поток не закончился, а сейчас идет второй, и считается, что он не был обработан, так почему бы и нет. продолжать добавлять оба?

Номер заказа + бизнес-сценарий, сформировать уникальный первичный ключ, вы сможете успешно вставить только первый в базу данных, а о последующих ошибках будет сообщено, и будет сообщено об ошибке нарушения уникального первичного ключа.

Есть также люди, которые удивляются, почему они не судят напрямую, а просто ждут, когда он сообщит об ошибке при вставке, и просто выбрасывают продолжение?

ты должен знатьЕсть много видов ошибока откуда вы знаете, что не по вине базы зависает? Или какое-то другое исключение времени выполнения?

Но вы можете сделать это, если вы можете сгенерировать конкретное исключение, в любом случае, мы должныУменьшить количество ошибок в базе данных, если параллелизм большой, например, система, за которую я сейчас отвечаю, составляет 10 Вт + QPS, тогда журнал будет полон сумасшедших тревог. (То есть в обычных обстоятельствах мы часто вызываем полицию)

Есть много способов решить проблему, вы можете распылить меня, четко объяснить проблему и четко объяснить свои причины.

Многие из вас просто в одностороннем порядке поглощают знания, а вы еще хотите меня вот так критиковать, и вы меня спрашиваете, почему я сегодня не выложил статью, я вам должен? Я хожу на работу в будние дни, и я хожу на работу по субботам и воскресеньям, у меня ограниченное время, брат.

У каждого свое дело, а написание статей отнимает много времени и мозгов.Ошибки неизбежны, и я надеюсь на понимание.

Обратите внимание, не потеряйтесь

Хорошо всем, вышеизложенное является полным содержанием этой статьи. Люди, которые могут видеть это здесь, всеталант.

Каждую неделю я буду обновлять несколько статей, связанных с интервью и общими технологическими стеками ведущих интернет-компаний, большое спасиботалантМы можем видеть здесь, если эта статья хорошо написана, я думаю, что «Ао Бин» ячто-тоеслиПожалуйста, лайкните 👍 Пожалуйста, следите за ❤️ поделитесь пожалуйста 👥Это правда для меняочень полезно! ! !

Проституция нехороша, творить нелегко,Ваша поддержка и признание — самая большая мотивация для моего творчества, увидимся в следующей статье!

Ао Бин | Текст [Оригинал]

Если в этом блоге есть какие-либо ошибки, пожалуйста, критикуйте и советуйте, это очень ценится!


Статья постоянно обновляется каждую неделю, вы можете искать в WeChat "Третий принц Ао Бин"Читать и запрашивать обновления в первый раз (на одну-две статьи раньше, чем в блоге), эту статьюGitHub github.com/JavaFamilyОн был включен, есть карта разума точек интервью заводов первого уровня, а также я организовал много своих документов. Добро пожаловать в Звезду и совершенствуйтесь. Каждый может обратиться в тестовый центр для ознакомления. Надеюсь мы можем иметь что-то вместе.