AE

Abdulhamid Eshmamatov

Dasturiy Ta'minot Muhandisi (Python) va Jamoa Rahbari
📍 Toshkent, O'zbekiston ✈️ @abdulhamidllll ✉️ abdulhamidhamidiy@gmail.com 🌐 abdulhamid.uz 💼 LinkedIn
Python Django Mikroservislar Jamoa Rahbari 5+ yillik tajriba

Ish Tajribasi

UZINFOCOM
Jamoa Rahbari
Noyabr 2023 — Hozir
● Joriy
  • 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.
DBM
Python Dasturchi
Sentyabr 2021 — Noyabr 2023
  • 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.
Frilanser
Python Dasturchi — Telegram Botlar & Veb
Mart 2021 — Sentyabr 2021
  • 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

Tillar va Freymvorklar
Python Django Django REST Framework Bash
Ma'lumotlar Bazalari
PostgreSQL ClickHouse Redis SQLite
Xabar Almashish va Async
Kafka Celery WebSockets
DevOps va Infratuzilma
Docker Nginx Linux MinIO ELK Grafana
Asboblar va Amaliyotlar
Git / GitHub / GitLab REST API SOLID OOP Algoritmlar va DS To'lovlar (Click, Payme) pandas NumPy

Ta'lim

O'zbekiston Milliy Universiteti
Bakalavr darajasi · Matematika
2021

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.