Správičky 2 815 Blogy 948 Fórum 18 729

Prehľad diskusie

photo
Paralelne asynchronne metody
Liero
26. 3. 2018 10:16:31
photo
RE: Paralelne asynchronne metody
T
26. 3. 2018 12:26:48
photo
RE: Paralelne asynchronne metody
Liero
26. 3. 2018 13:42:13
photo
RE: Paralelne asynchronne metody
T
26. 3. 2018 18:08:09
photo
RE: Paralelne asynchronne metody
T
26. 3. 2018 18:15:12
photo
RE: Paralelne asynchronne metody
harrison314
26. 3. 2018 22:10:33
photo
RE: Paralelne asynchronne metody
Liero
27. 3. 2018 8:56:07
photo
RE: Paralelne asynchronne metody
Liero
27. 3. 2018 13:30:49
photo
RE: Paralelne asynchronne metody
harrison314
27. 3. 2018 15:41:15
photo
RE: Paralelne asynchronne metody
Liero
27. 3. 2018 16:54:10
photo
RE: Paralelne asynchronne metody
harrison314
27. 3. 2018 17:00:17
photo
RE: Paralelne asynchronne metody
T
28. 3. 2018 14:09:17
photo
RE: Paralelne asynchronne metody
T
28. 3. 2018 14:10:56
photo
RE: Paralelne asynchronne metody
T
28. 3. 2018 14:23:42
photo
RE: Paralelne asynchronne metody
felix102
5. 8. 2018 2:58:33

Paralelne asynchronne metody

photo
Liero
26. 3. 2018 10:16:31
Body: 9610
Najaktívnejší č.: 6

Paralelne asynchronne metody

Pomerne casto riesim takyto scenar:

Mam metodu Refresh, ktora zavola webservice a v databaze bud vytvori alebo updatne zaznam a vrati vysledok.

protected async Task<PersonInfo> Refresh(string email)
{
     var externalUser = await Fetch(email);
     var result = await db.People.Find(email);
     await Map(result, externalUser);
     return result;
}

 

no a ja by som chcel zabranit tomu, aby sa ta metoda Refresh volala paralelne viackrat s tymi istymi parametrami.

Samozrejme som si spravil vlastne riesenie s ConcurentDicionary<string, TaskCompletionSource<PersonInfo>(), kde pod emailom si ukladam prave prebiehajuce refreshy, ale zaujima ma, ci to uz nieje vyriesene nejakym patternom, alebo kniznicou

[Reakcia]

photo
T
26. 3. 2018 12:26:48
Body: 21430
Najaktívnejší č.: 2

RE: Paralelne asynchronne metody

Z toho popisu nie je jednoznacny use case(ani technicky ani businessovo), tazko radit.

 

Tomáš Zeman, MCSD.NET, MCPD

[Reakcia]

photo
Liero
26. 3. 2018 13:42:13
Body: 9610
Najaktívnejší č.: 6

RE: Paralelne asynchronne metody

Use case je, ze chcem zabranit aby sa jeden user refreshoval viackrat paralelne. Jednak kvoli performance ale hlavne kvoli tomu aby sa nevytvoril viackrat.

Rozmyslal som aj nad DB tranzakciami, ale tomu sa chcem vyhnut kvoli performance. Problem je ze metoda Map moze chvilu trvat.

najtrivialnejsie riesenie je:

protected async Task<PersonInfo> Refresh(string email)

{
      var externalUser = await Fetch(email);
      semaphoreSlim.WaitAsync();
       try {       
         var result = await db.People.Find(email);
         await Map(result, externalUser);
         return result;
      } finally {
         semaphoreSlim.Release();
      }
}

ale to by som zbytocne lockoval globalne, nielen dany resouce.

dalsi level je:

protected async Task<PersonInfo> Refresh(string email)
{
//extenralUser = await Fetch(email); using (var locker = await ResourceLocker.Wait(email))
{ var externalUser = await Fetch(email);
var result = await db.People.Find(email); await Map(result, externalUser); return result; } }

to ale nezabrani volaniu servisu 2x po sebe, co je v tomto pripade tiez zbytocne. Ja mam na mysli skor nieco taketo:

 

protected async Task<PersonInfo> Refresh(string email)
{
    return  await ResourceLocker.RunOnce(email, async () => {
          var externalUser = await Fetch(email); 
          var result = await db.People.Find(email);
          await Map(result, externalUser);
          return result;
    }));
}

 

[Reakcia]

photo
T
26. 3. 2018 18:08:09
Body: 21430
Najaktívnejší č.: 2

RE: Paralelne asynchronne metody

OK, este stale nemam pocit, ze rozumiem uplne use case. Chcem zabranit, aby sa user vytvoril viac krat pre  pripad nejakeho utoku alebo nahodneho refresh.

Lockovanie na urovni db nie je az take drahe, ak ho robis mudro a je otazne, ci nie je drahsie to lockovanie, ktore robis Ty ;-)

Daj si tam unique key constraint.

Dalsia moznost ako to riesit a mat to lepsie pod kontrolou ako cez UQC je dovolit insert pri read commited tran isolation nakoniec skontrolovat, ci dany zaznam uz neexistuje(ako druhy) a ak ano urobit rollback.

Jedna dalsia moznost je pouzit queue (lepsie riesenie ako hento vyssie), ktore bude spracuvane sekvencne. (msmq)

Tomáš Zeman, MCSD.NET, MCPD

[Reakcia]

photo
T
26. 3. 2018 18:15:12
Body: 21430
Najaktívnejší č.: 2

RE: Paralelne asynchronne metody

...ci nie je lacnejsie....

Tomáš Zeman, MCSD.NET, MCPD

[Reakcia]


photo
Liero
27. 3. 2018 8:56:07
Body: 9610
Najaktívnejší č.: 6

RE: Paralelne asynchronne metody

Ok, takze asi by som mal spomenut, ze z tej tabulky sa cita velmi casto, refresh je asi 10x menej no I tak je tam celkom slusny traffic pocas peekov. Utok som neriesil, ale obcas sa stane, ze sa zavola refresh s tym istym emailom s odstupom cca 2 milisekund.

Unique constaraint v databaze neviem dat na `email` ani nic rozumne, v takom pripade by tento problem samozrejme neexistoval.

Co sa tyka DB tranzakcie, tak neviem aku by som mal zvolit. Ja totiz v tej tranzakcii najprv vytiahnem data (Person) a potom ho bud updatnem, alebo vytvorim ak neexistuje. Neviem ci sa da zvolit nejaky rozumny izolation level, ktory by nezabranil citaniu a zaroven by zabranil vytvoreniu 2 zaznamov s tym istym emailom. Ak ano, sem s nim.

Mne skor islo o nejaky C# pattern, lebo nieco podobne som casto riesil aj pri UWP, ked som potreboval napriklad zabranit inicializovaniu kamery 2x.

@harisson313: Redis mi netreba riesit, nemam distribuovany system

[Reakcia]

photo
Liero
27. 3. 2018 13:30:49
Body: 9610
Najaktívnejší č.: 6

RE: Paralelne asynchronne metody

@T: queue by asi poriesilo len to, ze namiesto z paralelnych requestov by som spravil sekvencne. V tomto pripade je ale vyhodnejsie vykonat dany refresh iba raz a vratit ten isty vysledok pre oba paralelne requesty.

[Reakcia]

photo
harrison314
27. 3. 2018 15:41:15
Body: 1185
Najaktívnejší č.: 23

RE: Paralelne asynchronne metody

@Liero: Pre co ti nevyhovuje klasika in memory chache, alebo optimistic concurency na urovni EF?

Pouzivas scenar, v ktorom ak sa nenajde PersonInfo tak sa vytvori nove?

[Reakcia]

photo
Liero
27. 3. 2018 16:54:10
Body: 9610
Najaktívnejší č.: 6

RE: Paralelne asynchronne metody

"Pouzivas scenar, v ktorom ak sa nenajde PersonInfo tak sa vytvori nove?"

ano

[Reakcia]

photo
harrison314
27. 3. 2018 17:00:17
Body: 1185
Najaktívnejší č.: 23

RE: Paralelne asynchronne metody

V tom pripade by mala stacit praobycajna databazova transkcia + cache.

Alebo este lepsie:

  1. Nacitas PersonInfo, ak sa najde tak ho vratis.
  2. Ak  ho nenajdes, tak vytvorist transkciu.
  3. Znovu nacitas PersonInfo, a ak ho nenajdes tak ho v tej istej transkacii vytvoris.

V podstate nieco ako double check pri implemetacii Singltonu.

[Reakcia]

photo
T
28. 3. 2018 14:09:17
Body: 21430
Najaktívnejší č.: 2

RE: Paralelne asynchronne metody

Ahoj, uz je trochu jasnejsi UC, takze queue je mimo.

 

"Ok, takze asi by som mal spomenut, ze z tej tabulky sa cita velmi casto, refresh je asi 10x menej no I tak je tam celkom slusny traffic pocas peekov. Utok som neriesil, ale obcas sa stane, ze sa zavola refresh s tym istym emailom s odstupom cca 2 milisekund."

Relacna db ma cache a lockovanie velmi efektivne, ak nemas nejaky naozaj dobre pomenovany dovod, nechaj to na nu.

"Unique constaraint v databaze neviem dat na `email` ani nic rozumne, v takom pripade by tento problem samozrejme neexistoval."

Ok, beriem ako vychodiko a fakt.

"Co sa tyka DB tranzakcie, tak neviem aku by som mal zvolit. Ja totiz v tej tranzakcii najprv vytiahnem data (Person) a potom ho bud updatnem, alebo vytvorim ak neexistuje."

Ak chces byt efektivny, tak vela moznosti nemas. OK, na to som ti napisal, ako sa to da riesit. Plus lockovanie si vies riadit aj v ramci zvolenej transaction isolation na urovni kazdeho statementu  - https://technet.microsoft.com/en-us/library/ms172398(v=sql.110).aspx

"Neviem ci sa da zvolit nejaky rozumny izolation level, ktory by nezabranil citaniu a zaroven by zabranil vytvoreniu 2 zaznamov s tym istym emailom. Ak ano, sem s nim."

sam o sebe iba serializable...a to nechceme. 

"Mne skor islo o nejaky C# pattern, lebo nieco podobne som casto riesil aj pri UWP, ked som potreboval napriklad zabranit inicializovaniu kamery 2x."

toto je velmi specificky problem a suvisi s data accessom, to co som Ti napisal je jeden z patternov (stare struktury ho dobre poznaju). Pri EF musis ale prejst na uroven sql statementov pri NH sa to da krasne vyriesit len z kodu.

"@harisson313: Redis mi netreba riesit, nemam distribuovany system"

To som sa chcel opytat aj ja, ze aky to ma zmysel, ked to zrejme nemas distribuovane

Tomáš Zeman, MCSD.NET, MCPD

[Reakcia]

photo
T
28. 3. 2018 14:10:56
Body: 21430
Najaktívnejší č.: 2

RE: Paralelne asynchronne metody

@liero: ten pattern je dobry napr. aj vtedy, ked potrebujes viacero UQC nad jednou tabulkou a chces jednoducho zistit, ktory bol presne poruseny pri MS SQL.

Tomáš Zeman, MCSD.NET, MCPD

[Reakcia]

photo
T
28. 3. 2018 14:23:42
Body: 21430
Najaktívnejší č.: 2

RE: Paralelne asynchronne metody

  1. Nacitas PersonInfo, ak sa najde tak ho vratis.
  2. Ak  ho nenajdes, tak vytvorist transkciu.
  3. Znovu nacitas PersonInfo, a ak ho nenajdes tak ho v tej istej transkacii vytvoris.

:-) Ano...akruat si zabudol napisat, pri akom tran isolation levely resp. akom lockovani toto funguje tak jednoducho :-) serializable?....

1. Vytvoris tranzakciu (RC za istych okolnosti by sa dal aj RU)

2. Selectnes zaznam 

3. Ak existuje vratis, koniec

4. Ak neexistuje Insertnes idealne s nejakym timestampom

5. Selectnes znova prvy(s najmensim TS), odpamatas si

6. nie je tvoj zmazes co si insertol alebo rollback

7. Vratis co si selectol

A este je otazka, ci mas snapshot zapnuty alebo nie.

 

Tomáš Zeman, MCSD.NET, MCPD

[Reakcia]

photo
felix102
5. 8. 2018 2:58:33
Body: 30
Najaktívnejší č.: 222

RE: Paralelne asynchronne metody

-quality passports, drivers licenses,SSD,SSN ID cards, stamps and other products for a number of countries like: Buy real Passports ,(www.scannablepassportandids.com)Visa,Driving License,IDs,SSN,marriage certificates Guaranteed passport,citizenship,cards,drivers license,diplomas,degrees,certificates service available. Tourist and business visa services available to residents of all 50 states and all nationalities Worldwide. are unique producers of Authentic High Quality passports, Real Genuine Data Base Registered and unregistered Passports and other Citizenship documents. I can guarantee you a new Identity starting from a clean new genuine Birth Certificate, ID card, Drivers License,Passports, Social security card with SSN, credit files, and credit cards, school diplomas, school degrees all in an entirely new name issued and registered in the government database system.. We offer only original high USA, Australia, Belgium, Brazil, Canada, Italia, Finland, France, Germany, Israel, Mexico, Netherlands, South Africa, Spain, United Kingdom. Dubai(the emirates) and many more. gmail========scannabledocs@gmail.com Website====== www.scannablepassportandids.com WHATSAPP NUMBER ===== +44 7537 121433

[Reakcia]



Najaktívnejší užívatelia
1. 37775 b. photo vlko
2. 21430 b. photo T
3. 15955 b. photo spigi
4. 15450 b. photo Anonymous
5. 11120 b. photo dudok
6. 9610 b. photo Liero
7. 6910 b. photo siro
8. 6245 b. photo slavof
9. 5395 b. photo duracellko
10. 4640 b. photo xxxmatko