ОНОЛ 11

Микросервис Архитектур

ЛЕКЦ 11: МИКРОСЕРВИС АРХИТЕКТУР (Microservices Architecture)

Хичээлийн зорилго: Микросервис архитектурын суурь ойлголт, монолит vs микросервис ялгаа, сервис хоорондын харилцаа (REST, gRPC, Message Queue), API Gateway, Service Discovery, Circuit Breaker, Saga Pattern, Event-Driven Architecture, Docker + Kubernetes ашиглан микросервис deploy хийхийг эзэмшүүлэх.

Хамрах хүрээ: Monolith vs Microservices, Bounded Context (DDD), REST & gRPC, Synchronous & Asynchronous Communication, API Gateway, Service Registry (Eureka), Config Server, Circuit Breaker (Resilience4j), Saga Pattern, Event-Driven (Kafka), CQRS, Docker Compose, Kubernetes Deployment, Spring Cloud.



ХЭСЭГ 1: ОНОЛЫН СУУРЬ (Theory & Foundations)

1.1 Монолит архитектур гэж юу вэ?

💡 Зүйрлэл: Монолит = Нэг том байшин. Бүх өрөө (гал тогоо, унтлагын өрөө, оффис) НЭГ ДОТОР. Нэг хана нурвал → Бүх байшин нурна.

Монолит бүтэц:

┌─────────────────────────────────────────┐
│              MONOLITH APP               │
│                                         │
│  ┌──────────┐ ┌──────────┐ ┌─────────┐ │
│  │ Student  │ │ Teacher  │ │ Course  │ │
│  │ Module   │ │ Module   │ │ Module  │ │
│  └────┬─────┘ └────┬─────┘ └────┬────┘ │
│       │             │            │      │
│  ┌────▼─────────────▼────────────▼────┐ │
│  │         SHARED DATABASE            │ │
│  └────────────────────────────────────┘ │
│                                         │
│     1 WAR/JAR  →  1 Server  →  1 DB    │
└─────────────────────────────────────────┘

Монолитийн давуу ба сул талууд:

Давуу талСул тал
Хөгжүүлэхэд ХЯЛБАР (эхэнд)Том болоход НАРИЙСДАГ
Deploy хялбар (1 файл)Нэг module-д алдаа → БҮГД унана
Debug хялбарScale хэцүү (бүхэлдээ scale)
Transaction хялбарТехнологи солиход хэцүү
Тест хялбар (эхэнд)Build удаан (10+ мин)
Bag хүн ойлгоно100+ хөгжүүлэгч → Conflict

1.2 Микросервис архитектур гэж юу вэ?

💡 Зүйрлэл: Микросервис = Хотхоны тусдаа байшингууд. Байшин бүр бие даасан (өөрийн гал тогоо, ус, цахилгаан). Нэг байшин нурсан ч бусад нь зүгээр.

Микросервис бүтэц:

┌────────────┐  ┌────────────┐  ┌────────────┐
│  Student   │  │  Teacher   │  │  Course    │
│  Service   │  │  Service   │  │  Service   │
│            │  │            │  │            │
│  Port:8081 │  │  Port:8082 │  │  Port:8083 │
│  ┌──────┐  │  │  ┌──────┐  │  │  ┌──────┐  │
│  │ DB 1 │  │  │  │ DB 2 │  │  │  │ DB 3 │  │
│  └──────┘  │  │  └──────┘  │  │  └──────┘  │
└─────┬──────┘  └──────┬─────┘  └──────┬─────┘
      │                │               │
      └────────────────┼───────────────┘
                       │
              ┌────────▼────────┐
              │   API Gateway   │
              │   (Port: 8080)  │
              └────────┬────────┘
                       │
                  ┌────▼────┐
                  │ Client  │
                  └─────────┘

Микросервисийн давуу ба сул талууд:

Давуу талСул тал
Бие даасан DEPLOYНарийн түвэгтэй (distributed system)
Бие даасан SCALEСүлжээний latency
Технологи ЧӨЛӨӨТЭЙDistributed transaction хэцүү
Баг бие даасан ажилланаМониторинг НАРИЙН
Fault isolation (нэг унасан ч бусад ok)Debug хэцүү (олон сервис)
Build хурдан (сервис тус бүр)Operational complexity

