Uváznutí v Aktor systému

BoneFlute

  • *****
  • 2 026
    • Zobrazit profil
Uváznutí v Aktor systému
« kdy: 14. 10. 2019, 19:50:10 »
Zdravím.

Zkouším si jednoduchý Aktor systém. Celkem mi to jakože pěkně funguje, ale trošku jsem se zasekl na uváznutí.

Předpokládejme dva aktory A a B.
A -> B: kolik je hodin
B -> A: 19:41
A -> B: supr, díky
B -> A: není zač
A -> B: ok
B -> A: ok
A -> B: ok
B -> A: ok
A -> B: ok
B -> A: ok
A -> B: ok
...

Mohl by mi tu někodo poradit, jak se něco takového řeší? Třeba v Erlangu, systému Akka, nebo dalších?

Nechce se mi spoléhat na to, že ten aktor bude napsán správně. Rád bych tomu dodal alespoň základní ochranu. V "normálním" kódu se to dá trochu statistickou analízou podchytit. Na druhou stranu mé znalosti problematiky jsou omezené, a tak třeba existuje nějaké jednoduché řešení které dokáže víc.

Předem dík.


Re:Uváznutí v Aktor systému
« Odpověď #1 kdy: 16. 10. 2019, 10:30:48 »
Moc nerozumím tomu problému. Jak ti vznikne ta nekonečná sekvence zpráv ok? Ty aktoři zprávu ok musí na základě něčeho zaslat.

BoneFlute

  • *****
  • 2 026
    • Zobrazit profil
Re:Uváznutí v Aktor systému
« Odpověď #2 kdy: 16. 10. 2019, 12:49:12 »
Ti aktoři jsou špatně napsaní. Když dostane správu "OK" tak na ni odpoví taky "OK". Prostě chyba.

Re:Uváznutí v Aktor systému
« Odpověď #3 kdy: 16. 10. 2019, 13:00:50 »
Ti aktoři jsou špatně napsaní. Když dostane správu "OK" tak na ni odpoví taky "OK". Prostě chyba.

No a co si představuješ za řešení?

Re:Uváznutí v Aktor systému
« Odpověď #4 kdy: 16. 10. 2019, 14:22:37 »
Ti aktoři jsou špatně napsaní. Když dostane správu "OK" tak na ni odpoví taky "OK". Prostě chyba.

Kacirska myslenka... :-)
Co na to napsat testy?


Re:Uváznutí v Aktor systému
« Odpověď #5 kdy: 16. 10. 2019, 14:32:18 »
Není obecná detekce uváznutí ekvivalentní řešení halting problému?

Re:Uváznutí v Aktor systému
« Odpověď #6 kdy: 16. 10. 2019, 14:40:17 »
No a jak vůbec víš, že to chování je špatně? Když si tu zprávu "ok" přejmenuješ třeba na "heartbeat", klidně by se to dalo považovat za pro některé scénáře korektní chování, např. testování živosti toho druhého aktora.

Souhlasím s příspěvkem dříve - napsat si na to testy.

Zdravím.

Zkouším si jednoduchý Aktor systém. Celkem mi to jakože pěkně funguje, ale trošku jsem se zasekl na uváznutí.

Předpokládejme dva aktory A a B.
A -> B: kolik je hodin
B -> A: 19:41
A -> B: supr, díky
B -> A: není zač
A -> B: ok
B -> A: ok
A -> B: ok
B -> A: ok
A -> B: ok
B -> A: ok
A -> B: ok
...

Mohl by mi tu někodo poradit, jak se něco takového řeší? Třeba v Erlangu, systému Akka, nebo dalších?

Nechce se mi spoléhat na to, že ten aktor bude napsán správně. Rád bych tomu dodal alespoň základní ochranu. V "normálním" kódu se to dá trochu statistickou analízou podchytit. Na druhou stranu mé znalosti problematiky jsou omezené, a tak třeba existuje nějaké jednoduché řešení které dokáže víc.

Předem dík.

RDa

  • *****
  • 2 953
    • Zobrazit profil
    • E-mail
Re:Uváznutí v Aktor systému
« Odpověď #7 kdy: 16. 10. 2019, 15:44:00 »
Rád bych tomu dodal alespoň základní ochranu.

Ochranu vuci cemu? Ja v prikladu zadne uviznuti nevidim, probiha tam aktivni komunikace.

BoneFlute

  • *****
  • 2 026
    • Zobrazit profil
Re:Uváznutí v Aktor systému
« Odpověď #8 kdy: 16. 10. 2019, 16:00:13 »
Ti aktoři jsou špatně napsaní. Když dostane správu "OK" tak na ni odpoví taky "OK". Prostě chyba.

No a co si představuješ za řešení?

Že to jakože "odhadne", že je tam chyba v komunikaci, a třeba to zařízne. Něco jako timeout. Nebo jako ta věc v databázi, která detekuje deadlocky.

Nemá-li to řešení, ok. Ale chtěl jsem se zeptat.

Moje aktuální úvaha směřuje k tomu, že budu sledovat komunikaci, a když se tam zopakuje vzor, tak to zaříznu.

Kód: [Vybrat]
Když A řekne "a" a B odpoví "b" a A odpoví "a", tak B vždy odpoví "b" -> konec

BoneFlute

  • *****
  • 2 026
    • Zobrazit profil
Re:Uváznutí v Aktor systému
« Odpověď #9 kdy: 16. 10. 2019, 16:01:23 »
Ti aktoři jsou špatně napsaní. Když dostane správu "OK" tak na ni odpoví taky "OK". Prostě chyba.

Kacirska myslenka... :-)
Co na to napsat testy?

Úplně nevím, jak by to mohlo pomoct, ale nebráním se tomu. Jak?

