Бірдей атаумен екінші қосылым басталып кеткеннен кейін ажырату жазбасы келеді, және сол пайдаланушының ең жаңа жолын жаңартатын өңдеуші қате сессияны жабады. Қате уақыт белгілерін салыстыруда емес. Қате атау мен бір толық секунд бір сессияны анықтайды деген болжамда. Ілмек оқиғалары қосылымдарды сипаттайды, ал қосылымға тек өзіне тиесілі кілт қажет.

Ажырату айнымалыларының шын мәнінде нені білдіретінінен бастаңыз. Сонда ғана идентификаторды таңдау мағыналы болады.

Ажырату ілмегі шын мәнінде нені тасымалдайды

Community OpenVPN 2.6 ішінде ілмек анықтамалығы time_unix мәнін клиент қосылған сәт ретінде анықтайды; ол қосылу ілмегі іске қосылғанға дейін орнатылады және ажырату ілмегі кейінірек іске қосылғанда қайта анықталмайды. time_duration сол сессияның ұзақтығын секундпен береді, сондықтан соңы шамамен қосылу уақыты қосу ұзақтық. Екеуі де бүтін секундтар, және ешқайсысы дерекқорыңыз оқиғаны өңдеген сәт емес. Осы үш уақытты бөлек ұстау корреляцияның тек сынақ кезінде дұрыс көрінуіне емес, шынымен ұстап тұруына әкеледі.

Бұл арифметика жазылуға тұрарлық, өйткені бұл ілмектің өзі ұсынатын жалғыз аяқталу уақыты. Өңдеу кідірісі мен хосттар арасындағы сағат айырмашылықтары әлі де оның сыртында қалады.

Неге айқын жұп бірегей емес

Атауды қосылу уақытымен жұптастыру іздеуді тарылтады және әлі де сессияны анықтамайды. Клиент сол секундтың ішінде қайта қосыла алады, сондықтан екі сессия екі мәнді де бөлісе алады. Екі демон данасы немесе бірдей конфигурацияны сақтайтын сервер ауыстыруы бұл жұпты әртүрлі процестерден жасай алады. Туннель мекенжайлары сол себепті қайта өңделеді, бұл оларды сессияның атрибуттары етеді, оның идентификаторлары емес.

Істен шығу режимі тыныш. Бірінші сессия үшін кешіккен ажырату ең жаңа жолға сәйкес келеді және екінші сессия әлі пайдаланып жатқан бөліндіні жабады, сондықтан пайдаланушы өзі себеп болмаған кездейсоқ қатынас жоғалтуын бастан кешеді. Кейін дұрыс көрінетін жол саны мәселені байқауды қиындатады.

Тұрақты сәйкестік қайдан келеді

Басқару интерфейсі әр клиентке клиент данасының идентификаторын береді, және бұл идентификатор оны берген демон данасымен шектеледі. Жұмысқа жарамды сыртқы кілт тұрақты сервер идентификаторын, демон іске қосылғанда өзгеретін дәуірді және сол клиент ID-ін біріктіреді. Дәуір маңызды, өйткені идентификаторлар процеспен бірге қайта басталады, ал жалаң процесс ID-і кейінірек байланысы жоқ нәрсемен қайта пайдаланылуы мүмкін.

Бала қосылу скриптінің ішінде орнатылған орта айнымалылары ата-ана демонның кейінгі ажырату скриптіне өтпейді, өйткені бұл скрипттер өз орталарымен жеке процестер ретінде жұмыс істейді. Сондықтан қосылу кезінде UUID жасау жарты шешім. Ажырату жағы сол UUID-ді атай алуы керек, яғни сәйкестік екі оқиға да жете алатын жерде өмір сүруі керек.

Жабудан шығаруды шартты және идемпотентті етіңіз

Сессия иесі бойынша шығарыңыз, пайдаланушы бойынша емес. Атауға қазір тиесілі кез келген бөліндіні жоятын өңдеуші ақырында қатесін жояды, және жалғыз қорғаныс — жойылып жатқан жазба осы оқиға сипаттайтын жазба екенін тексеру.

Басқару интерфейсі бір уақытта бір қосылған басқару клиентін қабылдайды, сондықтан сол сокет үшін бәсекелесетін екінші бақылаушыны тіркеудің орнына оны әлдеқашан иемденген жақпен біріктіріңіз.

Қайталанатын оқиғаларды нәтижені екі рет өзгертпей өңдеңіз, және жұптаспаған оқиғаларды тастаудың орнына келістіру үшін сақтаңыз. Ажырату кері шақыруының құжатталған өмірлік цикл шарттары бар және апат немесе қатты тоқтатудан кейін ешқашан келмеуі мүмкін, сондықтан дизайнға аяқталу оқиғасы жоқ сессияны бейнелеу тәсілі қажет.

Ыңғайсыз жағдайларды әдейі сынап көріңіз: бір секунд ішінде екі қайта қосылу, екі демон данасы, өңдеуі сәтсіз аяқталған қосылым және сессия ортасында демонды қайта іске қосу. Осы төртеуіне де төтеп беретін кілт сенімге лайық кілт.

Қатысты мақалалар