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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose