/*
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
}