Katkaisutietue saapuu sen jälkeen, kun toinen yhteys samalla nimellä on jo alkanut, ja käsittelijä, joka päivittää kyseisen käyttäjän uusimman rivin, sulkee väärän istunnon. Virhe ei ole aikaleimojen vertailussa. Se on oletuksessa, että nimi plus kokonainen sekunti yksilöivät yhden istunnon. Hook-tapahtumat kuvaavat yhteyksiä, ja yhteys tarvitsee avaimen, joka kuuluu vain sille.

Aloita siitä, mitä katkaisumuuttujat todella tarkoittavat. Vasta sitten tunnisteen valinta on järkevää.

Mitä katkaisun hook todella kuljettaa

Community OpenVPN 2.6:ssa hook-viite time_unix määrittelee hetken, jolloin asiakas yhdisti; se asetetaan ennen yhdistämisen hookin suorittamista, eikä sitä määritellä uudelleen, kun katkaisun hook myöhemmin laukeaa. time_duration antaa kyseisen istunnon keston sekunteina, joten loppu on suunnilleen yhteydenottoaika plus kesto. Molemmat ovat kokonaisia sekunteja, eikä kumpikaan ole hetki, jolloin tietokantasi käsitteli tapahtuman. Juuri näiden kolmen ajan erillään pitäminen saa korrelaation pitämään, eikä vain näyttämään oikealta testauksen aikana.

Tämä laskenta ansaitsee tulla kirjatuksi, koska se on ainoa lopetusaika, jonka hook itse tarjoaa. Käsittelyn viive ja isäntien väliset kelloerot jäävät silti sen ulkopuolelle.

Miksi ilmeinen pari ei ole yksikäsitteinen

Nimen yhdistäminen yhteydenottoaikaan kaventaa hakua eikä silti yksilöi istuntoa. Asiakas voi yhdistää uudelleen saman sekunnin sisällä, joten kaksi istuntoa voi jakaa molemmat arvot. Kaksi taustapalvelimen instanssia tai palvelimen vaihto, joka säilyttää saman kokoonpanon, voivat tuottaa tuon parin eri prosesseista. Tunneliosoitteet kierrätetään samasta syystä, mikä tekee niistä istunnon ominaisuuksia eikä sen tunnisteita.

Vikamuoto on hiljainen. Ensimmäisen istunnon myöhäinen katkaisu osuu uusimpaan riviin ja lopettaa varauksen, jota toinen istunto yhä käyttää, joten käyttäjä kokee satunnaisen pääsyn menetyksen, jota hän ei aiheuttanut. Jälkikäteen oikealta näyttävä rivimäärä tekee ongelman havaitsemisesta vaikeampaa.

Mistä vakaa identiteetti tulee

Hallintaliittymä antaa jokaiselle asiakkaalle asiakasinstanssin tunnisteen, ja tämä tunniste on rajattu taustapalvelimen instanssiin, joka sen myönsi. Toimiva ulkoinen avain yhdistää vakaan palvelintunnisteen, epookin, joka muuttuu taustapalvelimen käynnistyessä, ja kyseisen asiakastunnisteen. Epookki on tärkeä, koska tunnisteet käynnistyvät uudelleen prosessin mukana, ja paljas prosessitunniste voi myöhemmin päätyä uudelleenkäyttöön johonkin liittymättömään.

Lapsen yhdistämisskriptin sisällä asetetut ympäristömuuttujat eivät kulkeudu taustapalvelimen myöhempään katkaisuskriptiin, koska nämä skriptit ajetaan erillisinä prosesseina omine ympäristöineen. Siksi UUID:n luominen yhdistämisen yhteydessä on puoli ratkaisua. Katkaisun puolen on kyettävä nimeämään sama UUID, mikä tarkoittaa, että identiteetin on elettävä jossakin, mihin molemmat tapahtumat voivat päästä.

Tee lopetuksesta ehdollinen ja idempotentti

Lopeta istunnon omistajan mukaan, ei käyttäjän. Käsittelijä, joka poistaa minkä tahansa nimeen tällä hetkellä kuuluvan varauksen, poistaa lopulta väärän, ja ainoa puolustus on tarkistaa, että poistettava tietue on tietue, jonka tämä tapahtuma kuvaa.

Hallintaliittymä hyväksyy yhden yhdistetyn hallinta-asiakkaan kerrallaan, joten integroidu sen kanssa, joka jo omistaa sen, sen sijaan että liittäisit toisen tarkkailijan kilpailemaan samasta pistokkeesta.

Käsittele toistuvat tapahtumat muuttamatta tulosta kahdesti ja säilytä parittomat tapahtumat täsmäyttämistä varten sen sijaan että hylkäisit ne. Katkaisun takaisinkutsulla on dokumentoidut elinkaariehdot, eikä se välttämättä saavu koskaan kaatumisen tai kovan pysäytyksen jälkeen, joten suunnittelu tarvitsee tavan esittää istunto, jonka lopetustapahtuma puuttuu.

Testaa hankalat tapaukset tarkoituksella: kaksi uudelleenyhdistämistä yhden sekunnin sisällä, kaksi taustapalvelimen instanssia, yhteys, jonka käsittely epäonnistui, ja taustapalvelimen uudelleenkäynnistys istunnon keskellä. Avain, joka kestää kaikki neljä, on luottamuksen arvoinen.

Aiheeseen liittyvät artikkelit