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

Курсы

Программирование
iOS Developer. Professional
-8%
Базы данных
-12%
Agile Project Manager
-5%
Python Developer. Basic
-10%
Java Developer. Professional
-7%
JavaScript Developer. Professional
-3%
MS SQL Server Developer
-8%
Scala-разработчик
-8%
Java Developer. Basic
-8%
Алгоритмы и структуры данных
-9%
Разработчик IoT
-13%
PostgreSQL
-8%
Подготовка к сертификации Oracle Java Programmer (OCAJP) Python Developer. Professional Golang Developer. Professional Разработчик программных роботов (RPA) на базе UiPath и PIX Unity Game Developer. Basic Разработчик голосовых ассистентов и чат-ботов C# ASP.NET Core разработчик VOIP инженер NoSQL Flutter Mobile Developer Супер - интенсив по Kubernetes iOS Developer. Basic Супер-интенсив «СУБД в высоконагруженных системах» Супер-интенсив "Tarantool"
Инфраструктура
Базы данных
-12%
Network engineer. Basic
-10%
Network engineer
-4%
Инфраструктурная платформа на основе Kubernetes
-6%
Экспресс-курс по управлению миграциями (DBVC)
-10%
Экспресс-курс «Введение в непрерывную поставку на базе Docker»
-10%
Экспресс-курс «CI/CD или Непрерывная поставка с Docker и Kubernetes»
-30%
Дизайн сетей ЦОД
-13%
PostgreSQL
-8%
DevOps практики и инструменты Cloud Solution Architecture Разработчик голосовых ассистентов и чат-ботов VOIP инженер Супер-практикум по работе с протоколом BGP NoSQL Супер-практикум по использованию и настройке GIT Супер-интенсив «СУБД в высоконагруженных системах» Экспресс-курс «IaC Ansible»
Специализации Курсы в разработке Подготовительные курсы
+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 комментариев
Для комментирования необходимо авторизоваться