Sobes.tech
Middle+

/* Մեզ անհրաժեշտ է տվյալներ փոխանցել մի աղբյուրից մի սպառողի։ Աղբյուրն ապահովում է տվյալները փոքր խմբաքանակներով (~տասը գրառում), մինչդեռ սպառողը ավելի արդյունավետ է աշխատում մեծ խմբաքանակներով (~հազար գրառում): Իրական օրինակ է Kafka տիպի հերթերից տվյալների փոխանցումը Clickhouse տվյալների բազա: Աղբյուր: - Հավասարապես անսահմանափակ: - Աղբյուրը երբեք չի վերադարձնում ավելի քան MaxItems գրանցում մեկ Next կանչում: - Մի «սեսիա» (մեկ Pipe ֆունկցիայի կանչ) ընթացքում, աղբյուրը յուրաքանչյուր Next-ով վերադարձնում է նոր տվյալներ: - Սակայն, վերագործարկումից հետո, աղբյուրը սկսում է նախորդ «հաստատված» դիրքից, որը սահմանվում է cookie-ով: Այդ պատճառով, *յուրաքանչյուր* cookie արժեք, որը Next- ը վերադարձնում է, տվյալները պահելուց հետո, պետք է հաստատվի Commit կանչով, նույն հերթականությամբ, ինչպես դրանք վերադարձվել են Next-ով: Սպառող: - Չի կարող միաժամանակ ավելի քան MaxItems մշակել: Պահանջվում է իրականացնել func Pipe(p Producer, c Consumer) error ֆունկցիան, որը կարդում է տվյալները աղբյուրից, խմբավորում դրանք ոչ ավելի, քան MaxItems չափով բուֆերում և պահում է սպառողում, հետո հաստատում է առաջընթացը աղբյուրում: */ const MaxItems = 9999 type Producer interface { // Next վերադարձնում է: // - մի խմբաքանակ տարրեր, որոնք պետք է մշակվեն // - cookie, որը պետք է հաստատել, երբ աշխատանքը ավարտվի // - սխալ Next() (items []any, cookie int, err error) // Commit օգտագործվում է նշելու համար, որ տվյալների խմբաքանակը մշակված է Commit(cookie int) error } type Consumer interface { Process(items []any) error } func Pipe(p Producer, c Consumer) error { // TODO }