Vaša aplikacija deluje naprej, medtem ko predor umira. Wi-Fi je še vedno vklopljen, internet se še vedno odziva, zasebni API, od katerega je aplikacija odvisna, pa je postal nedosegljiv. Dogodek .NET, po katerega se ljudje tukaj običajno zatečejo, NetworkAvailabilityChanged, tega stanja sploh ne opisuje. Poroča o spremembi skupnega stanja stroja, in to stanje lahko ostane resnično med prekinitvijo in ponovno vzpostavitvijo VPN. Opazovalnik mora spremljati odjemalca, ki ima predor, ne povzetka omrežnega sklada.

Razpoložljivost je agregat, ne vaš predor

NetworkAvailabilityChanged se sproži, ko se spremeni skupni odgovor stroja o razpoložljivosti, in ta odgovor šteje vsak aktivni vmesnik razen loopbacka ali predora.

Izpad VPN ob vklopljenem Wi-Fi ne spremeni ničesar od tega, kar meri, zato lahko dogodek molči prav med okvaro, ki vas zanima.

Tok stanja pripada odjemalcu, ki ima predor

Ugotovite, katera komponenta ima povezavo: GUI ali storitev OpenVPN, OpenVPN Connect ali proces, ki ga je zagnala in nadzoruje vaša aplikacija. To so različni lastniki z različnimi podprtimi vmesniki, opazovalnik pa mora uporabiti tistega, ki ustreza uvajanju. Za proces OpenVPN, s katerim se smete integrirati, upravljalni vmesnik poroča o trenutnem stanju, zgodovini in obvestilih v realnem času. Analizirajte dokumentirana strukturirana sporočila, namesto da bi v lokaliziranem napisu GUI iskali besedo connected.

Upravljalni kanal je privilegirana nadzorna površina, zato ne odpirajte novega poslušalca in se ne prepirajte z GUI za kanal, ki ga ta že ima.

Generacijske straže ustavijo zastarele rezultate

Vsako opazovanje pripada določenemu poskusu povezave. Povečajte števec generacije, ko se začne nov poskus, ko se izgubi kanal in ko odjemalec sporoči izhod.

Vzemite sondi, začetni med povezavo A. Predor pade, začne se povezava B, nato pa prispe zapoznel uspeh HTTP povezave A. Brez straže ta stari rezultat obarva zaslon zeleno, medtem ko se B še preverja. Preklic zmanjša zapravljeno delo, generacijsko preverjanje pa je tisto, ki prepreči, da bi zastarela dokončanost postala trenutno stanje:

var generation = _generation;
var reachable = await ProbeAsync(token);
if (generation != _generation) return;
Publish(reachable);

Enako pravilo uporabite okrog pošiljanja v UI, ker lahko marshalirana posodobitev prispe, potem ko je generacija že napredovala.

Inicializacija in ponovna povezava sta en življenjski cikel

Prvo povezavo, ponovno povezavo in izgubo kanala obravnavajte kot en življenjski cikel z enim naborom pravil:

  • Preberite trenutno stanje in se naročite na obvestila v enem koraku, kjer vmesnik to dovoljuje.
  • Vsako opazovanje označite z identiteto povezave in generacijo.
  • Razveljavite pripravljenost ob ponovni povezavi, izhodu ali izgubljenem opazovalnem kanalu.
  • Zasebni vir preizkusite šele, ko lastnik sporoči dokončano inicializacijo.
  • Objavite le rezultate, ki še pripadajo trenutni generaciji.

Izgubljen kanal pomeni neznano, ne prekinjeno. Poročanje o neznanem je bolj pošteno kot poročanje o prekinitvi, ki je ne morete dokazati, in prepreči, da bi logika ponovnih poskusov delovala na podlagi ugibanja.

Poročajte dokaze, ne logične vrednosti

Vrnite imenovano stanje seje in pripravljenost vira kot ločeni vrednosti, vsako z starostjo. Porabnik, ki se mora o nečem odločiti, lahko potem vidi, da je zadnja uspešna sonda stara štirideset sekund, kar je drugačna informacija od sveže.

Iskanje javnega IP ni dokaz, da je zasebni API uporabil zahtevano pot, zato tega ne predstavljajte, kot da bi bil.

Uveljavljanje držite zunaj opazovalnika

Povratni klic se izvede po dejstvu. Ne more zagotoviti, da med dogodkom in upravljalnikom stroja ni zapustil noben paket. Če zasnova zahteva blokiranje, ga mora zagotoviti omrežna politika, naloga opazovalnika pa je, da dokaze razloži svojemu klicatelju. Mešanje obeh ustvari kodo, ki misli, da je požarni zid, ker hrani logično vrednost. Uveljavljalno plast ohranite dolgočasno in preizkušljivo, opazovalnik pa naj ostane bralec.

Takrat vprašanje UI postane preprosto: pokažite, kar je znano, z njegovo starostjo, in recite neznano, ko je tako.

Sorodni članki