Architecture
Dasturiy ta'minot arxitekturasi - tizimni qanday qurish, scale qilish va uzoq muddatda boshqarish.
Architecture nima?
Software Architecture - bu tizimning umumiy strukturasi va uning qismlarini tashkil qilish usuli. Bu "uy loyihasi" kabi - uy qurishdan oldin arxitektor rejani chizadi.
Arxitektura quyidagi savollarga javob beradi:
- Strukturasi - Qanday komponentlar bor va ular qanday joylashgan?
- Kommunikatsiya - Komponentlar qanday gaplashadi?
- Ma'lumot oqimi - Data qanday harakatlanadi?
- Deployment - Tizim qayerda va qanday joylashtiriladi?
Yaxshi arxitektura:
- Tizimni tushunishni osonlashtiradi
- O'zgartirish va kengaytirishni qulay qiladi
- Xatolarni izolyatsiya qiladi
- Performance va security ni ta'minlaydi
Arxitektura - bu shahar rejalashtirishiga o'xshash. Yo'llar (API), binolar (services), elektr tarmog'i (data flow) - barchasi uyg'un ishlashi kerak. Yomon rejalashtirish = transport tirbandligi (bottleneck).
Nega kerak?
Kichik loyihada arxitektura unchalik muhim emas. Lekin loyiha o'sgan sari arxitektura tanlovlari hal qiluvchi bo'ladi:
Scalability
100 foydalanuvchidan 1 millionga o'sish. Yomon arxitektura = to'liq qayta yozish.
Team scaling
5 kishilik jamoadan 50 kishilik jamoaga. Service boundaries = parallel ishlash.
Reliability
Bir qism ishdan chiqsa, butun tizim to'xtamasligi kerak. Fault isolation.
Time to market
Yangi feature'larni tez chiqarish. Loose coupling = independent deployment.
Twitter dastlab Ruby on Rails monolith edi. O'sish bilan "Fail Whale" ko'p paydo bo'ldi. Keyinchalik service'larga bo'lindi. Arxitektura tanlovlari yillar davomida ta'sir qiladi.
Asosiy tushunchalar
Monolith vs Microservices
Monolith
Barcha kod bitta deployment unit'da. Bitta database, bitta codebase.
Afzalliklari
- Oddiy development va debugging
- Bitta deploy
- Transaction'lar oson
- Kichik jamoa uchun ideal
Kamchiliklari
- Scale qilish qiyin
- Tight coupling
- Katta codebase = sekin build
Microservices
Mustaqil service'lar, har biri o'z database, alohida deploy.
Afzalliklari
- Independent scaling
- Technology diversity
- Fault isolation
- Parallel development
Kamchiliklari
- Murakkab infrastructure
- Network latency
- Distributed debugging
Arxitektura Patterns
Scaling Strategiyalari
- Vertical Scaling - Kuchliroq server (ko'proq CPU, RAM). Cheklangan.
- Horizontal Scaling - Ko'proq serverlar. Load balancer kerak.
- Database Scaling - Read replicas, sharding, caching.
- Caching - Redis, Memcached. Hot data memory'da.
- CDN - Static content foydalanuvchilarga yaqin.
Observability
Tizimni ichidan ko'rish - muammolarni tez topish uchun:
- Logging - Nima bo'ldi? (ELK Stack, Loki)
- Metrics - Qanday ishlayapti? (Prometheus, Grafana)
- Tracing - So'rov qayerdan qayerga? (Jaeger, Zipkin)
Amaliy jarayon (step-by-step)
Requirements tahlili
Functional va non-functional requirements. Nechta user? Qancha data? Uptime SLA? Latency talablari?
High-level design
Asosiy komponentlar diagrammasi. Client, Load Balancer, App Servers, Database, Cache - umumiy ko'rinish.
Component design
Har bir komponent ichki tuzilishi. API contracts, data models, dependencies.
Data design
Database tanlash, schema, indexing strategiyasi, caching layers.
Scalability planning
Bottleneck'larni aniqlash. Qaysi qismlar scale bo'ladi? Horizontal vs vertical?
Reliability planning
Failure scenarios. Agar X ishdan chiqsa nima bo'ladi? Fallback, circuit breaker, retry.
Security architecture
Authentication, authorization, encryption, network security, secrets management.
Documentation va ADR
Architecture Decision Records - nega bu tanlov qilindi? Kelajak uchun kontekst.
Eng ko'p uchraydigan xatolar
Startup bosqichida microservices tanlash - ortiqcha murakkablik. "Monolith first" yondashuvi to'g'ri. Microservices faqat aniq sabab bo'lganda.
Microservices deb nomlangan, lekin aslida tight coupling. Bitta service deploy bo'lsa, barchasi o'zgaradi. Bu monolith'dan ham yomon.
Database'ga har so'rov uchun murojaat - bottleneck. Ko'p o'qiladigan data cache'lanishi kerak.
Monitoring, logging, tracing yo'q - muammo bo'lganda "qorong'ida" qolasiz. Day 1 dan observability.
KISS (Keep It Simple, Stupid) prinsipi. Eng oddiy yechimdan boshlang, murakkablikni faqat kerak bo'lganda qo'shing. "You Aren't Gonna Need It" (YAGNI).
Best practices
- Monolith bilan boshlang, keyin kerak bo'lsa ajrating (Strangler Fig pattern)
- Domain-Driven Design (DDD) - bounded contexts bilan service chegaralarini aniqlang
- API versioning - breaking changes'siz evolution
- Circuit Breaker pattern - cascade failures'ni oldini olish
- Async communication - event/message queue'lar bilan loose coupling
- Health checks - /health endpoint har bir service'da
- Graceful degradation - critical bo'lmagan feature'lar o'chsa ham ishlash
- Infrastructure as Code - terraform, pulumi bilan reproducible infra
- Chaos engineering - production'da failure'larni simulyatsiya qiling
- Architecture Decision Records (ADR) - tanlovlarni hujjatlashtiring
Asboblar va texnologiyalar
Apache Kafka
Distributed event streaming. High throughput, durability, scalability.
Kubernetes
Container orchestration. Scaling, self-healing, rolling updates.
Prometheus + Grafana
Metrics collection va visualization. Alerting, dashboards.
Mini misol
E-commerce tizimi arxitekturasi (simplified):
# High-Level Architecture - E-Commerce Components: Client Layer: - Web App (React/Next.js) - Mobile App (React Native) - CDN (CloudFront/Cloudflare) API Gateway: - Kong / AWS API Gateway - Rate limiting, Auth, Routing - Request/Response transformation Services: - User Service (auth, profile) - Product Service (catalog, search) - Order Service (cart, checkout) - Payment Service (Stripe integration) - Notification Service (email, SMS, push) - Inventory Service (stock management) Data Layer: - PostgreSQL (User, Order data) - MongoDB (Product catalog) - Redis (Sessions, Cache) - Elasticsearch (Product search) Async Communication: - Kafka / RabbitMQ - Events: OrderPlaced, PaymentCompleted, etc. Observability: - Prometheus + Grafana (Metrics) - ELK Stack (Logs) - Jaeger (Tracing)
Circuit Breaker pattern (Node.js bilan):
const CircuitBreaker = require('opossum'); // External service call async function callPaymentService(orderId, amount) { const response = await fetch('https://payment-service/charge', { method: 'POST', body: JSON.stringify({ orderId, amount }) }); return response.json(); } // Circuit Breaker options const options = { timeout: 3000, // 3 sekund timeout errorThresholdPercentage: 50, // 50% xato = open resetTimeout: 30000 // 30 sek keyin retry }; // Circuit breaker yaratish const breaker = new CircuitBreaker(callPaymentService, options); // Fallback - circuit open bo'lganda breaker.fallback(() => ({ success: false, message: 'Payment service temporarily unavailable', retry: true })); // Events breaker.on('open', () => console.log('Circuit OPEN - failing fast')); breaker.on('halfOpen', () => console.log('Circuit HALF-OPEN - testing')); breaker.on('close', () => console.log('Circuit CLOSED - normal operation')); // Ishlatish async function processPayment(orderId, amount) { try { const result = await breaker.fire(orderId, amount); return result; } catch (err) { console.error('Payment failed:', err.message); // Queue for retry, notify user, etc. } }
Xavfsizlik va ishonchlilik
- Zero Trust Architecture - "never trust, always verify". Har bir request autentifikatsiya.
- mTLS (mutual TLS) - service'lar orasida shifrlangan va autentifikatsiyalangan aloqa.
- Secrets management - HashiCorp Vault, AWS Secrets Manager. Kodda credential yo'q.
- Network segmentation - public, private, database subnets. Firewall rules.
- Rate limiting va DDoS protection - API gateway darajasida.
- Audit logging - barcha critical operatsiyalar log'lanadi, immutable storage.
Ko'p so'raladigan savollar (FAQ)
Signallar: 1) Jamoa 10+ kishiga o'sdi va bir-biriga xalaqit bermoqda. 2) Alohida qismlarni mustaqil scale qilish kerak. 3) Deploy'lar juda sekin va xavfli. 4) Tech stack diversity kerak. Lekin: avval monolith ichida yaxshi boundary'lar (modullar) qiling.
Ideal holatlar: 1) Loose coupling zarur - service'lar bir-birini bilmasligi kerak. 2) Async processing - real-time javob shart emas. 3) Event sourcing - audit trail, replay kerak. 4) Pub/sub pattern - bir event ko'p subscriber'larga. Lekin: murakkablik qo'shadi, debugging qiyinlashadi.
Cache Aside (Lazy Loading): read da cache tekshiriladi, yo'q bo'lsa DB dan o'qiladi va cache'ga yoziladi. Write Through: yozish cache va DB ga bir vaqtda. TTL (Time To Live) o'rnating. Cache invalidation - eng qiyin muammo. "There are only two hard things in CS: cache invalidation and naming things."
Single entry point: 1) Authentication/Authorization bitta joyda. 2) Rate limiting, throttling. 3) Request routing. 4) Protocol transformation (REST to gRPC). 5) Response caching. 6) Monitoring, logging. Kong, AWS API Gateway, Nginx, Traefik - mashhur tanlovlar.
Distributed system uchta xususiyatdan faqat ikkitasini kafolat qila oladi: Consistency (barcha node'lar bir xil data ko'radi), Availability (har bir request javob oladi), Partition tolerance (network failure'da ham ishlaydi). Real tizimlar P ni tanlaydi (network ishonchsiz), keyin C va A o'rtasida tanlaydi.
So'rovlarni bir nechta server orasida taqsimlash. Algoritmlar: Round Robin (navbatma-navbat), Least Connections (eng kam band serverga), IP Hash (bir client har doim bir serverga). Health checks bilan nosoz serverlarni olib tashlash. L4 (TCP) yoki L7 (HTTP) load balancing.
Microservices best practice: har bir service o'z database'iga ega. Loose coupling, independent schema evolution. Lekin: distributed transactions qiyinlashadi (Saga pattern), data consistency murakkab. Shared database: oddiyroq, lekin tight coupling, schema change coordination kerak.
Distributed transaction'lar uchun pattern. Har bir service local transaction bajaradi va keyingi service'ga event/command yuboradi. Xato bo'lsa, compensating transactions (orqaga qaytarish) ishga tushadi. Orchestration (central coordinator) yoki Choreography (event-driven) usullari bor.