Event id vs timestamp¶
getNewEvents(event_last_id) - vrátí seznam událostí, které vznikly po výskytu události s identifikátorem event_last_id
problémy:¶
- nově připojený odběratel potřebuje, aby mu bylo přiděleno rozumné event_last_id (jinak bude stahovat ze serveru všechna hlášení od data spuštění serveru)
- klient se po výpadku může dostat do podobné situace, jako nově připojený klient
- klient (nově připojený nebo po výpadku) neví, o jaký užitečný objem dat server požádat (logicky může chtít např. data za poslední týden, ale v současné podobě nelze z pohledu klienta ani serveru stanovi "týden")
- výše uvedené nelze rozumně řešit pomocí varianty getNewEvents(timestamp). Hodnota timestamp ukazuje čas detekce události, nikoliv čas uploadu na server (getNewEvents("-3 dny") ve skutečnosti nevrací všechny události, které server posbíral za poslední 3 dny, ale události, u nichž ostatní organizace tvrdí, že se staly během posledních 3 dnů)
řešení 1)¶
- klient si udržuje event_last_id, které získal v rámci posledního úspěšně přijatého hlášení
- klient (nově zapojený nebo po výpadku) poběží v omezeném řežimu:
- po zapojení či výpadku je klient spuštěn jednorázově s parametrem -recovery (klient pak zavolá getNewEvents s parametrem -recovery).
- server vrátí klientovi nejvyšší event_last_id, které je právě v DB uloženo.
- klient tak "zapomene", že měl výpadek a pokračuje od aktuálního data (data zmeškaná v důsledku výpadku již klient neobdrží)
- výhoda: jednoznačná politika, klient vždy ví, která data obdržel a která ne (resp. neobdržel data za dobu výpadku)
- nevýhoda: zátěž serveru závisí na odpovědnosti klientů; zpětně nelze získat hlášení z minulosti
řešení 2)¶
- klient si udržuje event_last_id, které získal v rámci posledního úspěšně přijatého hlášení
- klient (nově zapojený nebo po výpadku) poběží stejně jako při běžném provozu:
- klient zavolá getNewEvents(event_last_id).
- server se pokusí odeslat klientovi všechna hlášení od event_last_id. Pokud však dávka překročí rozumnou hranici (treshold - nastaveno na serveru, např. 1000 hlášení), události nad treshold už odeslány nejsou
- klient si updatne event_last_id a nadále pokračuje v běžném provozu
- výhoda: jednoduchá implementace, omezena zátěž serveru, v rozumné míře lze získat i události z minulosti
- nevýhoda: nutno s rostoucím rozsahem služby a s přihlédnutím k softwarovám a hardwarovým nárokům upravovat hodnotu tresholdu
řešení 3)¶
- na serveru bude navíc uložen v DB i čas příjetí hlášení serverem (timestamp_received)
- po výpadku (nebo po připojení) klient nemusí stahovat všechna data, o která přišel, ale může požádat o hlášení například týden stará
- výhoda: lze získávat i události z minulosti
- nevýhoda: do DB přibývá další atribut (navíc částečně redundantní - časová posloupnost je uložena i v event_id)