Skip to content

Coordinator #47

@korczis

Description

@korczis

Features

  • Prevent Duplicate Work
  • Re-queue Work
    • Crashed Workers
    • Disconnected Workers
    • 429 Too many requests

Implementation

  • Do Not Use Couchbase for Sharing Global State
  • {crawler, processor, url} => {state, pid}

Braindump

sha({worker, processor, url}) => {state, timestamp}

state = requested | queued | done

scenare

  1. Process 1 chce nejakou praci, tak si rekne koordinatorovi.
    Ten zadny takovy zaznam nenajde, tak si ulozi requested a
    zacne process 1 monitorovat.
  2. Process 2 chce stejnou praci, tak si rekne koordinatorovi.
    Ten najde zaznam requested, tak si tam zadost prida a zatim neodpovida.
  3. Process 1 spadne. Koodinator najde zaznam requested (podle pidu, ktery spadnul)
    , najde v seznamu process 2, tak ho monitoruje a posle mu ok.
  4. Process 2 posle praci do rabbita a rekne koordinatorovi, ze queued.
    Koordinator pokud najde zaznam requested, tak vsem ve fronte cekajicich rekne
    ne - prace uz je v queue a vytvori zaznam queued
    Pozn.: Pokud worker spadne mezi tim, co poslal praci do rabbita a tim,
    ze posila koordinatorovi queued, koordinator smaze zaznam requested
    a pokud v te chvili nekdo pozada o stejnou praci, muze bezet 2x. Ale
    to je hodne mala pravdepodobnost (nema proc spadnout).
  5. Process 3 chce stejnou praci, ale koordinator rekne ne, protoze queued
  6. Worker 1 dostane z rabbita praci, kdyz spadne, rabbit to posle jinam
  7. Kdyz worker praci dodela:
    • ulozi praci do cauche
    • rekne koordinatorovi, je prace je done
    • udela ack na rabbit
      Pozn.: Pokud process spadne mezi done a ack do rabbita, rabbit necha praci
      znova spocitat. Ale to se opet bude stavat malokdy.

chovani koordinatora

  1. request
    • prace neexistuje -> ok
    • prace je requested -> zaradit do fronty cekajich v requested (pak obvykle vratit no)
    • prace je queued -> no
    • prace je done a neni uz "stary" -> no
    • prace je done, ale je to uz hodne davno -> ok (a chovani jako kdyby tam zadny zaznam nebyl)
    • koordinator spadne - requestor dostane vyjimku a nejak se s tim vyrovna,
      treba taky sam spadne (bud je to nejaky call z clienta, tak ho klient zopakuje,
      nebo je to job z rabbita a rabbit ho requeue)
  2. queue
    • nastavit tam zaznam queued, pokud je tam requested od stejneho pidu
    • vratit chybu, kdy tam neni nebo je tam cokoliv jineho - to je bud
      spatne pouziti, nebo koordinator mezi volanimi spadnul. S tim se pak
      musi nejak vyrovnat volajici - treba zkusit opet nejdriv reques
  3. done
    • nastavi done v jakemkoliv pripade

Obecne kdyz koordinator spadne, tak se proste prijde o stav a nektere vypocty se muzou spustit
vicekrat. Ale po case se to zase ustali...

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions