Sobes.tech
Middle+

/* Musíme preniesť údaje z nejakého zdroja k nejakému spotrebiteľovi. Zdroj poskytuje údaje v malých dávkach (~desať záznamov), zatiaľ čo spotrebiteľ pracuje efektívnejšie s väčšími dávkami (~tisíc záznamov). Reálny príklad je prenos údajov z front typu Kafka do databázy Clickhouse. Zdroj: - Takmer nekonečný. - Zdroj nikdy nevráti viac ako MaxItems záznamov v jednom volaní Next. - V rámci jednej "seansy" (jedného volania funkcie Pipe) zdroj pri každom Next vracia nové údaje. - Avšak, po reštarte, zdroj začne od predchádzajúcej "potvrdenej" pozície, určené cookie. Preto *každá* hodnota cookie, ktorú Next vráti, po uložené údajov do príjemcu, musí byť potvrdená volaním Commit, v rovnakej poradí, v akom boli vrátené od Next. Prijímateľ: - Nemôže spracovať viac ako MaxItems naraz. Je potrebné implementovať funkciu func Pipe(p Producer, c Consumer) error, ktorá číta údaje zo zdroja, ich skupinu v bufferi veľkosti nie väčšej ako MaxItems a uloží ich do príjemcu, až po tom potvrdí pokrok v zdroji. */ const MaxItems = 9999 type Producer interface { // Next vracia: // - dávku položiek na spracovanie // - cookie na potvrdenie, keď je spracovanie dokončené // - chybu Next() (items []any, cookie int, err error) // Commit sa používa na označenie dávky dát ako spracovanej Commit(cookie int) error } type Consumer interface { Process(items []any) error } func Pipe(p Producer, c Consumer) error { // TODO }