Назва відео:
Три категорії проблем конкурентності в інтерв’ю з низькорівневого дизайну (Low-Level Design Concurrency: Correctness, Coordination, Scarcity)
Ключова тема:
Низькорівневий дизайн (LLD) — конкурентність у багатопотокових системах.
Мета відео:
Навчити кандидатів розпізнавати три основні типи проблем конкурентності, які виникають у LLD-інтерв’ю (коректність, координація, обмеженість ресурсів), та надати практичні інструменти (блокування, атомарні змінні, блокуючі черги, семафори) для їх вирішення.
Основні концепції / кроки:
-
Категорія 1: Коректність (Correctness)
Виникає, коли два потоки одночасно отримують доступ до спільного стану, що призводить до порушення даних. Основні патерни — «check-then-act» (перевірка, а потім дія, наприклад, бронювання місця) та «read-modify-write» (читання, зміна, запис, наприклад, інкремент лічильника). Вирішується за допомогою блокувань (locks / synchronized blocks), а для простих лічильників — атомарних змінних (atomic variables), які використовують інструкції CPU (compare-and-swap). Важливо: блокування потрібні, коли змінюється кілька пов’язаних змінних; атомарні змінні підходять лише для одиничних значень. -
Категорія 2: Координація (Coordination)
Виникає, коли робота передається від одного потоку до іншого (наприклад, API-потік надсилає завдання фоновому воркеру). Проблеми: як воркер дізнається про нову роботу (ефективно) та як запобігти переповненню черги. Рішення — блокуюча черга з обмеженим розміром (bounded blocking queue). Воркер викликаєtake()(абоget()у Python) — якщо черга порожня, потік засинає; коли продюсер додає завдання черезput(), сплячий потік прокидається миттєво. Обмеження розміру черги створює зворотний тиск (back pressure), запобігаючи переповненню пам’яті. -
Категорія 3: Обмеженість ресурсів (Scarcity)
Виникає, коли треба контролювати одночасний доступ до скінченного ресурсу (наприклад, дозволено лише 10 одночасних запитів до зовнішнього API). Інструмент — семафор (semaphore). Ключовий нюанс: ресурс (дозвіл) обов’язково треба повертати навіть у разі винятку — використовувати блокfinally. Для об’єктів зі станом (наприклад, з’єднання з БД) краще використовувати блокуючу чергу як пул об’єктів: потік дістає з'єднання (take), використовує, а потім повертає (put).
Висновки / Headline:
У низькорівневому дизайні конкурентність зводиться до трьох простих питань: чи є спільний стан? (коректність → блокування/атоміки); чи тече робота між потоками? (координація → блокуюча черга); чи є ліміт ресурсів? (обмеженість → семафор або пул). Розпізнавши патерн, ви одразу знаєте, який інструмент застосувати, що значно спрощує інтерв’ю.