Разпределено изчисление малко теория
Преди девет години започнах да преподавам компютърни дисциплини в един от университетите в Санкт Петербург „в свободното си време от основната си работа“. И едва сравнително наскоро, за моя изненада, открих, че в нашите университети практически няма курсове, насочени към проблемите на разпределените изчисления. И дори на Хабре тази тема не е достатъчно разкрита! Трябва да коригираме ситуацията веднага.
Вместо пролог.След като започнах текста на статията, за пореден път се чудех защо е нужно на един програмист да познава теоретичните основи на разпределените изчисления. Многократно съм чувал този въпрос (и продължавам да го чувам) от студенти и професионалисти, които вече работят в сферата на ИТ. Наистина, защо, например, знаем, че „множеството от събития на разпределените изчисления е частично подредено, а не линейно“? Какво, така да се каже, е ежедневното практическо използване на това фундаментално знание?
Трябва да призная, че нямам готов заучен отговор, който да дам без колебание. Следователно всеки път трябва да се напрягате с намотки и всеки път отговорите и аргументите се оказват различни. И сега като за първи път... Нека се опитаме да започнем отдалеч. И за да стане по-ясно – от медицината. Защото, когато става въпрос за лекарски грешки, мозъкът започва да работи активно и генерира силно възмущение: ужас, ужас, те могат да убият човек. Какво всъщност са те? Не знаят ли какво правят?
Всички ние съвсем естествено очакваме, че преди да започнат каквито и да било манипулации с човешкото тяло, лекарите все пак изучават вътрешната му структура и принципите на работа. Категорично не сме съгласни с твърдението, че за хирурзите е много по-важно да преминат практически курсове по кроене и шиене.вместо дълги години да тъпчем теоретичен материал за това какво имаме вътре и защо е там. Така че защо програмистите, разработващи мрежова система (тоест досега почти всяка система), не трябва да знаят "какво има вътре и защо е там"? Защо грешките в ИТ се възприемат с максимална лека ирония? Е, да, добре, грешка. И който не пие, не прави бъгове ?! Назовете го! Не, чакам! Сред изискванията към програмистите по някаква причина често на преден план излизат практически умения в един или друг език за програмиране. И силно на преден план, напълно засенчвайки изискванията за разбиране на основните понятия, теоретични модели, алгоритми, в крайна сметка ... А самите програмисти, честно казано, със започването на разговор „за теория, която никому не е необходима“ увяхват като цветя в пустиня ... Чудеса, нали ...
Ето едно кратко изказване на Л. Лампорт по тази тема (малко по-надолу се опитах да го преведа на български, без да се отклонявам много от оригинала):
От известно време бях обезпокоен от акцента върху езика в компютърните науки. Един резултат от този акцент са програмисти, които са експерти по C++, но не могат да пишат програми, които правят това, което трябва. Типичният отговор на компютърните науки е, че програмистите трябва да използват правилния език за програмиране / спецификация / разработка вместо / в допълнение към C++. Типичният индустриален отговор е да предостави на програмиста по-добри инструменти за отстраняване на грешки, на теорията, че можем да получим добри програми, като поставим маймуна на клавиатурата и автоматично открием грешките в нейния код. Вярвам, че най-добрият начин да получите по-добри програми е да научите програмистите как да мислят по-добре. Мисленето не е способността да се манипулира езикът; това е способността даманипулират понятия. Компютърната наука трябва да се занимава с концепции, а не с езици.
За да илюстрираме колко важни могат да бъдат "концепциите" и "елементите на теорията" при изграждането на разпределени системи, нека да разгледаме няколко прости примера. Нека започнем с изпращане на групово имейл съобщение между потребители A, B, C и X. Да кажем, че потребител A изпрати имейл до цялата група с тема „Обща среща“. Потребители B и C отговарят на него на цялата група със своите съобщения с тема "Re: Общо събрание".
В действителност събитията се случват в следната последователност:
- Първото изпратено съобщение е от потребител A.
- Потребител B го получава, чете го и изпраща отговор.
- Потребител C получава и двете съобщения от A и B и след това изпраща своя отговор въз основа на двете съобщения от A и B.
- Съобщение от потребител C с тема "Re:Re: Общо събрание".
- Съобщение от потребител А с тема "Общо събрание".
- Съобщение от потребител B с тема „Re: Общо събрание“.

