- Mikroservis marshrutlash uchun API Gateway va uchinchi tomon real vaqt integratsiyalari uchun webhook tizimlarini loyihaladim va yetkazib berdim.
- 20+ mikroservisga asoslangan arxitekturani loyihaladim va boshqardim.
- Kuniga millionlab xabarlarni samarali qayta ishlash uchun Kafka-ni hodisaga asoslangan arxitekturada joriy qildim.
- ClickHouse yordamida yuqori unumdor dashboardlar yaratdim — millionlab qatorlarga ega jadvallarda so'rovlar tezligini 100× oshirdim.
- Yuqori mavjudlik uchun Materialized Views, Indekslash va Replikatsiya bilan murakkab PostgreSQL so'rovlarini yaratdim va optimallashtirdim.
- Samarali CI/CD pipelinelar bilan Docker yordamida katta loyihalarni deploy qildim.
- Zenko va MinIO yordamida katta hajmli fayl saqlashni boshqardim, ma'lumotlar replikatsiyasini ta'minladim.
Ish Tajribasi
- Django va Django REST Framework yordamida Python ilovalarini yaratdim va qo'llab-quvvatladim.
- Samarali ma'lumotlar bazasi o'zaro ta'siri va ishlash optimallashtirish amaliyotlari bilan REST API'larni joriy qildim.
- Asinxron vazifalarni qayta ishlash va keshlash uchun Redis va Celery-ni qo'lladim.
- PostgreSQL backend xizmatlari bilan tizim integratsiya loyihalarida hamkorlik qildim.
- Ko'chmas mulk, xizmatlarni bron qilish va to'lov integratsiyalari uchun maxsus Telegram botlar ishlab chiqdim (Click, Payme).
- API'larni integratsiya qildim va loyihalarni VPS'da (Ubuntu, Nginx) deploy qildim.
Texnik Ko'nikmalar
Ta'lim
PostgreSQL Chuqur Tahlili
PostgreSQL Ishlash Mexanizmlari: Views, Indexes, VACUUM, Replikatsiya & EXPLAIN
UZINFOCOM'da 20+ mikroservis bo'ylab millionlab qatorli ma'lumotlar bazalarini boshqargan holda PostgreSQL bilan katta miqyosda ishlagan tajribam asosida — tizimlarni tez va ishonchli saqlash uchun ushbu asosiy xususiyatlardan kunlik foydalanaman. Quyida har birining amaliy tahlili.
VIEW — Virtual Jadval
VIEW — ma'lumotlar bazasida saqlangan nomlangan so'rov. U har safar murojaat etilganda asosiy SQL-ni bajaradi — keshlanmagan natija yo'q. Viewlar murakkab JOINlarni soddalashtirish, kirish nazoratini ta'minlash va qayta ishlatiladigan so'rov mantig'ini yaratish uchun ideal.
CREATE VIEW active_users AS
SELECT id, username, email
FROM users
WHERE is_active = TRUE;
Foydalanish holati: biznes mantig'ini kapsulalash; qo'shimcha disk maydoni ishlatilmaydi. View ga har bir so'rov SQL-ni qayta ishlatadi.
MATERIALIZED VIEW — Keshlanigan So'rov Natijalari
MATERIALIZED VIEW so'rov natijasini diskda fizik saqlaydi. Oddiy viewdan farqli,
u har murojaat etilganda qayta ishlamaydi — bu uni og'ir agregatsiyalar uchun keskin tezroq qiladi.
UZINFOCOM'da analitik dashboardlarda sekin so'rovlarni materialized viewlar bilan almashtirish orqali
so'rovlar tezligini 100× oshirdim.
Yechim: ma'lumotlar REFRESH MATERIALIZED VIEW bilan aniq yangilanishi kerak.
CREATE MATERIALIZED VIEW monthly_revenue AS
SELECT DATE_TRUNC('month', created_at) AS month,
SUM(amount) AS total
FROM orders
GROUP BY 1;
-- O'qishlarni bloklashsiz yangilash:
REFRESH MATERIALIZED VIEW CONCURRENTLY monthly_revenue;
Maslahat: yangilash paytida jadval blokirovkasini oldini olish uchun CONCURRENTLY dan foydalaning; materialized view da unique index talab qilinadi.
INDEX — Tezkor Qidirish
Indekslar PostgreSQL'ga butun jadvalni skanerlasdan qatorlarni topishga imkon beradi. Standart B-Tree indeksi tenglik va diapazon so'rovlarini boshqaradi. Boshqa turlar: GIN (to'liq matnli qidirish, JSONB), GiST (geometrik / diapazon turlari), BRIN (juda katta, jismonan tartiblangan jadvallar) va Hash (faqat tenglik).
-- Standart B-Tree
CREATE INDEX idx_orders_user ON orders(user_id);
-- Qisman indeks (faqat faol qatorlarni indekslash)
CREATE INDEX idx_active_orders ON orders(user_id)
WHERE status = 'active';
-- Kompozit indeks
CREATE INDEX idx_user_date ON orders(user_id, created_at DESC);
-- JSONB uchun GIN
CREATE INDEX idx_meta ON events USING GIN (metadata);
Ortiqcha indekslash yozishni sekinlashtiradi. Foydalanilmagan indekslarni pg_stat_user_indexes bilan tekshiring.
VACUUM — O'lik Tuple Tozalash
PostgreSQL MVCC (Ko'p Versiyali Bir Vaqtda Nazorat) dan foydalanadi: eski qator versiyalari (o'lik tuplelar)
UPDATE va
DELETE dan keyin diskda qoladi.
VACUUM bu joyni qaytarib oladi va ko'rinish xaritalarini yangilaydi.
VACUUM FULL jadvalni to'liq qayta yozadi (jadvalni bloklaydi — texnik xizmat oynalarisiz ishlab chiqarishda qo'llamang).
AUTOVACUUM buni avtomatik boshqaradi; ko'p yozish jadvallari uchun sozlang.
-- Standart vacuum (blokirovkasiz)
VACUUM orders;
-- Statistika yangilanishi bilan
VACUUM ANALYZE orders;
-- Bloatni tekshirish
SELECT relname, n_dead_tup, last_autovacuum
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC;
REPLIKATSIYA — Yuqori Mavjudlik
PostgreSQL Streaming Replikatsiya-ni (WAL loglarining fizik, bayt-bayt nusxasi) va Mantiqiy Replikatsiya-ni (qator darajasidagi o'zgarishlar, jadval-tanlov, o'zaro versiya) qo'llab-quvvatlaydi. UZINFOCOM'dagi ishlab chiqarish tizimlarida biz muhim yozish yo'llari uchun sinxron commit va analitikaga xizmat qiluvchi o'qish replikalari uchun asinxron bilan primary + standby sozlamasini ishlatamiz.
-- primary: postgresql.conf
wal_level = replica
max_wal_senders = 5
synchronous_standby_names = 'standby1'
-- standby: recovery.conf / postgresql.conf
primary_conninfo = 'host=primary port=5432 user=replicator'
hot_standby = on
-- Mantiqiy replikatsiya
CREATE PUBLICATION my_pub FOR TABLE orders, users;
CREATE SUBSCRIPTION my_sub
CONNECTION 'host=primary dbname=app user=replicator'
PUBLICATION my_pub;
Replikatsiya kechikishini kuzatish: SELECT * FROM pg_stat_replication;
EXPLAIN / EXPLAIN ANALYZE — So'rov Rejasini Tekshirish
EXPLAIN PostgreSQL foydalanadigan so'rov bajarish rejasini ko'rsatadi (taxminiy xarajatlar, qator soni, birlashma strategiyalari). EXPLAIN ANALYZE so'rovni haqiqatda bajaradi va haqiqiy vaqt ma'lumotlarini qo'shadi — sekin ketma-ket skanlar, yomon qator taxminlari yoki katta ma'lumot to'plamlaridagi nested looplarni aniqlash uchun muhim.
-- Faqat reja (ijro etmasdan)
EXPLAIN SELECT * FROM orders WHERE user_id = 42;
-- Reja + haqiqiy vaqtlar (so'rovni bajaradi)
EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT)
SELECT u.username, COUNT(o.id)
FROM users u
JOIN orders o ON o.user_id = u.id
GROUP BY u.username
ORDER BY 2 DESC;
Kuzatish kerak bo'lgan asosiy tugunlar: Seq Scan (indeks yetishmayaptimi?), Hash Join va Nested Loop, yuqori filterdan o'tkazilgan qatorlar. Rejalarni vizualizatsiya qilish uchun explain.dalibo.com-dan foydalaning.