Как очередь сообщений обеспечивает идемпотентность потребления?
Как очередь сообщений обеспечивает идемпотентность потребления?

Благодаря постоянному развитию бизнес-потенциала,Нам все чаще приходится отделяться и работать асинхронно в крупных компаниях.,В это времяочередь Показаны преимущества сообщений, мы будем отправлять бизнес-сообщения для обработки в свою очередь. сообщенийсередина,проходитьочередь Сообщение Асинхронные операции завершают обработку бизнеса, тем самым улучшая возможности обработки бизнеса, а затем сообщений Как гарантироватьИдемпотентность потребленияШерстяная ткань,Целью данной статьи является изучение того, как обеспечитьочередь Идемпотентность сообщений

1. Сначала судите, а потом обновляйте

Возьмем, к примеру, бизнес по обработке заказов пользователей на потребление.,Если пользователь инициирует несколько запросов на создание заказа одновременно (конечно,,Это также можно сделать через интерфейсное обсуждение.,Здесь рассматривается, как передать бэкэнд-суждение),Затем в это время отправляется несколько запросов,очень просто,мы можем сначаласуждениеТекущий статус заказа пользователяБыло ли оно обновлено?,Если он уже был обновлен, нам не нужно обновлять его снова.,Но здесь будет проблема,Если бизнес по обработке заказов требуетзанимает много времени,В параллельном сценарии на сервер одновременно поступает несколько запросов.,Возможно, статус сейчас обновляется.,Но по факту суждение не вступает в силу,Поэтому самый простой методДело обременительноене работает в сценариях, где

Обновление первого обсуждения
Обновление первого обсуждения

2. Блокировка

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

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

3. Добавьте оценку статуса и используйте транзакции для удовлетворения идемпотентности.

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

Здесь мы можем использовать базу данныхсерединаизТранзакция + вставка таблицы сообщенийрешать,Мы можем создать дополнительную таблицу базы данных в виде таблицы сообщений.,Когда мы выполняем бизнес-код,Для выполнения запроса выполните следующий процесс:

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

Здесь мы анализируем две ситуации успешного и неудачного выполнения запроса:

Выполнено успешно:Если текущий запрос Выполнено успешно, тогда будет вставлен запрос, содержащий Выполнено. успешноновости,Затем, когда тот же запрос снова отправляется на сервер для выполнения,При вставке сообщения произойдет ошибка.,В это время服务器可以认为当前请求已经Выполнено успешноПонятно,Таким образом, вы можете вернуться напрямую,Гарантирует, что запрос будет успешно выполнен только один раз.

Выполнение не удалось:По запросусуществоватьосуществлять过程середина Происходит сбой,Тогда в силу особенностей транзакции происходит откат и выполняется заново.,до Выполнено До тех пор, пока успех не будет достигнут, это гарантирует идемпотентность запроса.

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

недостаточный

но,Главный герой этой статьи — как обеспечить идемпотентность с помощью очередей потребления.,Использование операций транзакций базы данных определенно может удовлетворить,Но если вы не используете реляционную базу данных, такую ​​как MySQL,СкорееRedisЭтот видНет механизма транзакциинереляционная база данных,Или, может быть, мы хотимВыполнение запросов к базам данных,Так как же мы можем обеспечить идемпотентность?

4. Используйте выполнение очереди сообщений

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

очередь сообщенийвыполнить Идемпотентность потребления
очередь сообщенийвыполнить Идемпотентность потребления

В этом плане,мы все еще используем Понятно上面提到изУстановить статусВставить таблицу сообщенийДругие планы,不同из是существовать Здесь мы добавляем ПонятноодинЗадержка потреблениямодуль,существоватьочередь сообщенийсерединатакже можно назватьЗадержка очереди,Задержка очередь может вызывать повторный запрос запросов в очереди время от времени, таким образом гарантируя, что даже если запрос сделан для Выполнения не удалось, также может быть выполнено снова до успешного завершения, обеспечивая тем самым идемпотентность. потребления

5. Добавьте стратегию повтора

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

решатьметодочень просто,мы можем добавитьСтратегия повторной попыткиизбегать Этот вид Состояние,Например, когда начинается потребление,СразуустановитьМаксимальное время выполнения запроса,Если время ожидания истекло, будет возвращена ошибка:

Стратегия идемпотентности потребления со сроком годности
Стратегия идемпотентности потребления со сроком годности

Или добавьтеКоличество повторов(RocketMQПовторная попытка по умолчанию16Второсортный),Таким образом, даже если произойдет ошибка выполнения бизнес-кода, он не попадет в бесконечный цикл.,也Сразурешать Понятно Идемпотентность потребления

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

Хорошо, это все об использовании очередей сообщений для обеспечения идемпотентности потребления. Надеюсь, это будет вам полезно! ! !

boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода