Անջատման գրառումը հասնում է այն բանից հետո, երբ նույն անվան տակ արդեն սկսվել է երկրորդ միացումը, և այդ օգտվողի ամենանոր տողը թարմացնող մշակիչը փակում է սխալ սեսիան։ Սխալը ժամադրոշմների համեմատության մեջ չէ։ Սխալն այն ենթադրության մեջ է, որ անունը գումարած մի ամբողջ վայրկյան նույնացնում են մեկ սեսիա։ Կեռիկի իրադարձությունները նկարագրում են միացումներ, և միացմանը պետք է բանալի, որը պատկանում է միայն իրեն։

Սկսեք նրանից, թե ինչ են իրականում նշանակում անջատման փոփոխականները։ Միայն այդ դեպքում է նույնացուցիչի ընտրությունը իմաստալից։

Ինչ է իրականում կրում անջատման կեռիկը

Community OpenVPN 2.6-ում կեռիկի տեղեկատուն time_unix սահմանում է այն պահը, երբ հաճախորդը միացել է․ այն դրվում է միացման կեռիկի աշխատելուց առաջ և չի վերասահմանվում, երբ անջատման կեռիկը հետագայում գործարկվում է։ time_duration տալիս է այդ սեսիայի տևողությունը վայրկյաններով, ուստի վերջը մոտավորապես միացման ժամանակը գումարած տևողությունն է։ Երկուսն էլ ամբողջ վայրկյաններ են, և ոչ մեկը այն պահը չէ, երբ ձեր տվյալների բազան մշակել է իրադարձությունը։ Այս երեք ժամանակները իրարից հեռու պահելն է, որ ստիպում է կորելացիան դիմանալ, այլ ոչ թե միայն փորձարկման ընթացքում ճիշտ թվալ։

Այս թվաբանությունն արժե գրի առնել, քանի որ դա միակ ավարտի ժամանակն է, որ առաջարկում է հենց կեռիկը։ Մշակման ուշացումը և հոսթերի միջև ժամացույցների տարբերությունները դեռ մնում են դրանից դուրս։

Ինչու ակնհայտ զույգը եզակի չէ

Անունը միացման ժամանակի հետ զուգակցելը նեղացնում է որոնումը և դեռ չի նույնացնում սեսիան։ Հաճախորդը կարող է նույն վայրկյանի ընթացքում կրկին միանալ, ուստի երկու սեսիա կարող են կիսել երկու արժեքներն էլ։ Երկու դեմոնի օրինակ, կամ նույն կոնֆիգուրացիան պահող սերվերի փոխարինում, կարող են այդ զույգը ստեղծել տարբեր պրոցեսներից։ Թունելի հասցեները վերամշակվում են նույն պատճառով, ինչը դարձնում է դրանք սեսիայի հատկանիշներ, այլ ոչ թե նույնացուցիչներ։

Խափանման եղանակը լուռ է։ Առաջին սեսիայի ուշ անջատումը համընկնում է ամենանոր տողի հետ և դադարեցնում է հատկացում, որը երկրորդ սեսիան դեռ օգտագործում է, ուստի օգտվողը զգում է պատահական հասանելիության կորուստ, որն ինքը չի առաջացրել։ Հետագայում ճիշտ թվացող տողերի քանակը դժվարացնում է խնդրի հայտնաբերմանը։

Որտեղից է գալիս կայուն ինքնությունը

Կառավարման ինտերֆեյսը յուրաքանչյուր հաճախորդի տալիս է հաճախորդի օրինակի նույնացուցիչ, և այդ նույնացուցիչը սահմանափակված է այն դեմոնի օրինակով, որը տրամադրել է այն։ Աշխատունակ արտաքին բանալին համատեղում է կայուն սերվերի նույնացուցիչ, դարաշրջան, որը փոխվում է դեմոնի մեկնարկին, և այդ հաճախորդի ID-ն։ Դարաշրջանը կարևոր է, որովհետև նույնացուցիչները վերագործարկվում են պրոցեսի հետ, և մերկ պրոցեսի ID-ն կարող է հետագայում կրկին օգտագործվել անկապ բանի կողմից։

Երեխա միացման սկրիպտի ներսում սահմանված միջավայրի փոփոխականները չեն անցնում ծնող դեմոնի հետագա անջատման սկրիպտին, որովհետև այդ սկրիպտներն աշխատում են որպես առանձին պրոցեսներ՝ իրենց սեփական միջավայրերով։ Ուստի միացման պահին UUID ստեղծելը կես լուծում է։ Անջատման կողմը պետք է կարողանա անվանել նույն UUID-ն, ինչը նշանակում է, որ ինքնությունը պետք է ապրի մի տեղ, որտեղ երկու իրադարձություններն էլ կարող են հասնել։

Դարձրեք դուրսբերումը պայմանական և իդեմպոտենտ

Դուրս բերեք ըստ սեսիայի սեփականատիրոջ, ոչ թե ըստ օգտվողի։ Մշակիչը, որը ջնջում է անվանը ներկայումս պատկանող ցանկացած հատկացում, ի վերջո կջնջի սխալը, և միակ պաշտպանությունը ստուգելն է, որ հեռացվող գրառումը այն գրառումն է, որը նկարագրում է այս իրադարձությունը։

Կառավարման ինտերֆեյսը միաժամանակ ընդունում է մեկ միացված կառավարման հաճախորդ, ուստի ինտեգրվեք նրան, ով արդեն տիրապետում է դրան, փոխարենը նույն սոքեթի համար մրցող երկրորդ դիտորդ կցելու։

Կրկնվող իրադարձությունները մշակեք առանց արդյունքը երկու անգամ փոխելու, և չզույգված իրադարձությունները պահեք հաշտեցման համար՝ դեն նետելու փոխարեն։ Անջատման հետկանչն ունի փաստաթղթավորված կենսացիկլի պայմաններ և կարող է երբեք չհասնել խափանումից կամ կոշտ կանգից հետո, ուստի դիզայնին պետք է եղանակ ներկայացնելու սեսիա, որի ավարտի իրադարձությունը բացակայում է։

Փորձարկեք անհարմար դեպքերը դիտմամբ․ մեկ վայրկյանի ընթացքում երկու վերամիացում, երկու դեմոնի օրինակ, միացում, որի մշակումը ձախողվել է, և դեմոնի վերագործարկում սեսիայի կեսին։ Այն բանալին, որը դիմանում է բոլոր չորսին, վստահության արժանի բանալի է։

Առնչվող հոդվածներ