Bejegyzés

Nem tudok meghalni, mert van egy Herald Tribune előfizetésem

Évek óta problémát jelent nagyvállalati ügyfeleinknél, hogy szoftverünk nagy terhelés mellett elég sok memóriát fogyaszt. Enterprise ügyfeleinknek nem illik mondani, hogy 4 naponta indítsák újra a felhasználói alkalmazást (apropó, Winword működik 4 napig?). Nem programozó kollégák is kíváncsiak voltak arra, hogy mi okozza a problémát. De hogy beszéljek nekik az agysebészet rejtelmeiről, ha nem láttak még orvosi műtőt belülről? Találtam azonban egy hasonlatot

Egy sztori, mint hasonlat:

“Nem tudok meghalni, mert van egy újság előfizetésem a Herald Tribune-nél. A kiadó tudja a címemet, ezért ha a kaszás jönne értem, nem vihet el, mert akkor a címen nem lakik senki! A halotti anyakönyvi kivonat persze automatikusan lemondja az előfizetést, de azt nem állítják ki, amíg élek.”

Van erre egy programozói kifejezés, Dead lock (vegyük észre benne a dead szót!), azaz a függőségek egymáshoz vannak láncolva. De mit is takar ez programozói szempontból és miért fontos ez most nekünk?

“Profi programozó nem használ Pascal nyelvet” tartja a mondás, pedig a memória problémák ott sokkal egzaktabbul kiküszöbölhetőek. Mi C# nyelvet használunk, amely kényelmes, gyorsan fejleszthető, kézre áll, sok benne az automatikus dolog. Például a memória felszabadítás. Na pont ez a probléma!

 

Esemény hivatkozások láncolata

Egy főiskolai vizsgaprogram, amely egy négy táblás adatbázisban valósít meg egy videotéka nyilvántartást, vélhetően nem fog sok memóriát lefoglalni, sőt esemény hivatkozásokat (event/delegate) sem fog tartalmazni. Nagyobb rendszerek viszont ezek nélkül nem képzelhetőek el! A Symbol Ügyvitel moduljai is számos eseményre feliratkoznak, hogy értesüljenek a programban bekövetkezett változásokról. Például új terméket választottam ki a számla tételben, ennek mennyiségi egységét, ÁFA kulcsát, árait a rendszer kérje le és frissítse.

A probléma ott áll elő, amikor a feliratkozott objektumra (az újság előfizetőjére) már nincs szükség. A rendszerbe beépített kaszás (Garbage Collector) viszont nem tudja őt a másvilágra küldeni, mert van egy előfizetése! Logikus lenne a “véget ér lassan az életem” állapotban az előfizetést lemondani, de ezt az állapotot nehéz felismerni. Mindenki sokáig akar élni!

I. Megoldás 

Megoldás lehetne a WeakReference Event, amely egy laza előfizetés. Ha látóköröm kívül kerül az előfizető, akkor az azonnali lemondással jár. Végre szabadon mozoghatok, akár meg is halhatok, nincs kötöttségem. De mégis van! Ha látótávolságon kívülre kerülök, akkor több újságot nem kapok. Így még a sarki boltba sem mehetek le, mert már nem lát az újság kiadója.

 

II. Megoldás

A megoldást nem árulom el (szakirodalom szerint nincs is egzakt megoldás, csak helyzetfüggő), de annyi biztos, hogy Symbol Ügyvitel rendszerünkben sikerült drasztikusan csökkenteni a kószáló, halálra váró, de előfizetéssel rendelkező “dolgok” számát.

 

Biztos nem volt nehéz…

A dolog nem volt egyszerű! A feliratkozások szálai olyan mélységekbe vezettek, hogy az újság kiadója sem tudta megmondani, hogy ki és mire fizetett elő. Talán az újságra már nem fizetek elő, de egy benne lévő melléklet miatt mégis kapom az újságot. Vagy az újság mellékletének egyik almelléklete miatt kapom a lapot úgy, hogy a kiadót egy nagyobb kiadó már megvette, ezzel átvéve az előfizetői listát.

 

Kinyomoztuk

Nem biztos, hogy teljesen a végére jutottunk, de a halálesetek (amik ebben a környezetben szükségesek) számát jelentősen növelni tudtuk, az eddigi túlnépesedést megállítottuk.

Örülünk Vincent? (Ponyvaregény 1984)