Аха, оказва се, че редът, в който се получават съобщенията, наблюдаван от различни процеси, може да бъде различен дори за FIFO каналите! Но какво ще стане, ако искаме наблюдаемият ред да е един и същ навсякъде (и не искаме да използваме синхронни съобщения)? Например, ако напишем нашия транспорт със съответните гаранции. Или искаме да изградим услуга, устойчива на грешки (репликиранаstate machine), където всяка реплика трябва да обработва входящи заявки в същия ред за всички реплики, така че състоянията на репликите да не се различават? въпрос...
Помислете сега за друга реализация на разпределена система, в която процесите комуникират само чрез съобщения и всеки процес се занимава с включване / изключване на фенер с определена светлина. Нека първият процес управлява фенера с червена светлина, вторият с жълта и третият със зелена. Това е светофарната уредба. На фигурата по-долу включването на процеса на неговия фенер е обозначено с правоъгълник, а изключването му е обозначено с вертикална линия; изпращане и получаване на съобщения - стрелка. Въпрос: Могат ли процесите да определят кои светлини са били включени по едно и също време?

Така се оказва, че при това изпълнение на асинхронната система процесите няма да могат да определят дали червената лампичка е светнала едновременно с жълтата. Може би да. Или може би не ... Това ще остане неизвестно. Но от друга страна със сигурност ще се знае, че червените и зелените светлини са светнали едновременно. С други думи, оказва се, че няма смисъл да се казва, че това или онова глобално състояние се достига по време на изпълнението на разпределена система! Точно както много често е невъзможно да се каже дали някое условие (предикат), посочено върху множеството от неговите глобални състояния, е изпълнено! Отново въпросът е: защо?
В тази книга ще научите:
В началото се опитах накратко да кажа какви цели са били поставени при написването на книгата и как тя се свързва с друга литература. Това е въведението към книгата. Дължината е само малко над две страници, така че си заслужава да бъде прочетена.
Първият раздел е в по-голямата си част болтологичен и е посветен на "качествените" характеристики на разпределените системи.Ако не знаете какво е разпределена система и какви изисквания са наложени към нея, тогава първият раздел има смисъл да се чете. Ако знаете, че съобщенията, идващи към процеса на получаване, могат да дадат остаряла представа за процеса на изпращане, точно както светлинното лъчение, идващо към нас от далечна звезда, дава представа за състоянието на тази звезда в миналото, тогава можете да пропуснете първите четири точки :) Отделно, заслужава да се отбележи параграф 1.5 „Взаимодействие в разпределени системи“, в който се опитах да дам няколко прости задачи, които демонстрират трудностите, които могат да се срещнат при разработването на разпределени изд системи. След това ще решим тези проблеми, въоръжени с теоретични знания, така че си струва да се запознаете с тях.
Вторият раздел представя модела на разпределените изчисления и основната теория, използвана в по-нататъшното представяне. В известен смисъл този раздел е ключов. Човек обаче трябва да е подготвен да работи с термини като "множество / подмножество", "двоична релация", "отношение на еквивалентност", "отношение на ред", "линеен / частичен ред". В този раздел ще намерите доказателства за някои от твърденията. Струва ми се, че те трябва поне да бъдат пренебрегнати (или по-добре проучени) за по-задълбочено разбиране на основните характеристики на функционирането на разпределените системи, които ги отличават от системите от други класове.
Въз основа на теорията, представена по-горе, третият раздел накрая се занимава с по-практични неща, а именно различните механизми на логическите часовници. С тяхна помощ можем да организираме събитията в една или повече последователности, които биха могли да възникнат в системата, което значително опростява разработването на алгоритми за разпределени системи. Са даденипримери за използване на логически часовници за решаване на проблеми, формулирани в параграф 1.5 "Взаимодействие в разпределени системи".
Четвъртият раздел е посветен на изучаването на основни разпределени алгоритми за взаимно изключване, изградени без използването на обичайните споделени променливи. Ключовите идеи на тези алгоритми се използват и за решаване на много други проблеми в разпределени системи. В допълнение, тяхното проучване ни позволява да разкрием такива важни проблеми като осигуряване на свойствата на сигурността и оцеляването на разпределените алгоритми. Затова този раздел ми се струва много полезен за запознаване.
Към кого е насочена тази книга?
Какво бих искал?
Късмет! Михаил Косяков
Вместо епилог.„Информацията, за разлика от ресурсите, е предназначена да бъде споделяна.“ Робърт Кийосаки