Atvienošanas ieraksts pienāk pēc tam, kad jau ir sācies otrs savienojums ar to pašu vārdu, un apstrādātājs, kas atjaunina jaunāko rindu šim lietotājam, aizver nepareizo sesiju. Kļūda nav laika zīmogu salīdzināšanā. Kļūda ir pieņēmumā, ka vārds plus vesela sekunde identificē vienu sesiju. Āķa notikumi apraksta savienojumus, un savienojumam vajag atslēgu, kas pieder tikai tam.

Sāciet ar to, ko atvienošanas mainīgie patiešām nozīmē. Tikai tad identifikatora izvēlei ir jēga.

Ko atvienošanas āķis patiešām nes

Community OpenVPN 2.6 āķa uzziņa time_unix definē kā brīdi, kad klients izveidoja savienojumu; tas tiek iestatīts pirms savienojuma āķa izpildes un netiek definēts no jauna, kad atvienošanas āķis vēlāk tiek iedarbināts. time_duration dod šīs sesijas ilgumu sekundēs, tāpēc beigas ir aptuveni savienojuma laiks plus ilgums. Abi ir veselas sekundes, un neviens nav brīdis, kad jūsu datubāze apstrādāja notikumu. Tieši šo trīs laiku šķiršana ļauj korelācijai noturēties, nevis tikai izskatīties pareizi testēšanas laikā.

Šī aritmētika ir pelnījusi pierakstīšanu, jo tas ir vienīgais beigu laiks, ko piedāvā pats āķis. Apstrādes aizkave un pulksteņu atšķirības starp resursdatoriem joprojām paliek ārpus tā.

Kāpēc acīmredzamais pāris nav unikāls

Vārda savienošana ar savienojuma laiku sašaurina meklēšanu un joprojām neidentificē sesiju. Klients var atkārtoti savienoties tajā pašā sekundē, tāpēc divas sesijas var dalīties ar abām vērtībām. Divas dēmona instances vai servera nomaiņa, kas saglabā to pašu konfigurāciju, var radīt šo pāri no dažādiem procesiem. Tuneļa adreses tiek pārstrādātas tā paša iemesla dēļ, kas padara tās par sesijas atribūtiem, nevis tās identifikatoriem.

Kļūmes režīms ir kluss. Novēlota pirmās sesijas atvienošana sakrīt ar jaunāko rindu un izbeidz piešķīrumu, ko otrā sesija joprojām izmanto, tāpēc lietotājs piedzīvo nejaušu piekļuves zudumu, ko nav izraisījis. Pēc tam pareizi izskatošais rindu skaits padara problēmas pamanīšanu grūtāku.

No kurienes nāk stabila identitāte

Pārvaldības saskarne katram klientam piešķir klienta instances identifikatoru, un šis identifikators ir ierobežots ar dēmona instanci, kas to izdeva. Izmantojama ārējā atslēga apvieno stabilu servera identifikatoru, laikmetu, kas mainās, kad dēmons startē, un šo klienta ID. Laikmets ir svarīgs, jo identifikatori tiek restartēti kopā ar procesu, un kails procesa ID vēlāk var tikt izmantots no jauna kaut kam nesaistītam.

Vides mainīgie, kas iestatīti bērna savienojuma skriptā, nenonāk vēlākajā vecākdēmona atvienošanas skriptā, jo šie skripti darbojas kā atsevišķi procesi ar savu vidi. Tāpēc UUID ģenerēšana savienojuma laikā ir puse risinājuma. Atvienošanas pusei ir jāspēj nosaukt to pašu UUID, kas nozīmē, ka identitātei jādzīvo vietā, kur abi notikumi var nokļūt.

Padariet pārtraukšanu nosacītu un idempotentu

Pārtrauciet pēc sesijas īpašnieka, nevis pēc lietotāja. Apstrādātājs, kas dzēš jebkuru vārdam šobrīd piederošo piešķīrumu, galu galā dzēsīs nepareizo, un vienīgā aizsardzība ir pārbaudīt, vai noņemtais ieraksts ir ieraksts, ko apraksta šis notikums.

Pārvaldības saskarne vienlaikus pieņem vienu pievienotu pārvaldības klientu, tāpēc integrējieties ar to, kuram tas jau pieder, nevis pievienojiet otru novērotāju, kas sacenšas par to pašu ligzdu.

Apstrādājiet atkārtotus notikumus, nemainot rezultātu divreiz, un saglabājiet nesapārotos notikumus saskaņošanai, nevis izmetiet tos. Atvienošanas atzvanīšanai ir dokumentēti dzīves cikla nosacījumi, un pēc avārijas vai cieta apstāšanās tā var nekad ne pienākt, tāpēc dizainam vajadzīgs veids, kā attēlot sesiju, kuras beigu notikums trūkst.

Pārbaudiet neērtos gadījumus apzināti: divas atkārtotas savienošanās vienas sekundes laikā, divas dēmona instances, savienojums, kura apstrāde neizdevās, un dēmona restartēšana sesijas vidū. Atslēga, kas iztur visas četras, ir uzticēšanās vērta atslēga.

Saistītie raksti