1.3 Монолит vs Микросервис — Хэзээ аль нь тохирох вэ?

ШинжМонолитМикросервис
Багийн хэмжээ1-10 хөгжүүлэгч10+ хөгжүүлэгч (баг бүрт сервис)
Төслийн хэмжээЖижиг-дундТом, нарийн
TrafficБага-дундИх, тогтмолгүй
Deploy давтамжХоногт 1-2Өдөрт 10+ (сервис тус бүр)
ТехнологиНэг stackОлон stack (polyglot)
ScaleБосоо (vertical)Хэвтээ (horizontal, сервис тус бүр)
Эхлэх✅ Хялбар❌ Нарийн

⚠️ Чухал: "Монолит = Буруу" биш! Эхлэхдээ монолит → Том болсон бол → Микросервис рүү шилжих. "Start with monolith, evolve to microservices."


1.4 Bounded Context (Domain-Driven Design)

Bounded Context гэж юу вэ?

Сервис бүр ӨӨР ӨӨРИЙН домэйн (хүрээ)-г хариуцна. Нэг ойлголт өөр context-д ӨӨӨР утгатай.

┌─────────────────┐    ┌─────────────────┐
│  Student Context │    │  Payment Context │
│                  │    │                  │
│  Student:        │    │  Student:        │
│   - id           │    │   - id           │
│   - name         │    │   - accountId    │
│   - email        │    │   - balance      │
│   - gpa          │    │   - paymentHistory│
│   - department   │    │                  │
│                  │    │  "Student" гэхдээ │
│  "Student" гэхдээ│    │  төлбөрийн мэдээлэл│
│  сурлагын мэдээлэл│   │                  │
└─────────────────┘    └─────────────────┘

Сервис хуваах зарчим:

ЗарчимТайлбар
Single ResponsibilityСервис бүр НЭГ бизнес чиг үүрэг хариуцна
Loose CouplingСервисүүд бие биенээсээ ХАМААРАЛГҮЙ
High CohesionХамааралтай функцүүд НЭГ сервист
Database per ServiceСервис бүр ӨӨРИЙН DB
Autonomous TeamsБаг бүр өөрийн сервисийг бүтнээр хариуцна

1.5 Сервис хоорондын харилцаа (Inter-Service Communication)

1.5.1 Synchronous (Синхрон) — REST, gRPC

Student Service ──── REST/HTTP ────► Teacher Service
       │                                    │
       │  GET /api/teachers/5               │
       │◄── {"id":5,"name":"Дорж"} ─────── │
       │                                    │
       │  Хүлээнэ... (blocking)             │

REST (HTTP):

// Student Service → Teacher Service дуудах
@Service
public class TeacherClient {

    private final RestClient restClient;

    public TeacherClient(RestClient.Builder builder) {
        this.restClient = builder.baseUrl("http://teacher-service:8082").build();
    }

    public TeacherResponse getTeacher(Long id) {
        return restClient.get()
            .uri("/api/teachers/{id}", id)
            .retrieve()
            .body(TeacherResponse.class);
    }
}

gRPC (бинар протокол, хурдан):

ШинжRESTgRPC
ФорматJSON (текст)Protocol Buffers (бинар)
ХурдДундХурдан (10x)
ContractOpenAPI (заавал биш).proto файл (ЗААВАЛ)
StreamingХязгаарлагдмалБүрэн (bi-directional)
Browser✅ Шууд❌ gRPC-Web хэрэгтэй
ХэрэглээPublic APIДотоод сервис хоорондын

1.5.2 Asynchronous (Асинхрон) — Message Queue

Student Service ──── Message ────► [Message Broker] ────► Notification Service
       │                           (Kafka/RabbitMQ)              │
       │  "Student enrolled"                          Email илгээх│
       │                                                         │
       │  Хүлээхгүй! (non-blocking)                              │

Message Queue ашиглах:

// Student Service → Event нийтлэх (Producer)
@Service
public class StudentService {

