Bosh sahifa Wiki Scatter-gather

Scatter-gather

Scatter-gather — bitta mantiqiy requestni bir nechta shard, replica yoki workerga parallel yuborib, kelgan natijalarni coordinator’da birlashtirish patterni. Scatter bosqichi ishni tarqatadi, gather bosqichi javoblarni merge qiladi. U parallelism beradi, ammo fan-out, tail latency va partial failure xarajatini oshiradi.

Query bajarilishi

Shard key berilmagan search barcha tegishli shardlarga yuborilishi mumkin. Har shard local filter va hisoblashni bajaradi. Coordinator countlarni qo‘shadi, guruhlarni birlashtiradi yoki sorted natijalardan global top-K hosil qiladi. Har sharddan barcha rowsni olish o‘rniga local top-K olish network hajmini kamaytiradi, lekin tie va sort semantikasi bir xil bo‘lishi kerak.

Aggregation distributive bo‘lsa, masalan sum yoki count, partial resultlar oson birlashadi. Median, distinct count yoki complex join ko‘proq state, sketch yoki ikkinchi exchange bosqichini talab qiladi.

Tail latency

Umumiy javob ko‘pincha eng sekin zarur shardni kutadi. Shard soni oshgani sari kam uchraydigan sekinliklardan kamida bittasiga duch kelish ehtimoli ko‘payadi. Timeout, per-shard deadline va cancellation propagation coordinator resursini himoya qiladi.

Hedged request faqat idempotent readlarda sekin replica o‘rniga boshqa nusxani sinashi mumkin. Uni cheksiz qo‘llash overload paytida trafficni yanada oshiradi.

Partial failure

Bir shard javob bermasa qat’iy query butun requestni xato qiladi. Search yoki observability tizimi incomplete natijani warning va missing shard ro‘yxati bilan qaytarishi mumkin. Product semantikasi partial result qabul qilinishini belgilaydi; billing summasida jim qisman natija xavfli.

Retry faqat muvaffaqiyatsiz shardlarga yo‘naltiriladi va request ID bilan deduplicate qilinadi. Coordinator javob bergach orphan subrequestlar bekor qilinmasa backendlar foydasiz ishlashni davom ettiradi.

Amplificationni boshqarish

Bitta client request yuz shardga aylansa connection, CPU va network amplification yuz beradi. Concurrency limit, admission control, result size cap va query cost budget qo‘yiladi. Cache common global queryni kamaytiradi.

Yaxshi shard key point queryni bitta shardga route qiladi. Materialized view, secondary index yoki pre-aggregation global savolni alohida data structurega aylantiradi. Monitoring fan-out width, eng sekin shard, bytes, timeout va coordinator memoryni o‘lchaydi; faqat client latency sababni ko‘rsatmaydi.

Pagination va tartiblash

Offset-based pagination har sharddan offset + limit element so‘rab, katta sahifalarda juda ko‘p ma’lumot tashishi mumkin. Global cursor oxirgi sort key va shard holatini saqlab, keyingi queryni davom ettiradi. Sort key unique bo‘lmasa teng qiymatlar uchun stable tie-breaker kerak, aks holda element takrorlanadi yoki tushib qoladi.

Shardlar bir xil snapshot nuqtasida o‘qilmasa gather natijasi vaqt jihatdan aralash bo‘ladi. Search uchun bu qabul qilinishi mumkin, moliyaviy report uchun esa distributed snapshot yoki oldindan materialized cut kerak. Coordinator memory limitdan oshsa partial results diskka spill qilishi yoki queryni rad etishi mumkin. Query planner estimated fan-out va result cardinality asosida admission control qarorini beradi.

Coordinatorning o‘zi horizontal scale qilinadi, ammo bir requestning merge state’i odatda bitta instancega tegishli. Juda katta query checkpoint yoki hierarchical gather bilan daraxt shaklida birlashtirilishi mumkin. Bu network hotspotni kamaytiradi, lekin failure va orderingni murakkablashtiradi.

Bog‘liq tushunchalar

Fan-out, Sharding, Shard key, Tail latency, Distributed query, Aggregation, Partial result, Coordinator