Re:Uváznutí v Aktor systému
« Odpověď #10 kdy: 16. 10. 2019, 16:40:59 »
Ti aktoři jsou špatně napsaní. Když dostane správu "OK" tak na ni odpoví taky "OK". Prostě chyba.

Kacirska myslenka... :-)
Co na to napsat testy?

Úplně nevím, jak by to mohlo pomoct, ale nebráním se tomu. Jak?

Je fakt, že aktory se testují blbě, protože aktor je vlastně izolovaná jednotka se skrytým mutable stavem a funkcí receive s typem Any => Unit (čti jako "spolknu cokoliv a možná udělám nějaký sideeffect"). Takže se při práci s aktory musíš prát s mutable stavem a navíc přicházíš o všechny kontroly, které normálně poskytuje statický typový systém. Možná proto taky např. Erlang statický typový systém nemá.

I tak ale nevidím problém v tom napsat alespoň test, který spawne dva aktory, nechá jednoho poslat druhému zprávu ok, a zkontroluje, že zpátky přišla právě jedna odpověď ok, pokud je to zamýšlené chování. Bohužel díky tomu skrytému mutable stavu není zaručené, že když to tak dopadlo jednou, dopadne to tak i podruhé.

Jen pro zajímavost, je dost problémů, které někdo řeší aktory, ale lépe se na ně hodí FRP. Tam naopak funguje statický typový systém bezvadně, obejde se to bez mutable stavu, takže se nad tím daleko líp uvažuje, je to víc komponovatelné. Nějaké shrnutí pro a proti jsem našel tady: https://cs.stackexchange.com/a/9042

Ale samozřejmě záleží na konkrétním problému, na spoustu věcí aktory jsou ideální řešení.

BoneFlute

  • *****
  • 2 026
    • Zobrazit profil
Re:Uváznutí v Aktor systému
« Odpověď #11 kdy: 16. 10. 2019, 16:45:58 »
I tak ale nevidím problém v tom napsat alespoň test, který spawne dva aktory, nechá jednoho poslat druhému zprávu ok, a zkontroluje, že zpátky přišla právě jedna odpověď ok, pokud je to zamýšlené chování. Bohužel díky tomu skrytému mutable stavu není zaručené, že když to tak dopadlo jednou, dopadne to tak i podruhé.

OK, ale tady se obávám, že neřešíš problém na který se ptám.

Jak otestovat aktor? To bych si snad i poradil.

Já se ale ptám na to, jak zjistit, případně otestovat, že v komunikaci mezi dvěmi aktory, které nemám pod kontrolou, nedojde k uváznutí. Přičemž samozřejmě se může jednat i o různé komunikace. Jednou je to ok -> ok, jindy done -> ok -> ok -> done... etc.

Re:Uváznutí v Aktor systému
« Odpověď #12 kdy: 16. 10. 2019, 16:57:29 »
I tak ale nevidím problém v tom napsat alespoň test, který spawne dva aktory, nechá jednoho poslat druhému zprávu ok, a zkontroluje, že zpátky přišla právě jedna odpověď ok, pokud je to zamýšlené chování. Bohužel díky tomu skrytému mutable stavu není zaručené, že když to tak dopadlo jednou, dopadne to tak i podruhé.

OK, ale tady se obávám, že neřešíš problém na který se ptám.

Jak otestovat aktor? To bych si snad i poradil.

Já se ale ptám na to, jak zjistit, případně otestovat, že v komunikaci mezi dvěmi aktory, které nemám pod kontrolou, nedojde k uváznutí. Přičemž samozřejmě se může jednat i o různé komunikace. Jednou je to ok -> ok, jindy done -> ok -> ok -> done... etc.

No, nejprve asi musíš definovat uváznutí. Jak poznáš, že nekonečná sekvence zpráv mezi aktory není korektní chování? Vždyť na tom, že si aktory posílají zprávy tam a zpátky není nic neobvyklého. Navíc právě díky tomu mutable stavu uvnitř nikdy nevíš, že je ta série zpráv skutečně nekonečná, můžeš mít uvnitř nějaký counter, který po tisíci iteracích přestane ok posílat, a zas to může být očekávané chování. Takhle asi narazíš buď na vágní definici uváznutí, nebo na Halting problem, jak zmiňoval někdo výše.

Re:Uváznutí v Aktor systému
« Odpověď #13 kdy: 16. 10. 2019, 17:23:03 »
I tak ale nevidím problém v tom napsat alespoň test, který spawne dva aktory, nechá jednoho poslat druhému zprávu ok, a zkontroluje, že zpátky přišla právě jedna odpověď ok, pokud je to zamýšlené chování. Bohužel díky tomu skrytému mutable stavu není zaručené, že když to tak dopadlo jednou, dopadne to tak i podruhé.

OK, ale tady se obávám, že neřešíš problém na který se ptám.

Jak otestovat aktor? To bych si snad i poradil.

Já se ale ptám na to, jak zjistit, případně otestovat, že v komunikaci mezi dvěmi aktory, které nemám pod kontrolou, nedojde k uváznutí. Přičemž samozřejmě se může jednat i o různé komunikace. Jednou je to ok -> ok, jindy done -> ok -> ok -> done... etc.

Ja sem tim myslel to, ze chovani toho aktoru by bylo pokryto unit testem.
Kazdeho zvlast.

A tim ze odstranis tu "proste chybu". A k uvaznuti nedojde.

Re:Uváznutí v Aktor systému
« Odpověď #14 kdy: 16. 10. 2019, 18:18:56 »
Aktorům sice nehovím, ale nepomohlo by prostě vědě, co aktor A a B ve skutečnosti dělají? Protože obecně na to snad ani nemůže být odpověď.