    private final KafkaTemplate<String, StudentEvent> kafkaTemplate;

    public StudentResponse enroll(EnrollRequest request) {
        Student student = studentRepository.save(toEntity(request));

        // Event нийтлэх — Хүлээхгүй!
        kafkaTemplate.send("student-events",
            new StudentEvent("ENROLLED", student.getId(), student.getName()));

        return toResponse(student);
    }
}

// Notification Service → Event хүлээн авах (Consumer)
@Service
public class NotificationConsumer {

    @KafkaListener(topics = "student-events", groupId = "notification-group")
    public void handleStudentEvent(StudentEvent event) {
        if ("ENROLLED".equals(event.type())) {
            emailService.sendWelcomeEmail(event.studentId());
        }
    }
}

Synchronous vs Asynchronous:

ШинжSynchronous (REST)Asynchronous (Message)
Хүлээх✅ Хариу хүлээнэ❌ Хүлээхгүй
CouplingХүчтэй (сервис ажиллаж байх)Сул (broker замдаа хадгална)
ХурдШууд хариуХожимдсон хариу
НайдвартайСервис унтарвал алдааBroker хадгалаж, дараа илгээнэ
ХэрэглээQuery, CRUDEvent, notification, long task

1.6 API Gateway

API Gateway гэж юу вэ?

Бүх client хүсэлт API Gateway-р дамжина. Gateway → Зөв сервис рүү чиглүүлнэ.

                    ┌─────────────────┐
                    │   API Gateway   │
