Решаем проблему конкурентного доступа с помощью Lock-Free | OTUS
⚡ Подписка на курсы OTUS!
Интенсивная прокачка навыков для IT-специалистов!
Подробнее

Курсы

Программирование
iOS Developer. Professional Kotlin Backend Developer Flutter Mobile Developer Symfony Framework C++ Developer. Basic Unity Game Developer. Basic Java Developer. Professional
-35%
Highload Architect Unity Game Developer. Professional React.js Developer Специализация Java-разработчик
-25%
Алгоритмы и структуры данных
-16%
Scala-разработчик C# Developer. Professional
-23%
Разработчик голосовых ассистентов и чат-ботов Team Lead Архитектура и шаблоны проектирования NoSQL Web-разработчик на Python Golang Developer. Professional PostgreSQL Vue.js разработчик Супер-практикум по использованию и настройке GIT Разработчик IoT Подготовка к сертификации Oracle Java Programmer (OCAJP) Программист С HTML/CSS
Инфраструктура
Инфраструктурная платформа на основе Kubernetes Microservice Architecture Базы данных Highload Architect Reverse-Engineering. Professional
-8%
Network engineer. Basic Administrator Linux.Basic MongoDB Infrastructure as a code MS SQL Server Developer Cloud Solution Architecture Мониторинг и логирование: Zabbix, Prometheus, ELK Супер-практикум по использованию и настройке GIT Разработчик IoT Экcпресс-курс «ELK» Супер-интенсив "Tarantool" Экспресс-курс «CI/CD или Непрерывная поставка с Docker и Kubernetes» Экспресс-курс «Введение в непрерывную поставку на базе Docker»
Корпоративные курсы
Безопасность веб-приложений Экосистема Hadoop, Spark, Hive Пентест. Практика тестирования на проникновение Node.js Developer Java QA Engineer. Basic
-18%
Reverse-Engineering. Professional
-8%
DevOps практики и инструменты NoSQL Reverse-Engineering. Basic Cloud Solution Architecture Внедрение и работа в DevSecOps Супер-практикум по работе с протоколом BGP Game QA Engineer Супер - интенсив по Kubernetes Дизайн сетей ЦОД Экспресс-курс «IaC Ansible» Экспресс-курс по управлению миграциями (DBVC) Экспресс-курс "Версионирование и командная работа с помощью Git" Основы Windows Server
Специализации Курсы в разработке Подготовительные курсы Подписка
+7 499 938-92-02

Решаем проблему конкурентного доступа с помощью Lock-Free

C___Deep_27.12_site-5020-00967a.png

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

Блокировка

Самое простое, на первый взгляд, решение. Мы разрешаем пользоваться системой бронирования лишь одному человеку единовременно. Второй пользователь в этом случае не сможет войти в систему до того момента, пока первый пользователь не обновит данные путём сохранения внесённых изменений. Всё бы ничего, но номеров много, причём каждый из них независим от других. А если у нас целая сеть отелей и большой штат сотрудников, которые находятся в разных точках гостиничного комплекса? Кому-нибудь вечно придётся ожидать доступа? Пожалуй, вариант априори неприемлем. Очередной пример сверхсуровой атомарности — монопольный доступ, когда бронирование осуществляет только администратор. Тут вообще без комментариев.

Подход Lock-Free

При его реализации можно сделать так, чтобы операции не мешали друг другу. Но чтобы всегда можно было понять, что что-то пошло не так. Лучший способ это реализовать — выполнить проверку наличия параллельных операций, например, с помощью счётчика изменений. Но вот тут-то и кроется подвох. Дело в том, что процесс проверки тоже неатомарен, ведь он состоит из двух действий: проверка, как таковая, плюс непосредственно внесение изменений. И между выполнением этих двух действий всегда может кто-то «вклиниться», что сведёт на нет наши усилия.

Compare and Swap

Наилучший вариант в нашем случае — Compare and Swap (CaS) — та самая операция, которая является краеугольным камнем Lock-Free алгоритмов. CaS — это операция замены значения элемента с проверкой его предыдущего значения. Если наше предположение о предыдущем значении верно (то есть никто не успел поменять значение элемента до нас), то замена происходит. Иначе — операция CaS выполнена не будет, и мы поймем, что что-то пошло не так — элемент имеет какое-то другое значение.

С__1-20219-3f9f01.jpg Здесь важно то, что проверка и замена представляют собой единое действие, то есть процесс является атомарным, а между проверкой и заменой никто вклиниться не сможет. В этом и заключается смысл Compare and Swap.

Ознакомиться с подробностями работы Lock-Free алгоритмов на примере рабочего кода вы сможете на наших занятиях по курсу «Разработчик С++». Ждём вас в ближайшей группе!

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться