Complex Programmer


Гео и язык канала: Узбекистан, Узбекский
Категория: Карьера


👇👇👇
@complexprogrammeruzchannel
www.complexprogrammer.uz
💻🎮⌨️🖥️🛜👨‍💻

Связанные каналы

Гео и язык канала
Узбекистан, Узбекский
Категория
Карьера
Статистика
Фильтр публикаций


📌 Nginx: Reverse Proxy, Rate Limiting va SSL optimizatsiya

Nginx nima va nima uchun u kerak?

Nginx — bu shunchaki web-server emas, balki yuqori yuklamalarga chidamli Reverse Proxy va Load Balancer. Keling, tizimingizni qanday optimallashtirishni ko'rib chiqamiz.

1. Reverse Proxy
Bu sizning ilovangiz oldidagi 'qalqon'. Mijoz so'rovlari to'g'ridan-to'g'ri backend'ga emas, avval Nginx'ga keladi. U so'rovni qabul qiladi, qayta ishlaydi va backend'ga yo'naltiradi.
- Foydasi: Backend'ni yashiradi, xavfsizlikni oshiradi va statik fayllarni (rasm, CSS, JS) tezroq uzatadi.

2. Rate Limiting
DDOS hujumlar va tizimni ortiqcha yuklashdan himoya qilish uchun muhim vosita.
- limit_req_zone orqali ma'lum vaqt ichida bitta IP'dan keladigan so'rovlar sonini cheklash mumkin. Bu API'laringizni 'o'lib qolishdan' saqlaydi.

3. SSL/TLS Optimizatsiya
SSL sertifikatlarini backend'da emas, aynan Nginx'da tugatish (SSL Termination) samaraliroq.
- ssl_session_cache va ssl_session_tickets'ni yoqish orqali handshake jarayonini tezlashtiring.
- HTTP/2 ni faollashtiring, bu bir vaqtning o'zida ko'p so'rovlarni uzatishda tezlikni sezilarli oshiradi.

Qachon ishlatish kerak?
- Microservices arxitekturasida API Gateway sifatida.
- Statik kontentni tez yetkazib berish zarur bo'lganda.
- Load balancing qilishda.

Qachon ishlatmaslik kerak?
- Agar tizim juda kichik bo'lsa va faqat bitta oddiy script ishlasa (ortiqcha murakkablik).
- Agar sizga juda dinamik, real-time konfiguratsiya kerak bo'lsa (ba'zida HAProxy yoki Envoy mosroq bo'lishi mumkin).

Xulosa: Nginx — bu DevOps muhandisining 'shveytsariya pichog'i'. Uni to'g'ri sozlash serveringiz unumdorligini 2-3 barobar oshirishi mumkin.

#complex_programmer #architecture #devops #system_design

🚀 Kanal: @complexprogrammeruzchannel
💬 Guruh: @complexprogrammergroup


Quyidagi kod nimani chop etadi? def func(x, l=[]): l.append(x) return l print(func(1)) print(func(2))
Опрос
  •   [1], [2]
  •   [1], [1, 2]
  •   [1], [2, 1]
  •   Xatolik yuz beradi
43 голосов


Python'da quyidagi kod nima natija beradi? def func(x, l=[]): l.append(x) return l print(func(1)) print(func(2))
Опрос
  •   [1], [2]
  •   [1], [1, 2]
  •   Error
  •   [1], [2, 1]
34 голосов


📌 Asinxron navbatlar: Celery va RabbitMQ bilan uzoq vazifalarni boshqarish

Asinxron navbatlar (Task Queues) nima?

Bu tizim foydalanuvchi so'rovini kutib o'tirmasdan, og'ir vazifalarni (masalan, PDF generatsiya, email yuborish, ma'lumotlarni qayta ishlash) fon rejimida bajarish imkonini beradi.

Ishlash mexanizmi:
1. Producer: Sizning asosiy ilovangiz (Django/FastAPI). U vazifani navbatga tashlaydi va darhol foydalanuvchiga javob qaytaradi.
2. Broker (RabbitMQ): Vazifalarni saqlab turuvchi va ularni workerlarga yetkazib beruvchi vositachi.
3. Worker (Celery): Navbatdagi vazifalarni olib, ularni ketma-ket yoki parallel bajaruvchi alohida jarayonlar.

Qachon ishlatish kerak? (Pros)
- Foydalanuvchi interfeysi tezligini oshirish (response time).
- Tizimning barqarorligi: agar server yuklamasi oshsa, vazifalar navbatda kutib turadi va tizim qulab qolmaydi.
- Vazifalarni qayta urinish (retry logic) imkoniyati.

Qachon ishlatmaslik kerak? (Cons)
- Oddiy, tez bajariladigan operatsiyalar uchun (ortiqcha murakkablik).
- Agar vazifa darhol natijani talab qilsa (real-time).
- Infrastruktura xarajatlari (RabbitMQ va Celery workerlari uchun qo'shimcha resurs).

Amaliy maslahat:
Agarda tizimingizda Redis yoki RabbitMQ kabi brokerlar bo'lsa, Celery eng yaxshi tanlov. Kichik loyihalar uchun esa RQ (Redis Queue) yoki FastStream kabi yengilroq variantlarni ko'rib chiqishingiz mumkin.

#complex_programmer #architecture #devops #system_design

🚀 Kanal: @complexprogrammeruzchannel
💬 Guruh: @complexprogrammergroup


📌 Lazygit: Terminalda Git bilan tezkor ishlash uchun ajoyib TUI

Salom, Complex Programmer kanalining qadrli o'quvchilari! Bugun sizlar bilan dasturlash jarayonida vaqtingizni sezilarli darajada tejaydigan ajoyib vosita — Lazygit haqida gaplashamiz.

Git bilan ishlashda ko'pchiligimiz terminal buyruqlari (git add, git commit, git rebase va hokazo) yoki og'ir GUI dasturlardan foydalanamiz. Lekin nima uchun bu jarayonni yanada sodda, qulay va shinam qilish mumkin emas?

Lazygit — bu terminal uchun yaratilgan Git TUI (Terminal User Interface) mijozidir. U sichqoncha va klaviatura yordamida Git omboringizni to'liq boshqarish imkonini beradi. An'anaviy CLI (buyruqlar satri) dan ustunligi shundaki, siz barcha o'zgarishlarni, tarmoqlarni, konfliktlarni (merge conflicts) va loglarni bitta oynada, vizual tarzda ko'rib turasiz. Har safar uzun buyruqlarni yozish shart emas — barchasi bitta tugma bosish masofasida.

O'rnatish juda oson. Mac OS uchun Homebrew orqali quyidagicha o'rnatasiz:

brew install lazygit

Linux uchun esa:

sudo add-apt-repository pgrayson/lazygit
sudo apt update
sudo apt install lazygit

Ishlatish uchun shunchaki loyiha papkasiga kirib, quyidagi buyruqni yozasiz:

lazygit

Tamom! Endi strelka tugmalari yoki klaviatura yordamida commit'lar qilish, branch'larni almashtirish va stashes'larni boshqarish zavqiga ega bo'lasiz.

#complex_programmer #tools #productivity #developer

🚀 Kanal: @complexprogrammeruzchannel
💬 Guruh: @complexprogrammergroup


📌 uv: Python dunyosini larzaga solayotgan tezlik!

Dasturchilar, diqqat! Python loyihalarida 'pip install' kutib o'tirishdan charchadingizmi? Poetry yoki venv bilan ishlash sekinmi? Unda uv bilan tanishing!

uv — bu Rust tilida yozilgan, Python uchun ultra-tezkor paketlar menejeri. U pip, pip-tools va virtualenv vazifalarini o'zida birlashtiradi. Eng asosiysi: u boshqa vositalardan 10-100 barobar tezroq ishlaydi.

Nima uchun uv?
1. Tezlik: Keshdan foydalanishi evaziga kutubxonalarni chaqmoqdek tez o'rnatadi.
2. Birlashtirilgan yechim: Virtual muhitlar, paketlar va Python versiyalarini boshqarish endi bir joyda.
3. Moslik: Mavjud loyihalaringiz bilan muammosiz ishlaydi.

O'rnatish:
curl -LsSf https://astral.sh/uv/install.sh | sh

Ishlatish:
# Yangi loyiha yaratish
uv init
# Kutubxona o'rnatish
uv add requests
# Loyihani ishga tushirish
uv run main.py

Siz hali ham eski usulda davom etyapsizmi yoki 'uv'ga o'tishga tayyormisiz? Fikrlaringizni izohlarda yozib qoldiring!

#complex_programmer #tools #productivity #developer

🚀 Kanal: @complexprogrammeruzchannel
💬 Guruh: @complexprogrammergroup


📌 Redis Kesh Strategiyalari: Cache-Aside vs Write-Through

Redis Kesh Strategiyalari: Qaysi birini tanlash kerak?

Tizim arxitekturasida ma'lumotlar tezkorligini oshirish uchun keshlash muhim rol o'ynaydi. Bugun eng ko'p ishlatiladigan ikki yondashuvni ko'rib chiqamiz.

1. Cache-Aside (Lazy Loading)
Bu eng keng tarqalgan strategiya.
- Ishlash tartibi: Dastur avval Redis'dan ma'lumotni so'raydi. Agar topilmasa (cache miss), DB'dan olib, Redis'ga yozadi va javob beradi.
- Pros: Tizim bardoshli (Redis o'chib qolsa ham DB ishlayveradi), faqat kerakli ma'lumotlar saqlanadi.
- Cons: Birinchi so'rov sekinroq (cache miss), ma'lumot eskirib qolish xavfi bor.
- Qachon ishlatish: O'qish ko'p bo'lgan tizimlar uchun ideal.

2. Write-Through
Ma'lumotlar bir vaqtning o'zida ham DB, ham Redis'ga yoziladi.
- Ishlash tartibi: Dastur yozish amalini bajarayotganda keshni yangilaydi, kesh esa DB'ni yangilaydi (yoki aksincha).
- Pros: Ma'lumotlar doimo dolzarb (consistency yuqori), o'qish tezligi doimo maksimal.
- Cons: Yozish operatsiyalari sekinlashadi, resurs sarfi ortadi.
- Qachon ishlatish: Moliyaviy tizimlar yoki ma'lumotlar aniqligi kritik bo'lgan loyihalar uchun.

Xulosa:
- Agar tizimingizda Read operatsiyalari ustun bo'lsa - Cache-Aside.
- Agar Data Consistency (ma'lumotlar izchilligi) birinchi o'rinda bo'lsa - Write-Through tanlang.

#complex_programmer #architecture #devops #system_design

🚀 Kanal: @complexprogrammeruzchannel
💬 Guruh: @complexprogrammergroup


📌 Git: Rebase vs Merge — Toza tarix sirlari

Salom, Complex Programmer jamoasi!

Bugun backend olamidagi eng ko'p bahs-munozaralarga sabab bo'ladigan mavzu — Git tarixi va branch'larni birlashtirish strategiyalari haqida gaplashamiz.

Merge vs Rebase:
1. Merge: O'zgarishlarni yangi 'merge commit' bilan qo'shadi. Tarix saqlanib qoladi, lekin tarmoqlar (branches) bir-biriga chirmashib ketishi mumkin.
2. Rebase: Sening branch'ingdagi commit'larni asosiy branch'ning ustiga 'ko'chirib' qo'yadi. Natija — chiziqli va o'qilishi oson tarix.

Nega Rebase?
Katta loyihalarda chiziqli tarix xatolarni (bug) izlashda (git bisect) juda qo'l keladi. Ammo, push qilingan branch'larda hech qachon rebase qilmang! Bu boshqa dasturchilarning tarixini buzib yuboradi.

Amaliy misol:

# Feature branch'da ishlayapsan va main'dagi o'zgarishlarni olish kerak:

# Yomon usul (Merge):
git checkout feature-branch
git merge main

# Yaxshi usul (Rebase):
git checkout feature-branch
git rebase main

# Agar conflict chiqsa:
git add .
git rebase --continue


Xulosa:
- Mahalliy ishlanmalarda rebase dan foydalanib tarixni toza saqla.
- Shared branch'larda esa merge dan foydalanib tarix yaxlitligini ta'minla.

#complex_programmer #python #backend #cleancode

🚀 Kanal: @complexprogrammeruzchannel
💬 Guruh: @complexprogrammergroup


📌 PostgreSQL: Connection Pooling (PgBouncer) nima uchun kerak?

PostgreSQLda har bir yangi ulanish (connection) uchun server alohida process ajratadi. Bu jarayon RAM va CPU uchun qimmatga tushadi. Keling, PgBouncer nega kerakligini tushunamiz.

Muammo nimada?
1. PostgreSQL process-based modelda ishlaydi.
2. Har bir yangi ulanish taxminan 2-10MB RAM talab qiladi.
3. Ko'p sonli ulanishlar (masalan, 500+) serverni 'o'ldirib' qo'yishi mumkin.

PgBouncer nima qiladi?
Bu yengil proxy bo'lib, ulanishlarni boshqaradi:
- Pooling: Mijozlardan kelgan ulanishlarni ushlab turadi va ularni mavjud bazaviy ulanishlar (pool) orqali taqsimlaydi.
- Resurs tejash: Minglab ilova ulanishlarini atigi 20-50 ta real DB ulanishiga tushirib beradi.
- Tezlik: Yangi ulanish ochish o'rniga, tayyor ulanishni qayta ishlatadi.

Qachon ishlatish kerak?
- Ilovangiz mikroxizmatlar (microservices) arxitekturasida bo'lsa.
- Kutilmagan trafik o'sishlari (spikes) kuzatilsa.
- Serverda 'too many clients' xatoligi chiqsa.

Qachon ishlatmaslik kerak?
- Agar ulanishlar soni juda kam bo'lsa (masalan, 10-20 ta).
- Agar siz Prepared Statements yoki Transaction Pooling rejimida murakkab session-level amallar ishlatayotgan bo'lsangiz (PgBouncer cheklovlari bor).

Xulosa:
Yuqori yuklamali tizimlarda PgBouncer - bu majburiy qadam. U bazangizni ortiqcha yuklamalardan saqlaydi va barqarorlikni ta'minlaydi.

#complex_programmer #architecture #devops #system_design

🚀 Kanal: @complexprogrammeruzchannel
💬 Guruh: @complexprogrammergroup


📌 Lazygit: Terminalda Git bilan tezkor ishlash uchun ajoyib TUI

Salom dasturchilar! Bugun ish unumdorligini keskin oshiruvchi navbatdagi qurolimiz haqida gaplashamiz. Siz ham terminalda 'git add', 'git commit', 'git push' deb yozishdan charchadingizmi? Unda Lazygit bilan tanishing!

Lazygit bu - Git uchun terminal foydalanuvchi interfeysi (TUI). U terminalda Git buyruqlarini vizual va juda tezkor boshqarish imkonini beradi. An'anaviy Git CLI'dan farqli o'laroq, Lazygit sizga fayllarni tanlash, 'commit' qilish, 'merge' nizolarini hal etish va 'branch'lar o'rtasida o'tishni bir necha tugma bosish orqali amalga oshirishga yordam beradi.

Nima uchun Lazygit?
1. Vizual nazorat: Fayllardagi o'zgarishlarni terminalning o'zida ko'rib turasiz.
2. Tezlik: Sichqoncha kerak emas, hammasi klaviatura orqali boshqariladi.
3. Ishonchlilik: Murakkab Git buyruqlarini xatosiz bajarish osonroq.

O'rnatish (macOS uchun):
brew install lazygit

Ishlatish:
Terminalda loyiha papkasiga kirib shunchaki quyidagini yozing:
lazygit

Endi Git bilan ishlash zavqli va oson! Sinab ko'ring va natijalarni izohlarda yozib qoldiring.

#complex_programmer #tools #productivity #developer

🚀 Kanal: @complexprogrammeruzchannel
💬 Guruh: @complexprogrammergroup


Quyidagi kod natijasi nima bo'ladi? funcs = [lambda: i for i in range(3)] i = 10 print([f() for f in funcs])
Опрос
  •   [0, 1, 2]
  •   [2, 2, 2]
  •   [10, 10, 10]
  •   NameError
17 голосов


📌 Linux: Backend muhandisi uchun tarmoq va jarayonlar nazorati

Salom, Complex Programmer jamoasi! Backend muhandisi sifatida serverda muammo yuzaga kelganda, grafik interfeysga umid bog'lash — katta xato. Siz terminalda 'baliqdek' suzishingiz kerak.

Bugun dasturchi uchun eng muhim 2 ta jihat: Tarmoq (Network) va Jarayonlar (Processes).

1. Tarmoq: Qaysi port band yoki qaysi IP bilan aloqa uzilganini bilish uchun ss yoki netstat buyruqlarini o'zlashtiring. Masalan, 8080-portni nima band qilganini topish:
ss -tulpn | grep :8080

2. Jarayonlar: htop yoki ps aux orqali resurslarni iste'mol qilayotgan 'zombi' jarayonlarni aniqlash. Agarda Python dasturingiz osilib qolsa, uni kill -9 orqali to'xtatish kerak bo'ladi.

Agar siz Python orqali server holatini monitoring qilmoqchi bo'lsangiz, psutil kutubxonasidan foydalanish eng to'g'ri yechimdir:

import psutil

# CPU foydalanish foizini olish
print(f"CPU: {psutil.cpu_percent(interval=1)}%")

# Band bo'lgan portlarni tekshirish
for conn in psutil.net_connections():
if conn.laddr.port == 8080:
print(f"PID {conn.pid} 8080-portni band qildi")

Nega buni bilish kerak?
Bu ko'nikma sizga serverdagi 'Memory Leak' yoki 'Connection Timeout' kabi muammolarni bir necha soniyada aniqlash imkonini beradi. Tizimni tushunish — professional dasturchining asosiy quroli.

#complex_programmer #python #backend #cleancode

🚀 Kanal: @complexprogrammeruzchannel
💬 Guruh: @complexprogrammergroup


📌 Python: Pydantic v2 bilan ma'lumotlarni qat'iy tekshirish

Salom, hamkasblar! Bugun backend rivojlanishida ma'lumotlar yaxlitligini ta'minlashning eng samarali vositasi — Pydantic v2 haqida gaplashamiz.

Backend'da API orqali kelayotgan JSON ma'lumotlarini qo'lda tekshirish (if-else'lar bilan) — bu texnik qarzdorlikning boshlanishi. Pydantic v2 esa Rust tilida qayta yozilgani uchun v1 ga nisbatan 5-50 barobar tezroq ishlaydi.

Nega aynan Pydantic v2?
1. Type Safety: Ma'lumotlar turi noto'g'ri bo'lsa, avtomatik xatolik qaytaradi.
2. Validation: Murakkab mantiqiy tekshiruvlarni (masalan, email formati yoki sonlar diapazoni) osonlik bilan amalga oshiradi.
3. Performance: Yuqori yuklamali tizimlar uchun optimallashtirilgan.

Quyidagi misolda foydalanuvchi ma'lumotlarini qanday validatsiya qilishni ko'ramiz:

from pydantic import BaseModel, EmailStr, Field, field_validator

class UserSchema(BaseModel):
username: str = Field(min_length=3, max_length=20)
email: EmailStr
age: int = Field(gt=18, description="Yosh 18 dan katta bo'lishi shart")

@field_validator('username')
@classmethod
def username_must_be_alphanumeric(cls, v):
if not v.isalnum():
raise ValueError('Username faqat harf va raqamlardan iborat bo\'lishi kerak')
return v

# Ishlatilishi:
try:
user = UserSchema(username="dev_ali", email="ali@example.com", age=25)
print(user.model_dump_json())
except Exception as e:
print(e)

Bu yondashuv kodni yanada toza (clean code) qiladi va API'ga kiruvchi ma'lumotlar ustidan to'liq nazorat o'rnatishga yordam beradi. Loyihalaringizda aynan shunday deklarativ uslubdan foydalanishni maslahat beraman.

#complex_programmer #python #backend #cleancode

🚀 Kanal: @complexprogrammeruzchannel
💬 Guruh: @complexprogrammergroup


📌 Git: Rebase vs Merge — Tarixni toza saqlash san'ati

Senior Backend muhandisi sifatida ko'p kuzatadigan xato — bu tartibsiz git tarixi. Har bir kichik commit bilan 'merge' qilingan tarmoqlar loyiha tarixini o'qib bo'lmas holga keltiradi.

Merge vs Rebase:
1. Merge: O'zgarishlarni birlashtiradi va 'merge commit' hosil qiladi. Tarix saqlanib qoladi, lekin chiziqlar juda ko'payib ketadi.
2. Rebase: O'zgarishlaringizni yangi bazaga ko'chiradi. Bu chiziqli va toza tarixni ta'minlaydi.

Qoida: Agar o'zgarishlar faqat sizning lokal tarmog'ingizda bo'lsa, git rebase ishlating. Agar tarmoq allaqachon boshqalar bilan bo'lishilgan bo'lsa, git merge afzalroq.

Amaliy misol, kodni toza saqlash uchun commitlarni birlashtirish (interactive rebase):
# Oxirgi 3 ta commitni birlashtirish uchun:
git rebase -i HEAD~3

# Ochilgan oynada 'pick' so'zini 'squash' ga o'zgartiring
# Bu bir nechta kichik commitlarni bitta mantiqiy commitga aylantiradi.

Nima uchun kerak?
Toza git tarixi — bu jamoa uchun hujjat. Muammo yuz berganda git bisect orqali xatolikni topish osonlashadi va loyiha tarixi professional ko'rinishga ega bo'ladi.

#complex_programmer #python #backend #cleancode

🚀 Kanal: @complexprogrammeruzchannel
💬 Guruh: @complexprogrammergroup


📌 Python: contextmanager va resurslarni to'g'ri boshqarish

Salom, hamkasblar!

Backend dasturlashda eng muhim narsa bu — resurslarni (fayllar, ma'lumotlar bazasi ulanishlari, socketlar) to'g'ri boshqarishdir. Ko'pchilik try...finally bloklaridan foydalanadi, lekin Python'da buning ancha elegant yechimi bor: Context Manager.

Context manager'lar with operatori orqali resurslarni avtomatik ochish va yopishni ta'minlaydi. Bu orqali xatolik yuz berganda ham resurslar 'osilib qolmaydi' va xotira sizib chiqishining oldi olinadi.

Quyidagi misolda biz oddiy klass orqali qanday qilib o'z context manager'imizni yaratishni ko'ramiz:

class DatabaseConnection:
def __enter__(self):
print("Bazaga ulanish ochildi")
return self

def __exit__(self, exc_type, exc_val, exc_tb):
print("Bazaga ulanish yopildi")

# Ishlatilishi:
with DatabaseConnection() as db:
print("Ma'lumotlar ustida amallar bajarilmoqda...")


Nima uchun bu muhim?
1. Clean Code: Kod hajmi qisqaradi va o'qilishi osonlashadi.
2. Xavfsizlik: Xatolik yuz bersa ham, __exit__ metodi har doim chaqiriladi.
3. Resurs boshqaruvi: Ochilgan resursni yopishni unutib qo'yish xavfi yo'qoladi.

Professional kod yozish — bu faqat funksionallik emas, balki tizim barqarorligini ta'minlashdir.

#complex_programmer #python #backend #cleancode

🚀 Kanal: @complexprogrammeruzchannel
💬 Guruh: @complexprogrammergroup


📌 PostgreSQL: Nega bizga PgBouncer kerak?

PostgreSQL va Connection Pooling haqida qisqacha:

PostgreSQL har bir yangi ulanish (connection) uchun alohida 'process' yaratadi. Bu juda ko'p xotira (RAM) sarflaydi va server resurslarini tezda tugatib qo'yishi mumkin. Ayniqsa, mikroxizmatlar (microservices) ko'payganda, har bir instans bazaga ulanishga urinishi tizimni 'hang' qilib qo'yadi.

PgBouncer nima qiladi?
1. Connection Pooling: Ulanishlar guruhini boshqaradi. Ilovalardan kelgan ko'plab kichik ulanishlarni bazaga kam sonli doimiy ulanishlar orqali uzatadi.
2. Resurs tejash: Bazadagi 'process'lar sonini cheklab, RAMni tejaydi.
3. Tezkorlik: Yangi ulanish yaratish qimmat operatsiya, PgBouncer esa tayyor ulanishni qayta ishlatadi.

Qachon ishlatish kerak? (Pros)
- Ilovangizda ulanishlar soni juda ko'p bo'lsa.
- Serverda RAM yetishmovchiligi kuzatilsa.
- 'Too many connections' xatosi chiqsa.
- Serverless muhitda (AWS Lambda kabi) ishlaganda.

Qachon ishlatmaslik kerak? (Cons)
- Agar load juda kichik bo'lsa (qo'shimcha qatlam kerak emas).
- 'Prepared statements' yoki 'Listen/Notify' kabi maxsus xususiyatlardan foydalansangiz (PgBouncer'ni to'g'ri sozlash kerak, aks holda muammo bo'lishi mumkin).
- Murakkab tranzaksiyalar ('Transaction pooling' rejimida ba'zi cheklovlar bor).

Xulosa:
Yuqori yuklamali (high-load) tizimlarda PgBouncer — bu shartli 'best practice'. U sizning bazangizni ortiqcha ulanishlar bosimidan himoya qiladi.

#complex_programmer #architecture #devops #system_design

🚀 Kanal: @complexprogrammeruzchannel
💬 Guruh: @complexprogrammergroup


📌 FastAPI: BackgroundTasks va DI bilan arxitekturani kuchaytirish

Salom, Complex Programmer!

Bugun FastAPI'ning eng kuchli ikki jihati — BackgroundTasks va Dependency Injection (DI) haqida gaplashamiz.

Nega bu muhim?
1. BackgroundTasks: Foydalanuvchini kutishga majbur qilmasdan, og'ir jarayonlarni (email jo'natish, log tahlili) fon rejimida bajarish imkonini beradi. Bu API javob tezligini keskin oshiradi.
2. Dependency Injection: Kodni modulli va testbop qiladi. Biz biznes logikani endpoint'dan ajratib, uni qayta ishlatiladigan resurs sifatida boshqaramiz.

Quyida ikkalasini qanday integratsiya qilishni ko'ramiz:


from fastapi import FastAPI, BackgroundTasks, Depends

def send_email_task(email: str):
# Og'ir jarayon
print(f"Email yuborildi: {email}")

def get_db():
# DI orqali DB sessiyasini boshqarish
yield "db_connection"

app = FastAPI()

@app.post("/users/")
async def create_user(email: str, background_tasks: BackgroundTasks, db = Depends(get_db)):
background_tasks.add_task(send_email_task, email)
return {"message": "Foydalanuvchi yaratildi, email fon rejimida yuborilmoqda"}


Xulosa: Bu yondashuv orqali siz Clean Code tamoyillariga amal qilasiz va tizimingizni scalable (kengaytiriladigan) qilasiz. Har doim logikani endpoint ichiga ko'mib tashlamang, uni DI orqali injeksiya qiling!

#complex_programmer #python #backend #cleancode

🚀 Kanal: @complexprogrammeruzchannel
💬 Guruh: @complexprogrammergroup


Bu kod nima natija beradi? def func(a, b=[]): b.append(a) return b print(func(1)) print(func(2))
Опрос
  •   [1], [2]
  •   [1], [1, 2]
  •   [1], [2, 1]
  •   Xatolik yuz beradi
17 голосов


Bu kod nima natija beradi? def func(x, l=[]): l.append(x) return l print(func(1)) print(func(2))
Опрос
  •   [1], [2]
  •   [1], [1, 2]
  •   None, None
  •   Error
14 голосов


📌 Asinxron navbatlar: Celery va RabbitMQ bilan uzoq vazifalarni boshqarish

Asinxron navbatlar (Message Queues) nima uchun kerak?

Tasavvur qiling, foydalanuvchi saytda katta faylni yuklamoqda yoki murakkab hisobot generatsiya qilmoqda. Agar buni HTTP so'rov davomida bajarsangiz, server javob berish uchun 10-20 soniya kutib qoladi. Bu esa foydalanuvchi tajribasini (UX) o'ldiradi.

Qanday ishlaydi?
1. Task (Vazifa): Dastur qilinishi kerak bo'lgan ishni navbatga tashlaydi.
2. Broker (RabbitMQ): Bu xabarlarni saqlab turuvchi 'pochtachi'. U vazifani qabul qiladi va navbatga qo'yadi.
3. Worker (Celery): Navbatdagi vazifani oladi va uni fon rejimida, alohida jarayonda bajaradi.
4. Result Backend: Ish tugagach, natija saqlanadi (Redis yoki DB).

Qachon ishlatish kerak?
- Katta hajmdagi ma'lumotlarni qayta ishlash.
- Tashqi API'larga yuboriladigan so'rovlar (masalan, email yuborish).
- Rejalashtirilgan ishlar (Cron jobs).
- Murakkab tasvirlar yoki videolarni render qilish.

Qachon ishlatmaslik kerak?
- Agar vazifa millisekundlarda bajarilsa (ortiqcha murakkablik).
- Agar sizga real vaqtda (real-time) javob juda muhim bo'lsa (bu yerda WebSockets afzal).

Pros & Cons:
- Pros: Server resurslarini tejaydi, tizimni barqarorlashtiradi, vazifalarni qayta urinish (retry) imkoniyati.
- Cons: Infratuzilmani boshqarish murakkablashadi, 'race condition' kabi muammolar yuzaga kelishi mumkin.

Xulosa:
Celery + RabbitMQ - bu yuqori yuklamali loyihalar uchun oltin standart. Tizimingizni 'decoupling' (ajratish) qilish orqali uni yanada masshtablanuvchan qilasiz.

#complex_programmer #architecture #devops #system_design

🚀 Kanal: @complexprogrammeruzchannel
💬 Guruh: @complexprogrammergroup

Показано 20 последних публикаций.