Client ────────────►│                 │
                    │  /students/*    │──► Student Service
                    │  /teachers/*    │──► Teacher Service
                    │  /courses/*     │──► Course Service
                    │                 │
                    │  + Auth check   │
                    │  + Rate limit   │
                    │  + Load balance │
                    │  + Logging      │
                    └─────────────────┘

API Gateway-ийн үүрэг:

ҮүрэгТайлбар
RoutingURL-аар зөв сервис рүү чиглүүлэх
AuthenticationJWT token шалгах (нэг газраас)
Rate LimitingХүсэлтийн тоо хязгаарлах
Load BalancingОлон instance-д хуваарилах
Logging/MonitoringБүх хүсэлтийг лог бичих
Circuit BreakingУнасан сервис рүү хүсэлт зогсоох
# Spring Cloud Gateway — application.yml
spring:
  cloud:
    gateway:
      routes:
        - id: student-service
          uri: lb://student-service    # Load balanced
          predicates:
            - Path=/api/students/**
          filters:
            - StripPrefix=0

        - id: teacher-service
          uri: lb://teacher-service
          predicates:
            - Path=/api/teachers/**

1.7 Service Discovery (Сервис олох)

Service Discovery яагаад хэрэгтэй вэ?

Микросервис → Олон instance → IP хаяг ДИНАМИК → Хардкодлох БОЛОМЖГҮЙ.

Асуудал:
Student Service → Teacher Service (http://???.???.???.???:8082)
                                    IP хаяг мэдэхгүй!

Шийдэл — Service Registry:
┌─────────────────────────────────────────┐
│         Service Registry (Eureka)       │
│                                         │
│  student-service → 192.168.1.10:8081    │
│                  → 192.168.1.11:8081    │
│                                         │
│  teacher-service → 192.168.1.20:8082    │
│                  → 192.168.1.21:8082    │
│                                         │
│  course-service  → 192.168.1.30:8083    │
└─────────────────────────────────────────┘

Student Service → Registry: "teacher-service хаана байна?"
                → Registry: "192.168.1.20:8082"
                → Teacher Service руу хүсэлт
// Eureka Server
@SpringBootApplication
@EnableEurekaServer
public class RegistryApplication {
    public static void main(String[] args) {
        SpringApplication.run(RegistryApplication.class, args);
    }
}

// Student Service — Eureka Client
// application.yml
spring:
  application:
    name: student-service
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

1.8 Circuit Breaker Pattern

Circuit Breaker гэж юу вэ?

Сервис унтарсан бол → Дахин дахин дуудахгүй → Автомат таслах → Хэсэг хугацааны дараа дахин оролдох.

         ┌────────┐     ┌────────┐     ┌──────────┐
         │ CLOSED │────►│  OPEN  │────►│HALF-OPEN │
         │        │     │        │     │          │
         │ Normal │     │ Бүгдийг│     │ 1-2 хүсэлт│
         │ ажиллана│    │ блоклох│     │ оролдох   │
         └───┬────┘     └────┬───┘     └────┬─────┘
             │               │              │
         Алдаа >50%      Timeout         Амжилттай?
         → OPEN болох    хүлээх          → CLOSED
                                         Амжилтгүй?
                                         → OPEN
ТөлөвТайлбар
CLOSEDХэвийн ажиллана. Алдааг тоолно
OPENХүсэлт БЛОКЛОГДОНО. Fallback буцаана
HALF-OPENЦөөн хүсэлт оролдоно. OK бол → CLOSED
// Resilience4j — Circuit Breaker
@Service
public class TeacherClient {

    private final RestClient restClient;

    @CircuitBreaker(name = "teacherService", fallbackMethod = "getTeacherFallback")
    public TeacherResponse getTeacher(Long id) {
        return restClient.get()
            .uri("/api/teachers/{id}", id)
            .retrieve()
            .body(TeacherResponse.class);
    }

    // Teacher Service унтарсан бол → Fallback
    private TeacherResponse getTeacherFallback(Long id, Throwable ex) {
        return new TeacherResponse(id, "Unknown Teacher", "N/A");
    }
}
# application.yml — Resilience4j тохиргоо
resilience4j:
  circuitbreaker:
    instances:
      teacherService:
        sliding-window-size: 10          # Сүүлийн 10 хүсэлт шалгана
        failure-rate-threshold: 50       # 50% алдаа → OPEN
        wait-duration-in-open-state: 10s # 10 сек хүлээж → HALF-OPEN
        permitted-number-of-calls-in-half-open-state: 3

1.9 Saga Pattern (Distributed Transaction)

Асуудал: Distributed Transaction

Монолит:
@Transactional → Student INSERT + Payment INSERT + Notification
                 → Аль нэг fail → БҮГД ROLLBACK ✅

Микросервис:
Student Service → OK
Payment Service → FAIL
Notification    → ???
                → Student-г яаж буцаах?? 😱

Saga Pattern:

Сервис бүр ӨӨРИЙН transaction хийж, алдаа гарвал НӨХӨХ transaction (compensation) ажиллуулна.

Choreography Saga (Event-based):

Student Service                Payment Service             Notification
     │                              │                          │
     │── StudentCreated event ──────►                          │
     │                              │                          │
     │                    PaymentProcessed event ──────────────►
     │                              │                          │
     │                              │              NotificationSent event
     │                              │                          │
     │◄── PaymentFailed event ──── │                          │
     │                              │                          │
     │  Compensation:               │                          │
     │  StudentRollback()           │                          │
Saga төрөлТайлбарДавууСул
ChoreographyСервис бүр event-ээр харилцанаЭнгийн, сул холбоосTracking хэцүү
OrchestrationНэг Orchestrator удирданаДараалал тодорхойOrchestrator = Single point
// Choreography Saga — Student Service
@Service
public class StudentService {

    @Transactional
    public StudentResponse enroll(EnrollRequest request) {
        Student student = studentRepository.save(toEntity(request));

        // Event → Payment Service хүлээн авна
        kafkaTemplate.send("student-events",
            new StudentEvent("STUDENT_CREATED", student.getId()));

        return toResponse(student);
    }

    // Payment fail → Compensation
    @KafkaListener(topics = "payment-events", groupId = "student-group")
    public void handlePaymentEvent(PaymentEvent event) {
        if ("PAYMENT_FAILED".equals(event.type())) {
            studentRepository.deleteById(event.studentId());  // Rollback!
        }
    }
}

1.10 Event-Driven Architecture

Event-Driven гэж юу вэ?

Сервисүүд EVENT (үйл явдал)-аар харилцана. Сервис → Event нийтлэх → Сонирхсон сервисүүд → Event хүлээн авах.

┌──────────┐    Event    ┌──────────────┐    Event    ┌──────────────┐
│ Student  │────────────►│              │────────────►│ Notification │
│ Service  │  "enrolled" │    Kafka     │  "enrolled" │   Service    │
└──────────┘             │   Broker     │             └──────────────┘
                         │              │
┌──────────┐             │              │    Event    ┌──────────────┐
│ Payment  │◄────────────│              │────────────►│  Analytics   │
│ Service  │  "enrolled" │              │  "enrolled" │   Service    │
└──────────┘             └──────────────┘             └──────────────┘

Event Sourcing:

УламжлалтEvent Sourcing
Одоогийн STATE хадгалнаБүх EVENT хадгална
UPDATE students SET gpa=3.5Event: {type: GPA_UPDATED, gpa: 3.5}
Өмнөх утга алга болноБүх ТҮҮХ хадгалагдана
ХялбарReplay → State сэргээх

CQRS (Command Query Responsibility Segregation):

Command (бичих):
Client ──► Command Service ──► Write DB (PostgreSQL)
                │
                └──► Event ──► Read DB (Elasticsearch) шинэчлэх

Query (унших):
Client ──► Query Service ──► Read DB (Elasticsearch) ──► Хурдан хариу
ШинжCQRSУламжлалт
БичихWrite DB (normalize)Нэг DB
УншихRead DB (denormalize, хурдан)Нэг DB
ScaleТус тусдаа scaleХамтдаа scale
ХэрэглээИх traffic, нарийн queryЖижиг-дунд апп

1.11 Config Server (Тохиргооны сервер)

Config Server яагаад хэрэгтэй вэ?

Олон сервис → Тохиргоо (DB URL, API key) → НЭГ ГАЗРААС удирдах.

┌──────────────┐       ┌──────────────┐
│ Config Server│◄──────│  Git Repo    │
│              │       │ (config files)│
└──────┬───────┘       └──────────────┘
       │
       ├──────► Student Service (DB URL, JWT secret)
       ├──────► Teacher Service (DB URL, Kafka URL)
       └──────► Course Service  (DB URL, Redis URL)
# Config Server — bootstrap.yml
spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/myorg/config-repo
          default-label: main
# student-service.yml (Git repo дотор)
spring:
  datasource:
    url: jdbc:postgresql://db-host:5432/studentdb
    username: ${DB_USERNAME}
    password: ${DB_PASSWORD}

jwt:
  secret: ${JWT_SECRET}

teacher-service:
  url: http://teacher-service:8082

1.12 Distributed Tracing (Хянах)

Олон сервис → Хүсэлт хаана удааширсан?

Client → Gateway → Student Service → Teacher Service → DB
                        │                    │
                    100ms              3000ms ← УДААН!

Zipkin / Jaeger + Micrometer:

Trace ID: abc123 (нэг хүсэлтийн бүх алхам)
├── Span 1: Gateway (5ms)
├── Span 2: Student Service (100ms)
│   ├── Span 3: Teacher Service call (3000ms) ← BOTTLENECK!
│   └── Span 4: DB query (20ms)
└── Total: 3125ms
# application.yml — Micrometer Tracing
management:
  tracing:
    sampling:
      probability: 1.0   # 100% хүсэлт trace хийх (production-д 0.1)
  zipkin:
    tracing:
      endpoint: http://zipkin:9411/api/v2/spans

1.13 Database per Service

Сервис бүрт тусдаа DB:

┌───────────────┐   ┌───────────────┐   ┌───────────────┐
│Student Service│   │Teacher Service│   │Course Service │
│               │   │               │   │               │
│  PostgreSQL   │   │   MongoDB     │   │  PostgreSQL   │
│  students DB  │   │  teachers DB  │   │  courses DB   │
└───────────────┘   └───────────────┘   └───────────────┘
      ↑                    ↑                    ↑
   Polyglot Persistence: Сервис бүр ӨӨРТ ТОХИРОХ DB сонгоно
ЗарчимТайлбар
Тусдаа DBСервис бүр ӨӨРИЙН DB → Бие даасан deploy, scale
Шууд хандахгүйStudent Service → Teacher DB руу ШУУД хандахгүй!
API-аарTeacher мэдээлэл хэрэгтэй бол → Teacher Service API дуудах
PolyglotСервис бүр өөрт тохирох DB (SQL, NoSQL, Redis)

1.14 Kubernetes дээр Микросервис deploy

Kubernetes ойлголт:

┌─────────────────── Kubernetes Cluster ───────────────────┐
│                                                          │
│  ┌─── Node 1 ───────────┐  ┌─── Node 2 ───────────┐    │
│  │                       │  │                       │    │
│  │  ┌─── Pod ────────┐  │  │  ┌─── Pod ────────┐  │    │
│  │  │ Student Svc    │  │  │  │ Student Svc    │  │    │
│  │  │ (replica 1)    │  │  │  │ (replica 2)    │  │    │
│  │  └────────────────┘  │  │  └────────────────┘  │    │
│  │                       │  │                       │    │
│  │  ┌─── Pod ────────┐  │  │  ┌─── Pod ────────┐  │    │
│  │  │ Teacher Svc    │  │  │  │ Course Svc     │  │    │
│  │  │ (replica 1)    │  │  │  │ (replica 1)    │  │    │
│  │  └────────────────┘  │  │  └────────────────┘  │    │
│  │                       │  │                       │    │
│  └───────────────────────┘  └───────────────────────┘    │
│                                                          │
│  Service (K8s) = Load Balancer + DNS                     │
│  student-service:8081 → Pod replica 1 эсвэл 2            │
└──────────────────────────────────────────────────────────┘
# student-service-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: student-service
spec:
  replicas: 2
  selector:
    matchLabels:
      app: student-service
  template:
    metadata:
      labels:
        app: student-service
    spec:
      containers:
        - name: student-service
          image: myregistry/student-service:1.0.0
          ports:
            - containerPort: 8081
          env:
            - name: DB_URL
              valueFrom:
                secretKeyRef:
                  name: student-db-secret
                  key: url
          resources:
            requests:
              memory: "256Mi"
              cpu: "250m"
            limits:
              memory: "512Mi"
              cpu: "500m"
          livenessProbe:
            httpGet:
              path: /actuator/health
              port: 8081
            initialDelaySeconds: 30
            periodSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
  name: student-service
spec:
  selector:
    app: student-service
  ports:
    - port: 8081
      targetPort: 8081
  type: ClusterIP

1.15 Микросервис шилдэг туршлагууд (Best Practices)

#ЗарчимТайлбар
1Database per ServiceСервис бүр өөрийн DB
2API GatewayНэг entry point, auth, routing
3Service DiscoveryДинамик IP → Registry
4Circuit BreakerУнасан сервис → Автомат таслах
5Event-DrivenAsync харилцаа (Kafka, RabbitMQ)
6Config ServerТохиргоо нэг газраас
7Distributed TracingХүсэлтийг хянах (Zipkin)
8Health CheckСервис бүрт /actuator/health
9ContainerizationDocker → Kubernetes
10CI/CD per ServiceСервис бүрт тусдаа pipeline
11Backward CompatibilityAPI хувилбарлалт (v1, v2)
12Centralized LoggingБүх лог нэг газар (ELK Stack)
13IdempotencyДавтагдсан хүсэлт → Ижил үр дүн
14Correlation IDХүсэлт бүрт ID → Бүх сервисээр дагах
15Graceful ShutdownСервис зогсоход ажиллаж буй хүсэлт дуусгах


ХЭСЭГ 2: ТҮЛХҮҮР ҮГ БА МЭРГЭЖЛИЙН НЭР ТОМЬЁО (Keywords & Glossary)

#Англи нэр томьёоМонгол утгаДэлгэрэнгүй тайлбар
1MonolithМонолитБүх функц НЭГ апп дотор — 1 WAR/JAR, 1 DB.
2MicroserviceМикросервисБие даасан, жижиг сервисүүд — Тусдаа deploy, DB.
3API GatewayAPI гарцБүх хүсэлт дамжих НЭГ ЦЭГИЙГ удирдагч — Routing, Auth, Rate Limit.
4Service DiscoveryСервис олохСервисүүдийн IP хаягийг динамикаар олох — Eureka, Consul.
5Service RegistryСервис бүртгэлСервисүүдийн хаяг хадгалах газар — Eureka Server.
6Circuit BreakerХэлхээ таслагчУнасан сервис рүү хүсэлт таслах — Resilience4j.
7Saga PatternСага загварDistributed transaction-г event/compensation-аар зохицуулах.
8ChoreographyХореографиСервис бүр event-ээр бие даасан харилцах Saga.
9OrchestrationОркестрчилолНэг Orchestrator бүх алхмыг удирдах Saga.
10Event-DrivenҮйл явдалд суурилсанСервисүүд EVENT-ээр харилцана — Kafka, RabbitMQ.
11Event SourcingҮйл явдлын эх сурвалжState биш EVENT бүрийг хадгалах — Түүх бүрэн.
12CQRSКоманд-Асуулгын тусгаарлалтБичих (Command) ба Унших (Query) тусдаа DB/model.
13Message BrokerЗурвас зуучлагчСервис хооронд мэдээ дамжуулагч — Kafka, RabbitMQ.
14KafkaКафкаDistributed event streaming platform — LinkedIn.
15RabbitMQRabbitMQAMQP message broker — Дараалал удирдах.
16gRPCgRPCGoogle-ийн бинар RPC framework — REST-ээс хурдан.
17Protocol BuffersProtobufgRPC-ийн бинар серилизаци формат (.proto).
18RESTRESTHTTP + JSON ашигласан синхрон API.
19Bounded ContextХязгаарлагдсан контекстDDD — Сервисийн хариуцах домэйн хүрээ.
20DDDДомэйн хөтлөгдсөн дизайнDomain-Driven Design — Бизнес домайнаар сервис хуваах.
21Config ServerТохиргооны серверБүх сервисийн тохиргоог нэг газраас удирдах.
22Distributed TracingТархсан хянахХүсэлтийг олон сервисээр дагаж хянах — Zipkin, Jaeger.
23Trace IDХянах IDНэг хүсэлтийн бүх алхмыг холбох ID.
24SpanХэрчимTrace дотор нэг сервисийн ажлын нэгж.
25Load BalancingАчаалал тэнцвэржүүлэхХүсэлтийг олон instance-д тэнцүү хуваарилах.
26Health CheckЭрүүл мэнд шалгалтСервис ажиллаж буйг шалгах (/actuator/health).
27FallbackНөөц хариуСервис алдаа гаргавал буцаах ЗАЙ хариу.
28IdempotencyДавтагдах боломжИжил хүсэлт олон удаа → Ижил үр дүн (давхар үүсгэхгүй).
29Polyglot PersistenceОлон хэлт хадгалалтСервис бүр өөр DB (PostgreSQL, MongoDB, Redis).
30Sidecar PatternХажуугийн загварСервис хажууд нэмэлт container (logging, proxy).
31Service MeshСервис торСервис хоорондын харилцааг удирдагч дэд бүтэц — Istio.
32KubernetesКубернетисContainer orchestration platform — Pod, Deployment, Service.
33HelmХелмKubernetes-ийн package manager — Chart.
34Docker ComposeDocker ComposeОлон container-г нэг файлаар удирдах.
35Correlation IDХамааралын IDХүсэлт бүрт ID → Бүх сервисийн лог-д дагах.
36ELK StackELK StackElasticsearch + Logstash + Kibana — Centralized logging.
37Backward CompatibilityБуцаан нийцэмжAPI өөрчлөхөд хуучин client-д нөлөөлөхгүй (v1, v2).
38Graceful ShutdownЗөөлөн зогсолтСервис зогсоход ажиллаж буй хүсэлтийг дуусгаад зогсох.
39Spring CloudSpring CloudМикросервис framework — Gateway, Eureka, Config, Resilience4j.
40Strangler Fig PatternЗүлгэлтийн загварМонолитоос микросервис рүү аажмаар шилжих стратеги.