/*
Bir kaynaktan bir tüketiciye veri aktarmamız gerekiyor.
Kaynak, verileri küçük paketler halinde (~on kayıt) sağlar, oysa tüketici büyük paketlerle (~bin kayıt) daha verimli çalışır.
Gerçek bir örnek, Kafka türü kuyruklardan verileri Clickhouse veritabanına aktarmaktır.
Kaynak:
- Neredeyse sonsuz.
- Kaynak, bir Next çağrısında hiçbir zaman MaxItems'ten fazla kayıt döndürmez.
- Bir "oturum" (bir Pipe fonksiyon çağrısı) içinde, kaynak her Next çağrısında yeni veriler döndürür.
- Ancak, yeniden başlatmadan sonra, kaynak önceki "onaylanmış" konumdan, cookie ile belirlenen noktadan başlar.
Bu nedenle, Next'in döndürdüğü her cookie değeri, veriler alıcıya kaydedildikten sonra,
aynı sırayla Commit çağrısı ile onaylanmalıdır.
Alıcı:
- Aynı anda MaxItems'ten fazla işleyemez.
Gerekli: func Pipe(p Producer, c Consumer) error fonksiyonunu uygulamak,
kaynakdan veri okuyup, bunları MaxItems boyutunu aşmayan bir tamponda gruplamak ve alıcıya kaydetmek,
ve ardından kaynaktaki ilerlemeyi onaylamaktır.
*/
const MaxItems = 9999
type Producer interface {
// Next:
// - İşlenmek üzere bir paket döndürür
// - İşlem tamamlandıktan sonra onaylanacak cookie
// - Hata
Next() (items []any, cookie int, err error)
// Commit, veri paketini işlendi olarak işaretlemek için kullanılır
Commit(cookie int) error
}
type Consumer interface {
Process(items []any) error
}
func Pipe(p Producer, c Consumer) error {
// TODO
}