инструкция
Опубликовано в пятницу:Rocketmq4.3 поддерживает транзакции! ! !, я воспользовался выходными, чтобы прочитать соответствующий контент.Основной контент ниже представляет собой введение контента, связанного с транзакциями RocketMQ.
инструкция:Сегодняшняя статья является лишь введением и не включает много деталей.Сначала будет объяснен общий процесс, а затем будут объяснены конкретные детали.
тема
- Представьте контент, связанный с распределенными транзакциями.
- Сообщения о транзакциях RocketMQ.
- Как используются сообщения транзакций RocketMQ.
- Как реализованы сообщения транзакций RocketMQ.
- Зачем нужен механизм проверки сообщений о транзакциях.
- Как RocketMQ проверяет сообщения о транзакциях.
- Какие ограничения есть у RocketMQ для решений с распределенными транзакциями? и описание.
Внедрение контента, связанного с распределенными транзакциями
Основная цель здесь состоит в том, чтобы объяснить, что лежит в основе таких проблем.
Сначала скажемдела, Говоря о делах, первое, что мне напоминает, это то, что когда я учился в колледже, преподаватель часто приводил пример перевода денег.Пример такой:
Банковский перевод! Чжан Сан переводит 100 юаней на счет Ли Си, что на самом деле требует двух операторов SQL:
- Вычтите 100 юаней со счета Чжан Саня.
- Добавьте 100 юаней на счет Ли Си
Если программа прерывается после успешного выполнения первого оператора SQL и до выполнения второго оператора SQL (возможно, было выброшено исключение или какая-то другая причина), то на счет Ли Си не добавляются 100 юаней, а Чжан Сан вычитает 100 юаней. юань. Это точно невозможно!
Вы, наверное, уже знаете, что такое транзакция! Несколько операций в транзакции, либо полный успех, либо полный провал! Не может быть полууспеха! То есть, если списание 100 юаней со счета Чжан Саня прошло успешно, то операция добавления 100 юаней к счету Ли Си также должна быть успешной; в противном случае операция списания 100 юаней со счета Чжан Саня и добавления 100 юаней на счет Ли Си также должен быть успешным.Юань-это провал!
Если в одном сервисе мы используем Spring, мы используем аннотацию для решения этой проблемы (@Транзакционная аннотацияВот и все, в принципе делать нечего. )
По мере того, как услуги различных компаний становятся все более и более сложными, а объем данных увеличивается, компании постепенно внедряют такие технологии, как микросервисы и подтаблицы подбаз данных.Эти технологии действительно очень полезны, но они вызывают проблемы при решении транзакций. .
Подчеркните: распределенные транзакции, мы обычно подчеркиваем возможную согласованность, а не сильную согласованность! ! !
В основном делятся на 3 категории:
- На основе одной JVM база данных делится на таблицы (по нескольким базам данных).
- На основе нескольких JVM службы разделены (не между базами данных).
- На основе нескольких JVM служба разделена, а база данных разделена на базы данных и таблицы.
Именно для решения вышеперечисленных трех типов задач и внедряются технологии, связанные с распределенными транзакциями.
Существует много решений для распределенных транзакций, и сообщение о транзакции RocketMQ, которое необходимо упомянуть ниже в этой статье, является лишь одним из решений.
Сообщение о транзакции RocketMQ
Здесь в основном ссылаются на содержимое официальной документации RocketMQ, справочный адрес:
http://rocketmq.apache.org/rocketmq/the-design-of-transactional-message/
Half(Prepare) Message
Относится к сообщению, которое не может быть доставлено временно. Отправитель успешно отправил сообщение на сервер MQ, но сервер не получил второго подтверждения сообщения от производителя. В это время сообщение помечается как «временно недоставленное». ". , сообщение в этом состоянии является полусообщением.
проверка сообщения
Вторичное подтверждение сообщения о транзакции теряется из-за сбоя в сети, перезапуска приложения-поставщика и т. д. Когда сервер MQ обнаруживает, что сообщение долгое время было «полусообщением» при сканировании, ему необходимо активно запрашивать производитель сообщения для статуса сообщения.Конечное состояние (фиксация или откат), процесс - проверка сообщения.
Выполнить блок-схему
- Отправитель отправляет сообщение на сервер MQ.
- После того, как сервер MQ успешно сохраняет сообщение, он подтверждает отправителю ACK, что сообщение было успешно отправлено, и в настоящее время сообщение является полусообщением.
- Отправитель начинает выполнять локальную логику транзакции.
- Отправитель отправляет вторичное подтверждение (фиксация или откат) на сервер MQ в соответствии с результатом выполнения локальной транзакции.Когда сервер MQ получает статус фиксации, он помечает полусообщение как доставленное, и подписчик в конечном итоге получает сообщение сообщение; сервер MQ получает сообщение Rollback Состояние удаляет половинное сообщение, и подписчик не примет сообщение.
- В особом случае отключения сети или перезапуска приложения вторичное подтверждение, отправленное на шаге 4 выше, в конце концов не достигает сервера MQ, и сервер MQ инициирует проверку сообщения для сообщения через фиксированное время.
- После того, как отправитель получит ответное сообщение, ему необходимо проверить окончательный результат выполнения локальной транзакции соответствующего сообщения.
- Отправитель снова отправляет вторичное подтверждение в соответствии с окончательным состоянием локальной транзакции, полученным в результате проверки, и сервер MQ продолжает работать с половинным сообщением в соответствии с шагом 4.
Отправка сообщения о транзакции соответствует шагам 1, 2, 3 и 4, а проверка сообщения о транзакции соответствует шагам 5, 6 и 7.
Как используются сообщения транзакций RocketMQ
1. Внедрить RocketMQ-клиент
Пока нет, она будет доступна через несколько дней, или вы можете скачать исходный код и запаковать его в свой личный склад.Это то же самое.После введения 4.2.0, вы можете просто заменить его на 4.3.0 .
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.3.0</version>
</dependency>
2. Напишите продюсеру
В основном обратитесь к примеру в RocketMQ4.3.0, адрес:
https://github.com/apache/rocketmq/tree/release-4.3.0/example/src/main/java/org/apache/rocketmq/example/transaction
Примечание:и нормальная отправка сообщенийDefaultMQProducerотличается, вотTransactionMQProducer.
ключевой момент:Реализуйте интерфейс TransactionListener самостоятельно и реализуйтеметод executeLocalTransaction(Выполнение локальных транзакций обычно является операцией контента, связанного с БД) иметод checkLocalTransaction(Он используется для предоставления брокеру возможности проверки сообщений о локальных транзакциях, а результаты выполнения локальных транзакций могут быть сохранены в Redis или БД для подготовки данных к собранию).
Давайте рассмотрим пример вычитания 100 юаней со счета Чжан Саня и добавления 100 юаней к счету Ли Си. В настоящее время то, что мы отправляем, эквивалентно выполнениюОперация вычитания 100 юаней со счета Чжан Саня, и операция БД прошла успешно, следующая операция по добавлению 100 юаней на счет Ли Си., на этот раз эквивалентно определению темы только что отправленного сообщения о транзакции, потребитель ничем не отличается от нашего обычного потребителя.
Мышление: что, если наша потребительская сторона потерпит неудачу в это время? (Этот вопрос будет обсуждаться позже. Существует два типа сбоев потребления. Первый — это время ожидания. Мы можем попробовать еще раз. Второй — сбой обработки? Что мне делать?)
Как реализованы сообщения транзакций RocketMQ
Первое впечатление очень похоже на подход с синхронизированным сообщением, но он сложнее, чем синхронизированное сообщение. Содержание синхронизированного сообщения:RocketMQ (9): отправка сообщения (продолжение)упоминается в нем.
Природа:Сообщение о времени Сначала измените тему сообщения о времени на SCHEDULE_TOPIC_XXXX, а затем серию обработки..., наше сообщение о транзакции такое же, сначала отправьте егоHalf(Prepare) MessageКогда сообщение отправлено, содержимое темы также продолжает изменяться (RMQ_SYS_TRANS_HALF_TOPIC), все потребители невидимы (если отправляете, используйте настоящую тему, если нужно откатиться, просто удалите временный контент темы.)
Half(Prepare) MessageИзмените точку останова темы следующим образом:
Эта статья является лишь вводным введением, а конкретные детали будут проанализированы в последующих главах.
считать:Если в транзакцию поместить отправку обычных сообщений и локальную логику выполнения, то при успешном выполнении транзакции отправляется обычное сообщение, а при неудаче вроде можно откатиться, так что какие плюсы или Преимущества такого рода сообщений о транзакциях? ? ? Подумай об этом.
Зачем нужен механизм проверки сообщений о транзакциях?
На самом деле это содержаниеСообщение о транзакции RocketMQВо введении также поясняется, что вторичное подтверждение сообщения о транзакции теряется из-за прерывания сети, перезапуска приложения-поставщика и т. д. Когда сервер MQ обнаруживает, что сообщение долгое время было «полусообщением» при сканировании, он должен активно сообщать о сообщении.Производитель запрашивает окончательный статус (фиксация или откат) сообщения, и этот процесс является проверкой сообщения. Итак, как именно RocketMQ это делает? Он будет представлен в ближайшее время.
Как RocketMQ проверяет сообщения о транзакциях?
каждые 60 сHalf(Prepare) MessageТема темыRMQ_SYS_TRANS_HALF_TOPICсообщение для проверки.
брокер позвонитРеализуйте интерфейс TransactionListener самостоятельнометод checkLocalTransaction.
Примечание:То есть в RocketMQ этот механизм уже реализован.Сегодняшняя статья носит лишь ознакомительный характер и не включает в себя многих деталей.Сначала будет объяснен общий процесс, а потом будут объяснены конкретные детали.
Какие ограничения есть у RocketMQ для решений с распределенными транзакциями? и описание
Когда мы упомянули, как использовать сообщения о транзакциях RocketMQ, **что, если потребление не удастся? **Существует 2 типа сбоев потребления. Во-первых, истекло время ожидания. Мы можем попробовать еще раз. Во-вторых, обработка действительно не удалась? Если хорошенько подумать, то эта часть довольно сложная, а что если потребуется 7-8 бизнес-модулей, а выполнение шестого бизнес-модуля не удастся? **Такая повторная попытка несколько раз все еще терпит неудачу, как мы справляемся с этим? ? ? ** Откатывает ли предыдущие 5 операций? Так сложно, так сложно,Почему RocketMQ не обеспечивает автоматический откат?Я надеюсь, что все задумаются об этом, если процент отказов относительно велик, то это системная проблема, которая требует оптимизации кода...
По мнению Zero, многие из них связаны с ручным вмешательством и механизмами согласования и компенсации T+1.
заключительные замечания
Мой уровень ограничен, и неизбежны недопонимания, если найдёте, пожалуйста, укажите на это, спасибо! ! !
Если вы чувствуете себя вознагражденным после прочтения, пожалуйста, поставьте лайк, подпишитесь и добавьте официальную учетную запись [Ingenuity Zero], чтобы узнать больше захватывающей истории! ! !