Bağlantı kəsilməsi qeydi eyni ad altında ikinci bağlantı artıq başladıqdan sonra gəlir və həmin istifadəçi üçün ən yeni sətri yeniləyən emalçı yanlış sessiyanı bağlayır. Səhv vaxt damğası müqayisəsinin özündə deyil. Səhv bir adın üstəgəl tam bir saniyənin bir sessiyanı müəyyən etdiyi fərziyyəsindədir. Hook hadisələri bağlantıları təsvir edir və bağlantının yalnız ona aid olan açara ehtiyacı var.

Kəsilmə dəyişənlərinin həqiqətən nə məna verdiyindən başlayın. Yalnız bundan sonra identifikator seçimi məntiqli olur.

Kəsilmə hook-u əslində nə daşıyır

Community OpenVPN 2.6-da hook arayışı time_unix dəyərini müştərinin qoşulduğu an kimi təyin edir, bu dəyər qoşulma hook-u işləməzdən əvvəl qoyulur və kəsilmə hook-u sonradan işə düşəndə yenidən təyin olunmur. time_duration həmin sessiyanın uzunluğunu saniyələrlə verir, yəni son təxminən qoşulma vaxtı üstəgəl müddətdir. İkisi də tam saniyələrdir və heç biri verilənlər bazanızın hadisəni emal etdiyi an deyil. Bu üç vaxtı ayrı saxlamaq, əlaqənin yalnız sınaq zamanı düzgün görünmək əvəzinə həqiqətən tutmasını təmin edir.

Bu hesablamanı yazmağa dəyər, çünki hook-un özünün təklif etdiyi yeganə bitmə vaxtıdır. Emal gecikməsi və hostlar arasındakı saat fərqləri hələ də ondan kənarda qalır.

Niyə aşkar cüt unikal deyil

Adı qoşulma vaxtı ilə cütləşdirmək axtarışı daraldır, amma yenə də sessiyanı müəyyən etmir. Müştəri eyni saniyə içində yenidən qoşula bilər, yəni iki sessiya hər iki dəyəri paylaşa bilər. İki daemon nüsxəsi və ya eyni konfiqurasiyanı saxlayan server əvəzlənməsi həmin cütü müxtəlif proseslərdən yarada bilər. Tunel ünvanları da eyni səbəbdən yenidən istifadə olunur, bu da onları sessiyanın identifikatoru deyil, atributu edir.

Uğursuzluq rejimi səssizdir. Birinci sessiya üçün gec gələn kəsilmə ən yeni sətrə uyğun gəlir və ikinci sessiyanın hələ istifadə etdiyi ayrıcı qeydi bağlayır, nəticədə istifadəçi səbəbkar olmadığı təsadüfi giriş itkisi yaşayır. Sonradan düzgün görünən sətir sayı problemi tapmağı çətinləşdirir.

Sabit kimlik haradan gəlir

İdarəetmə interfeysi hər müştəriyə müştəri nüsxəsi identifikatoru verir və bu identifikator onu buraxan daemon nüsxəsi ilə məhdudlaşır. İşlək xarici açar sabit server identifikatorunu, daemon başlayanda dəyişən epoxanı və həmin müştəri ID-sini birləşdirir. Epoxa vacibdir, çünki identifikatorlar proseslə birlikdə yenidən başlayır və sadə proses ID-si sonradan əlaqəsiz bir şey tərəfindən təkrar istifadə oluna bilər.

Uşaq qoşulma skriptinin içində qoyulan mühit dəyişənləri valideyn daemonun sonrakı kəsilmə skriptinə keçmir, çünki həmin skriptlər öz mühitləri olan ayrı proseslər kimi işləyir. Buna görə qoşulma zamanı UUID yaratmaq həllin yalnız yarısıdır. Kəsilmə tərəfi həmin UUID-ni adlandıra bilməlidir, yəni kimlik hər iki hadisənin çata bildiyi yerdə yaşamalıdır.

Bağlanmanı şərti və idempotent edin

Sessiyanı istifadəçiyə görə deyil, sessiya sahibinə görə bağlayın. Hazırda bir ada aid olan hər hansı ayrıcı qeydi silən emalçı sonda yanlış qeydi siləcək və yeganə müdafiə silinən qeydin bu hadisəni təsvir edən qeyd olduğunu yoxlamaqdır.

İdarəetmə interfeysi bir vaxtda yalnız bir qoşulmuş idarəetmə müştərisi qəbul edir, ona görə eyni soket üçün rəqabət edən ikinci müşahidəçi əlavə etmək əvəzinə onu artıq idarə edənlə inteqrasiya edin.

Təkrarlanan hadisələri nəticəni iki dəfə dəyişmədən emal edin və cütləşməmiş hadisələri atmaq əvəzinə uzlaşma üçün saxlayın. Kəsilmə geri çağırışının sənədləşdirilmiş həyat dövrü şərtləri var və çökmə və ya sərt dayanmadan sonra heç vaxt gəlməyə bilər, ona görə dizayn bitmə hadisəsi çatışmayan sessiyanı təmsil etməyin yoluna ehtiyac duyur.

Narahat edici halları qəsdən sınayın: bir saniyə içində iki yenidən qoşulma, iki daemon nüsxəsi, emalı uğursuz olan qoşulma və sessiyanın ortasında daemon yenidən başlaması. Dördünün hamısına dözən açar etimada layiq açardır.

Əlaqəli məqalələr