Atjungimo įrašas ateina po to, kai jau prasidėjo antras ryšys tuo pačiu vardu, ir apdoroklis, atnaujinantis naujausią to naudotojo eilutę, uždaro neteisingą sesiją. Klaida ne laiko žymų palyginime. Klaida prielaidoje, kad vardas plius visa sekundė identifikuoja vieną sesiją. Kablio įvykiai aprašo ryšius, o ryšiui reikia rakto, priklausančio tik jam.

Pradėkite nuo to, ką atjungimo kintamieji iš tikrųjų reiškia. Tik tada identifikatoriaus pasirinkimas turi prasmę.

Ką atjungimo kablys iš tikrųjų neša

Community OpenVPN 2.6 kablio nuoroda time_unix apibrėžia kaip momentą, kai klientas prisijungė; jis nustatomas prieš paleidžiant prisijungimo kablį ir neapibrėžiamas iš naujo, kai atjungimo kablys vėliau suveikia. time_duration pateikia tos sesijos trukmę sekundėmis, todėl pabaiga yra maždaug prisijungimo laikas plius trukmė. Abi yra sveikos sekundės, ir nė viena nėra momentas, kai jūsų duomenų bazė apdorojo įvykį. Būtent šių trijų laikų atskyrimas leidžia koreliacijai išsilaikyti, o ne tik atrodyti teisingai testuojant.

Ši aritmetika verta užrašyti, nes tai vienintelis pabaigos laikas, kurį siūlo pats kablys. Apdorojimo vėlavimas ir laikrodžių skirtumai tarp hostų vis dar lieka už jo ribų.

Kodėl akivaizdi pora nėra unikali

Vardo susiejimas su prisijungimo laiku susiaurina paiešką ir vis tiek neidentifikuoja sesijos. Klientas gali prisijungti iš naujo per tą pačią sekundę, todėl dvi sesijos gali dalytis abiem reikšmėmis. Dvi demono instancijos arba serverio pakeitimas, išlaikantis tą pačią konfigūraciją, gali sukurti tą porą iš skirtingų procesų. Tunelio adresai perdirbami dėl tos pačios priežasties, todėl jie yra sesijos atributai, o ne identifikatoriai.

Gedimo režimas tylus. Vėlyvas pirmosios sesijos atjungimas sutampa su naujausia eilute ir užbaigia priskyrimą, kurį antroji sesija dar naudoja, todėl naudotojas patiria atsitiktinį prieigos praradimą, kurio nesukėlė. Vėliau teisingai atrodantis eilučių skaičius apsunkina problemos pastebėjimą.

Iš kur atsiranda stabili tapatybė

Valdymo sąsaja kiekvienam klientui priskiria kliento instancijos identifikatorių, ir tas identifikatorius apribotas jį išdavusios demono instancijos. Veikiantis išorinis raktas sujungia stabilų serverio identifikatorių, epochą, kuri keičiasi paleidus demoną, ir tą kliento ID. Epoka svarbi, nes identifikatoriai paleidžiami iš naujo kartu su procesu, o plikas proceso ID vėliau gali būti pakartotinai panaudotas ko nors nesusijusio.

Aplinkos kintamieji, nustatyti vaikinio prisijungimo scenarijuje, nepatenka į vėlesnį pagrindinio demono atjungimo scenarijų, nes tie scenarijai vykdomi kaip atskiri procesai su savo aplinka. Todėl UUID generavimas prisijungimo metu yra pusė sprendimo. Atjungimo pusė turi galėti įvardyti tą patį UUID, o tai reiškia, kad tapatybė turi gyventi ten, kur abu įvykiai gali pasiekti.

Padarykite užbaigimą sąlyginį ir idempotentinį

Užbaikite pagal sesijos savininką, o ne pagal naudotoją. Apdoroklis, kuris ištrina bet kokį šiuo metu vardui priklausantį priskyrimą, galiausiai ištrins neteisingą, ir vienintelė gynyba yra patikrinti, ar šalinamas įrašas yra tas įrašas, kurį aprašo šis įvykis.

Valdymo sąsaja priima vieną prisijungusį valdymo klientą vienu metu, todėl integruokitės su tuo, kas jau jį valdo, o ne prijunkite antrą stebėtoją, konkuruojantį dėl tos pačios jungties.

Tvarkykite pasikartojančius įvykius nekeisdami rezultato du kartus, o nesuporuotus įvykius saugokite suderinimui, o ne išmeskite. Atjungimo atgalinis iškvietimas turi dokumentuotas gyvavimo ciklo sąlygas ir po avarijos ar kieto sustabdymo gali niekada neatvykti, todėl dizainui reikia būdo pavaizduoti sesiją, kurios pabaigos įvykio trūksta.

Išbandykite nepatogius atvejus tyčia: du pakartotiniai prisijungimai per vieną sekundę, dvi demono instancijos, ryšys, kurio apdorojimas nepavyko, ir demono paleidimas iš naujo sesijos viduryje. Raktas, atlaikantis visus keturis, yra pasitikėjimo vertas raktas.

Susiję straipsniai