Jarayon orqali tugatgan katta hajmdagi migratsiya

Jarayon orqali tugatgan katta hajmdagi migratsiya

So'nggi loyiha doirasida tashqi tizimlardan kiruvchi katta hajmdagi ma'lumotlarni tizim ichidagi master jadvalga xavfsiz va tez o'tkazish (Migration) vazifasini bajardik. Bu jarayonda duch kelgan texnik cheklovlar va ularni PostgreSQL'ning Stored Procedure (saqlanayotgan jarayon) va optimizatsiya usullari orqali qanday hal qilganimizni batafsil arxitektura va amalga oshirish kodlari asosida baham ko'rmoqchimiz.

  1. Mavjud ilova (Java/Spring) darajasidagi partiyali ishlov berishning cheklovlari

Boshida tanish Java va Spring Boot muhitida partiya amalga oshirish usulini birinchi navbatda ko'rib chiqdik. Spring Batch kabi vositalardan foydalangan holda Chunk bo'yicha ma'lumotlarni bo'lib ishlov berish usuli ommalashgan. Biroq, arxitektura o'rganilgan sari quyidagi aniq cheklovlar e'tiborga olinmoqda.

1-1. Jiddiy tarmoq ortiqcha yuklari (Network Overhead)

Tashqi tizimdan kiruvchi o'n minglab, o'n millionlab ma'lumotlarni ko'rib chiqish va mavjud ma'lumotlar bilan solishtirish jarayonida WAS (Web Application Server) va DB o'rtasida tez-tez tarmoq aloqa (Round-Trip) yuz berib turdi. Tarmoq kengligini iste'mol qilishi va latensiya (Latency) tufayli umumiy ish vaqti kechikishi kutilmoqda.

1-2. WAS xotira yuklari va OOM (Out Of Memory) xavfi

Katta hajmdagi entitiylar (Entity) yoki DTO'larni Java xotirasiga (Heap) bir anda joylashtirganda, garbage collection (GC) yuklari keskin oshadi, natijada bir palak soat ichida java.lang.OutOfMemoryError yuzaga kelishi va butun dastur qulash xavfi paydo bo'ladi.

1-3. Ilova operatsiyalarining cheklovlari

Ma'lumotlarning har bir qatorida murakkab biznes mantiqlari (solishtirish, tasdiqlash, xaritalash) ilova aylanishi ichida bajarilayotganda, DB ichidagi indeks yoki operatsiya dvigatelidan maksimal darajada foydalana olmaymiz, bu esa migratsiya samaradorligini keskin pasayishiga olib keldi.

[Tanlangan yechim: PostgreSQL Stored Procedure]
Ushbu cheklovlarni yengish uchun, biz "ma'lumotlar mavjud bo'lgan joyda (DB) ichki mantiqni to'g'ridan-to'g'ri bajarish" xulosasiga keldik. PostgreSQL 11 versiyasidan boshlab qo'llab-quvvatlasha boshlagan Stored Procedurema'lum bir Function (funksiya)dan farqli o'laroq ichida aniq tranzaksiya nazorati (COMMIT, ROLLBACK) imkoniyatlariga ega. Buning orqali katta hajmdagi partiya ishlarida kommitlarni bo'lib bajarish orqali DB resurslarining (Undo, Lock va boshqalar) bosimini engillashtirib, ma'lumotlar yaxlitligini ta'minlash uchun optimum yechim sifatida tanlandi.

taqqoslash bo'yicha

WAS daraja ishlov berish (Java/Spring)

DB daraja ishlov berish (PostgreSQL Procedure)

ma'lumotlar ko'chirish

DB → WAS → DB (katta ko'chirish)

DB ichida tugatish (ko'chirishni minimallashtirish)

tarmoq yuklamasi

juda yuqori (row bo'yicha so'rov yoki katta yuborish)

juda past (procedura chaqirishi va natijalarni qabul qilish)

xotira boshqaruvi

WAS heap xotira bosimi (OOM xavfi)

DB bufer pool va umumiy xotira optimizatsiyasidan foydalanish

transaksiyani boshqarish

Spring @Transactional yoki navbatli transaksiya

proceduradagi har bir bosqich bo'yicha aniq COMMIT boshqaruvi

  1. Tizim arxitekturasi va ma'lumotlar oqimi

Umumiy ma'lumotlar pipelini 2 bosqichli tuzilma sifatida loyihalashtirilgan.

2-1. Staging bosqichi

Tashqi tizimlardan olingan Raw ma'lumotlarni vaqtincha yuklash jadvallariga (staging_table) bulk yuklaydi.

2-2. Migration bosqichi

Java dasturi parametrlar bilan PostgreSQL jarayonini chaqirganda, DB ichida staging_table va target_tableni taqqoslab, tahlil qilib, yakuniy master jadvaliga qayta ishlash va aks ettirish (Upsert/Update/Insert) ishlov beradi.

  1. Tatbiq jarayoni

Amaliyot ma'lumotlarni qayta ishlash va aks ettirishdan iborat PostgreSQL jarayoniva, uni chaqirib va ishlov natijasidagi yozuvlar sonini olish uchun Java dasturikodi bilan tashkil etiladi. Tushunishni osonlashtirish uchun murakkab biznes ustunlari soddalashtirilgan misol ma'lumotlar bilan almashtirilgan.

3-1. PostgreSQL jarayonini amalga oshirish

Vaqtincha yuklash jadvali (staging_table) ma'lumotlariga asoslanib, maqsadli jadval (target_table) yangilanish logikasi. WITH bandi (CTE) va IS DISTINCT FROM aynan so'zlarini ishlatib, o'zgarishlar bo'lgan ma'lumotlarni tanlab oladi va Bulk yangilash (Bulk Update)ni amalga oshiradi.

image1.png

3-2. Java (Spring) chaqiruv kodi amalga oshirish

JdbcTemplate asosidagi CallableStatement'den foydalangan holda protsedurani chaqirdik. IN parametrlarini uzatdik va protsedura ichida hisoblangan natijalarni (amalga oshirilgan son) OUT parametrlarla xavfsiz qaytarib, Map ob'ektiga o'zgartirdik.

image2.png
  1. Muammo yechimi tajribasi

4-1. Keraksiz yangilashni oldini olish: IS DISTINCT FROM'dan foydalanish

  • Muammo holati:Har doim katta hajmdagi ma'lumotlarni UPDATE so'rovi bilan yozishga majbur bo'lsak, o'zgartirishlar bo'lmagan yozuvlar ustida yozish jarayoni yuz beradi, bu esa keraksiz WAL (Write-Ahead Log) to'planishi va indeks samaradorligining pasayishiga olib keladi.

  • Yechim:PostgreSQL'dagi ROW() IS DISTINCT FROM ROW() sintaksisini qo'lladik. Bu usul NULL qiymat taqqoslashida yuz beradigan istisno holatlarni (masalan: NULL = NULL - bu False) oldini olish bilan birga, maqsadli maydonlar birortasi ham farq qilganda yangilashni amalga oshirish uchun filtrlaydi va samaradorlikni oshiradi.

4-2. Protsedura ichida aniq COMMIT nazorati

  • Muammo holati:Katta hajmli migratsiya paytida xato yuz berganda tiklash xavfi katta bo'ldi va bir katta tranzaksiyaga bog'lansa, DB resurslariga bosim kuchaydi.

  • Yechim:PostgreSQL Funktsiyasi o'rniga Procedureni qabul qilgan asosiy sababi bu. Har bir biznes bosqichi tugagach, protsedura ichida COMMIT; buyruqni aniq ko'rsatib, tizim resurslarini munosib tarzda bo'shatdik va bosqichma-bosqich ma'lumotlar integratsiyasini ta'minladik. Java tomonida ham conn.setAutoCommit(true) sozlamasi orqali protsedura ichidagi kommit boshqaruvini saqlab qoldik.

  1. Natijalar va xulosa

Stored Procedure markazli arxitekturaga o'tish natijasida, migratsiya samaradorlik ko'rsatkichlarida ajablantiruvchi yaxshilanishga erishildi.

5-1. Qayta ishlash tezligini yaxshilash

O'tgan Java dasturlari `Loop + Bulk Insert` shaklida ishlatilganda, umuman migratsiya bajarilish vaqti qisqardi.

5-2. Resurslarni optimallashtirish

Infratuzilma xarajatlari nuqtai nazaridan WASning CPU/Xotira egallash darajasi barqaror bo'lib, DB ichida samarali indeks skanerlash va minimal tupplar boshqarish tufayli disk I/O barqaror o'ng pastga qarab egri chiziqqa aylandi.

PYS

Site footer