Po nejake dobe testovani jsem prisla na nejlepsi variantu zpracovani. Treba bude nekoho zajimat jake problemy ho muzou potkat.
Pracuju s postgresem a php. Diky php nemuzu pouzivat listen/notify, takze se porad musim dotazovat do db. Php sice ma fci na notify, ale ta se stejne porad dokola pta. Dalo by se vyresit dotazovanim z C, tam notify funguje bez problemu.
To je slabina c.1.
Dalsi vec je pamet viz
CYBERWOLF. Pouzivam na to knihovny, ktere si pri kazdem volani par bajtu seberou.
Kvuli viceprocesorovemu zpracovani musim volat jednotliva db volani samostatne (connect, query, close). Protoze close potomka by mi zavrel persistentni spojeni i pro hlavni pripojeni. Proste pamet se pri takovem volani zabira pomerne rychle.
Slabinu c.2 - pamet, jsem vyresila automatickym ukoncenim skriptu pri dosazeni urcite obsazene pameti. Skript se navic ukonci 10 sec pred kontrolou na nove spusteni (spousteni z cronu kazdou minutu), tim padem nemuze dojit k vypadku zpracovani (minuta uz je hodne).
Je to na freebsd a nemuzu uplne vyuzit signaly, protoze se tam zpracova vic signalu najednou a to pro moje ucely neni idealni. Na linuxu bych signaly nejspis vyuzila a mozna bych neresila centralni zpracovani pres db.
Takze si eviduju ukoly v db. Ukladam si pidy childu, ktere prijmou job a eviduji stavy, tak abych mohla zajistit vetsinou failover stavu. To vsechno pro napr. 4 procesy najednou (nastavitelne za "behu").
Navic skript si kontroluje, zda vsechny joby opravdu bezi. Kazdy job ma predpokladany cas, takze kontrola nastava az po danem case. Krom toho je u jobu nastavene jak moc kriticky je, zda stopnout cele zpracovani nebo to jen oznamit, ci proste ignorovat a jit dal. Nekriticky job se teoreticky muze pri prelomu proste smazat a udelat se jindy.
Pokud dojde k padu, jsem schopna opetovnym pustenim nedodelane ukoly znovu pustit a dozpracovat. Tady byla potreba kontrola na dvoji zpracovani (job se dela, nastava pad, job se v db dozpracoval a nedal vedet ridicimu zpracovani, opetovne pusteni, dozpracovani spadleho jobu, priznak ze job je jiz zpracovan, pad childu resp. rollback)
Na vsechno existuje planovac. Paradoxne existuje job na vytvoreni planu, ktery tvori ukoly :) Joby vytvari tak, aby se zpracovavaly pokud mozno rovnomerne a logicky s ohledem na logiku hry.
Joby maji v nastaveni priznak, ze muzou ci nemuzou byt soucasne pustene - nemuzou tak vzniknout situace jako "kdyz tam nic neni, vloz tam 1000 zaznamu" a ve vysledku se vytvorilo 2000 zaznamu, protoze se to najednou zpracovalo ve 2 procesech.
Vysledkem je histogram jobu. V budoucnu se pouzije statistika pro dalsi upravy za behu napr. prumerna delka pusteni bude upravovat limit pro kontroly bezicich jobu.
Timhle zpusobem zpracovani veci, ktere trvalo 20 minut se na 4 jadrech (atom, 2 cpu, 2 HT) dela presne 5 minut.