π ΠΠ°ΡΠ΅Π³ΠΎΡΠΈΡ: DevOps Essentials / ΠΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ° ΡΠΈΡΡΠ΅ΠΌ
π‘ Π¦Π΅Π»Ρ: ΠΠ°ΡΡΠΈΡΡΡΡ Π²ΡΡΠ²Π»ΡΡΡ ΡΠΊΡΡΡΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π² Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ΅ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠΎΠ² ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°ΡΡ ΠΊΠ°ΡΠΊΠ°Π΄Π½ΡΠ΅ ΡΠ±ΠΎΠΈ
π§ Π§Π΅ΠΌΡ Π²Ρ Π½Π°ΡΡΠΈΡΠ΅ΡΡ:
- ΠΠ½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠΎΠ² Π½Π° ΠΏΡΠ΅Π΄ΠΌΠ΅Ρ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ
- ΠΡΡΠ²Π»ΡΡΡ ΡΠΊΡΡΡΡΠ΅ ΡΠΎΡΠΊΠΈ ΠΎΡΠΊΠ°Π·Π° (Π΅Π΄ΠΈΠ½ΡΠ΅ ΡΠΎΡΠΊΠΈ ΠΎΡΠΊΠ°Π·Π°)
- ΠΠ»Π°ΡΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΏΠΎ ΡΡΠΎΠ²Π½Ρ ΠΊΡΠΈΡΠΈΡΠ½ΠΎΡΡΠΈ
- ΠΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ
- ΠΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌΠΈ
β οΈ ΠΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π½Π°Ρ ΠΎΠ΄ΠΊΠΈ Π² Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅:
- ΠΡΡ Redis - ΡΠΊΡΡΡΠ°Ρ ΡΠΎΡΠΊΠ° ΠΎΡΠΊΠ°Π·Π° Π΄Π»Ρ 80% ΡΠΈΡΡΠ΅ΠΌΡ
- Π‘Π΅ΡΠ²ΠΈΡ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ - ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠ°Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ Π΄Π»Ρ Π²ΡΠ΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ
- ΠΠ»Π°ΡΠ΅ΠΆΠ½ΡΠΉ ΡΠ΅ΡΠ²ΠΈΡ Π½Π°ΠΏΡΡΠΌΡΡ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΊΡΡΠ° Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ
- ΠΡΡΡΡΡΡΠ²ΠΈΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ Π²ΡΠΊΠ»ΡΡΠ°ΡΠ΅Π»Π΅ΠΉ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌΠΈ
πΊοΈ ΠΠ°ΡΡΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΡ
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ΅Π°Π»ΡΠ½ΡΡ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΠΎΠΉ ΠΊΠΎΠΌΠΌΠ΅ΡΡΠΈΠΈ Ρ Π²ΡΡΠ²Π»Π΅Π½Π½ΡΠΌΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ:
ΠΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½Π°Ρ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΠ°
ΠΠ΅Π³Π΅Π½Π΄Π°:
π‘ ΠΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΡ
- ΠΡΠΌ: ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΊΠΎΠ»Π΅ΡΠΎ ΠΌΡΡΠΈ ΠΈΠ»ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ
- ΠΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅: ΠΠ°ΠΆΠΌΠΈΡΠ΅ ΠΈ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΈΡΠ΅ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΡ
- ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ: ΠΠ°ΠΆΠΌΠΈΡΠ΅ Π½Π° Π»ΡΠ±ΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄Π΅ΡΠ°Π»Π΅ΠΉ
- ΠΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΡΡΡ: ΠΠ°ΠΆΠΌΠΈΡΠ΅ "β‘ ΠΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΡΡΡ" Π΄Π»Ρ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΊΠΈ
π¨ ΠΠ±Π½Π°ΡΡΠΆΠ΅Π½Π½ΡΠ΅ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠΈΡΠΊΠΈ
ΠΡΡΠ²Π»Π΅Π½Π½ΡΠ΅ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ
ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ | Π’ΠΈΠΏ ΡΠΈΡΠΊΠ° | ΠΠ»ΠΈΡΠ½ΠΈΠ΅ | ΠΠ΅ΡΠΎΡΡΠ½ΠΎΡΡΡ | ΠΡΠ΅ΠΌΡ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ | Π Π΅ΡΠ΅Π½ΠΈΠ΅ |
---|---|---|---|---|---|
ΠΡΡ Redis | ΠΠ΄ΠΈΠ½Π°Ρ ΡΠΎΡΠΊΠ° ΠΎΡΠΊΠ°Π·Π° | 80% ΡΠΈΡΡΠ΅ΠΌΡ | ΠΡΡΠΎΠΊΠ°Ρ | 4-10 ΡΠ°ΡΠΎΠ² | ΠΠ»Π°ΡΡΠ΅Ρ Redis + Sentinel |
Π‘Π΅ΡΠ²ΠΈΡ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ | ΠΡΠΈΡΠΈΡΠ΅ΡΠΊΠ°Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ | 100% ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ | Π‘ΡΠ΅Π΄Π½ΡΡ | 2-6 ΡΠ°ΡΠΎΠ² | Circuit Breaker + JWT fallback |
ΠΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ β ΠΠ»Π°ΡΠ΅ΠΆΠΈ | Π‘ΠΊΡΡΡΠ°Ρ ΡΠ²ΡΠ·Ρ ΡΠ΅ΡΠ΅Π· ΠΊΡΡ | ΠΠ°ΡΠΊΠ°Π΄Π½ΡΠ΅ ΡΠ±ΠΎΠΈ | ΠΡΡΠΎΠΊΠ°Ρ | 1-3 ΡΠ°ΡΠ° | ΠΠ·ΠΎΠ»ΡΡΠΈΡ ΠΊΡΡΠ΅ΠΉ ΠΏΠΎ ΠΎΠ±Π»Π°ΡΡΡΠΌ |
ΠΠ°Π·Π° Π΄Π°Π½Π½ΡΡ | Π£Π·ΠΊΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ | ΠΡΠ΅ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ | Π‘ΡΠ΅Π΄Π½ΡΡ | 30 ΠΌΠΈΠ½ - 2 ΡΠ°ΡΠ° | Read replicas + Connection pooling |
External API | ΠΠ½Π΅ΡΠ½ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ | 30% ΡΡΠ½ΠΊΡΠΈΠΉ | ΠΡΡΠΎΠΊΠ°Ρ | 15-60 ΠΌΠΈΠ½ | Retry policy + Local fallback |
π ΠΠ½Π°Π»ΠΈΠ· ΠΊΡΠΈΡΠΈΡΠ½ΠΎΡΡΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ²
π΄ ΠΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ (Π£ΡΠΎΠ²Π΅Π½Ρ 1)
Π‘Π΅ΡΠ²ΠΈΡ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ - ΡΠ΅Π½ΡΡΠ°Π»ΡΠ½Π°Ρ ΡΠΎΡΠΊΠ° Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ
- ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ: ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΡΠ΅ΡΠ²ΠΈΡ, Π±Π°Π·Π° Π΄Π°Π½Π½ΡΡ , ΠΊΡΡ Redis
- ΠΠ»ΠΈΡΠ½ΠΈΠ΅ ΡΠ±ΠΎΡ: 100% ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Π½Π΅ ΠΌΠΎΠ³ΡΡ Π²ΠΎΠΉΡΠΈ
- RTO: < 5 ΠΌΠΈΠ½ΡΡ (Recovery Time Objective)
- RPO: 0 (Recovery Point Objective - ΠΏΠΎΡΠ΅ΡΡ ΡΠ΅ΡΡΠΈΠΉ Π½Π΅Π΄ΠΎΠΏΡΡΡΠΈΠΌΠ°)
# ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° ΡΠ΅ΡΠ²ΠΈΡΠ° Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ
auth_service_sla:
Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΡ: 99.95%
Π²ΡΠ΅ΠΌΡ_ΠΎΡΠΊΠ»ΠΈΠΊΠ°: < 100ΠΌΡ
ΠΏΡΠΎΡΠ΅Π½Ρ_ΠΎΡΠΈΠ±ΠΎΠΊ: < 0.1%
Π°Π»Π΅ΡΡΡ:
- Π²ΡΡΠΎΠΊΠ°Ρ_Π·Π°Π΄Π΅ΡΠΆΠΊΠ°: > 500ΠΌΡ
- Π²ΡΠΏΠ»Π΅ΡΠΊ_ΠΎΡΠΈΠ±ΠΎΠΊ: > 1%
- ΡΠ±ΠΎΠΉ_ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ_redis
ΠΠ»Π°ΡΠ΅ΠΆΠ½ΡΠΉ ΡΠ΅ΡΠ²ΠΈΡ - ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠΈΠ½Π°Π½ΡΠΎΠ²ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ
- ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ: ΠΠ°Π·Π° Π΄Π°Π½Π½ΡΡ , ΠΊΡΡ Redis, ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ
- ΠΠ»ΠΈΡΠ½ΠΈΠ΅ ΡΠ±ΠΎΡ: ΠΠΎΡΠ΅ΡΡ Π΄Π΅Π½Π΅Π³, ΡΠ΅ΠΏΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΡΠ΅ΡΠ±
- Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅: PCI DSS Π£ΡΠΎΠ²Π΅Π½Ρ 1
- RTO: < 2 ΠΌΠΈΠ½ΡΡΡ
π ΠΡΠΎΡΠΈΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ (Π£ΡΠΎΠ²Π΅Π½Ρ 2)
ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΡΠ΅ΡΠ²ΠΈΡ - ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΠΈΠ»ΡΠΌΠΈ
- ΠΠ»Π°Π²Π½Π°Ρ Π΄Π΅Π³ΡΠ°Π΄Π°ΡΠΈΡ: ΠΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π±Π°Π·ΠΎΠ²ΡΡ Π΄Π°Π½Π½ΡΡ
- Π Π΅Π·Π΅ΡΠ²Π½ΡΠΉ ΠΏΠ»Π°Π½: Π Π΅ΠΆΠΈΠΌ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΈΠ· ΠΊΡΡΠ°
ΠΡΠ΅ΡΠ΅Π΄Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ - Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ
- ΠΠΎΡΡΠΎΡΠ½Π½ΠΎΠ΅ Ρ ΡΠ°Π½Π΅Π½ΠΈΠ΅: Π‘ΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π½Π° Π΄ΠΈΡΠΊ
- ΠΡΠ΅ΡΠ΅Π΄Ρ Π΄Π»Ρ ΠΎΡΠΊΠ°Π·ΠΎΠ²: ΠΠ»Ρ Π½Π΅ΡΠ΄Π°ΡΠ½ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ
π’ ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ (Π£ΡΠΎΠ²Π΅Π½Ρ 3)
- ΠΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ - Π½Π΅ Π²Π»ΠΈΡΠ΅Ρ Π½Π° Π±ΠΈΠ·Π½Π΅Ρ-Π»ΠΎΠ³ΠΈΠΊΡ
- Π£Π²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ - ΠΌΠΎΠΆΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π² ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅
π οΈ ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΈ ΠΏΠΎ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ΅
1. Π£ΡΡΡΠ°Π½Π΅Π½ΠΈΠ΅ Π΅Π΄ΠΈΠ½ΡΡ ΡΠΎΡΠ΅ΠΊ ΠΎΡΠΊΠ°Π·Π°
ΠΡΡ Redis β ΠΠ»Π°ΡΡΠ΅Ρ Redis
ΠΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½Π°Ρ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΠ°
ΠΠ΅Π³Π΅Π½Π΄Π°:
π‘ ΠΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΡ
- ΠΡΠΌ: ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΊΠΎΠ»Π΅ΡΠΎ ΠΌΡΡΠΈ ΠΈΠ»ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ
- ΠΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅: ΠΠ°ΠΆΠΌΠΈΡΠ΅ ΠΈ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΈΡΠ΅ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΡ
- ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ: ΠΠ°ΠΆΠΌΠΈΡΠ΅ Π½Π° Π»ΡΠ±ΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄Π΅ΡΠ°Π»Π΅ΠΉ
- ΠΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΡΡΡ: ΠΠ°ΠΆΠΌΠΈΡΠ΅ "β‘ ΠΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΡΡΡ" Π΄Π»Ρ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΊΠΈ
# docker-compose.yml Π΄Π»Ρ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° Redis
version: '3.8'
services:
redis-ΡΠ·Π΅Π»-1:
image: redis:7-alpine
command: redis-server --cluster-enabled yes --cluster-config-file nodes.conf
ports: ["7001:6379"]
volumes: ["redis-1:/data"]
redis-ΡΠ·Π΅Π»-2:
image: redis:7-alpine
command: redis-server --cluster-enabled yes --cluster-config-file nodes.conf
ports: ["7002:6379"]
volumes: ["redis-2:/data"]
redis-ΡΠ·Π΅Π»-3:
image: redis:7-alpine
command: redis-server --cluster-enabled yes --cluster-config-file nodes.conf
ports: ["7003:6379"]
volumes: ["redis-3:/data"]
volumes:
redis-1:
redis-2:
redis-3:
2. Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΠ°ΡΡΠ΅ΡΠ½Π° Β«ΠΠ²ΡΠΎΠ²ΡΠΊΠ»ΡΡΠ°ΡΠ΅Π»ΡΒ»
// ΠΡΠΈΠΌΠ΅Ρ Circuit Breaker Π΄Π»Ρ Go
package main
import (
"context"
"errors"
"time"
"sync"
)
type CircuitBreaker struct {
mutex sync.Mutex
state State
failureCount int
lastFailureTime time.Time
timeout time.Duration
maxFailures int
}
type State int
const (
Closed State = iota
Open
HalfOpen
)
func (cb *CircuitBreaker) Call(ctx context.Context, fn func() error) error {
cb.mutex.Lock()
defer cb.mutex.Unlock()
if cb.state == Open {
if time.Since(cb.lastFailureTime) > cb.timeout {
cb.state = HalfOpen
} else {
return errors.New("circuit breaker is open")
}
}
err := fn()
if err != nil {
cb.onFailure()
return err
}
cb.onSuccess()
return nil
}
func (cb *CircuitBreaker) onFailure() {
cb.failureCount++
cb.lastFailureTime = time.Now()
if cb.failureCount >= cb.maxFailures {
cb.state = Open
}
}
func (cb *CircuitBreaker) onSuccess() {
cb.failureCount = 0
cb.state = Closed
}
// ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΡΠ΅ΡΠ²ΠΈΡΠ΅ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ
func (s *AuthService) ValidateToken(token string) (*User, error) {
var user *User
var err error
circuitBreakerErr := s.redisCircuitBreaker.Call(context.Background(), func() error {
user, err = s.redis.GetUser(token)
return err
})
if circuitBreakerErr != nil {
// Fallback ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ
return s.database.GetUserByToken(token)
}
return user, err
}
3. ΠΠ·ΠΎΠ»ΡΡΠΈΡ ΠΊΡΡΠ΅ΠΉ ΠΏΠΎ ΠΏΡΠ΅Π΄ΠΌΠ΅ΡΠ½ΡΠΌ ΠΎΠ±Π»Π°ΡΡΡΠΌ
ΠΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½Π°Ρ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΠ°
ΠΠ΅Π³Π΅Π½Π΄Π°:
π‘ ΠΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΡ
- ΠΡΠΌ: ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΊΠΎΠ»Π΅ΡΠΎ ΠΌΡΡΠΈ ΠΈΠ»ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ
- ΠΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅: ΠΠ°ΠΆΠΌΠΈΡΠ΅ ΠΈ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΈΡΠ΅ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΡ
- ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ: ΠΠ°ΠΆΠΌΠΈΡΠ΅ Π½Π° Π»ΡΠ±ΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄Π΅ΡΠ°Π»Π΅ΠΉ
- ΠΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΡΡΡ: ΠΠ°ΠΆΠΌΠΈΡΠ΅ "β‘ ΠΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΡΡΡ" Π΄Π»Ρ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΊΠΈ
# ConfigMap Π΄Π»Ρ Kubernetes - ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΡΡΠ΅ΠΉ
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-config
data:
auth-redis.conf: |
# ΠΡΠ΄Π΅Π»ΡΠ½ΡΠΉ Redis Π΄Π»Ρ ΡΠ΅ΡΠ²ΠΈΡΠ° Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ
port 6379
databases 1
maxmemory 512mb
maxmemory-policy allkeys-lru
payment-redis.conf: |
# ΠΡΠ΄Π΅Π»ΡΠ½ΡΠΉ Redis Π΄Π»Ρ ΠΏΠ»Π°ΡΠ΅ΠΆΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΠ²ΠΈΡΠ°
port 6380
databases 1
maxmemory 1gb
maxmemory-policy noeviction # ΠΡΠΈΡΠΈΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π½Π΅ ΡΠ΄Π°Π»ΡΠ΅ΠΌ
π ΠΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌΠΈ
ΠΠ΅ΡΡΠΈΠΊΠΈ Prometheus Π΄Π»Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ
# prometheus-rules.yml
groups:
- name: microservices-dependencies
rules:
- alert: ΠΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΠ Π΅Π΄ΠΈΡΠΠ΅Π΄ΠΎΡΡΡΠΏΠ΅Π½
expr: redis_up{service="auth"} == 0
for: 30s
labels:
severity: ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΉ
component: ΡΠ΅ΡΠ²ΠΈΡ-Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ
annotations:
summary: "Π‘Π΅ΡΠ²ΠΈΡ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΏΠΎΡΠ΅ΡΡΠ» ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ Redis"
description: "ΠΡΠΈΡΠΈΡΠ΅ΡΠΊΠ°Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½Π° Π±ΠΎΠ»Π΅Π΅ 30 ΡΠ΅ΠΊΡΠ½Π΄"
- alert: ΠΠ»Π°ΡΠ΅ΠΆΠΈΠΡΡΠΎΠΊΠ°ΡΠΠ°Π΄Π΅ΡΠΆΠΊΠ°
expr: http_request_duration_seconds{service="payment"} > 0.5
for: 1m
labels:
severity: ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅
component: ΠΏΠ»Π°ΡΠ΅ΠΆΠ½ΡΠΉ-ΡΠ΅ΡΠ²ΠΈΡ
annotations:
summary: "ΠΠ»Π°ΡΠ΅ΠΆΠ½ΡΠΉ ΡΠ΅ΡΠ²ΠΈΡ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π²ΡΡΠΎΠΊΡΡ Π·Π°Π΄Π΅ΡΠΆΠΊΡ"
description: "ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Π»ΠΈΡΠ½ΠΈΠ΅ ΠΊΡΡΠ° Redis Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ"
- alert: Π ΠΈΡΠΊΠΠ°ΡΠΊΠ°Π΄Π½ΠΎΠ³ΠΎΠ‘Π±ΠΎΡ
expr: |
(redis_up{service="auth"} == 0) and
(redis_up{service="payment"} == 0)
for: 10s
labels:
severity: ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΉ
impact: ΠΊΠ°ΡΠΊΠ°Π΄Π½ΡΠΉ
annotations:
summary: "π¨ Π ΠΠ‘Π ΠΠΠ‘ΠΠΠΠΠΠΠ Π‘ΠΠΠ―"
description: "ΠΠ±ΡΠΈΠΉ Redis Π½Π΅Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π΄Π»Ρ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΡΠ΅ΡΠ²ΠΈΡΠΎΠ²"
ΠΠ°Π½Π΅Π»Ρ Grafana Π΄Π»Ρ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ½ΠΎΠ³ΠΎ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π°
ΠΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½Π°Ρ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΠ°
ΠΠ΅Π³Π΅Π½Π΄Π°:
π‘ ΠΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΡ
- ΠΡΠΌ: ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΊΠΎΠ»Π΅ΡΠΎ ΠΌΡΡΠΈ ΠΈΠ»ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ
- ΠΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅: ΠΠ°ΠΆΠΌΠΈΡΠ΅ ΠΈ ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΈΡΠ΅ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΡ
- ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ: ΠΠ°ΠΆΠΌΠΈΡΠ΅ Π½Π° Π»ΡΠ±ΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄Π΅ΡΠ°Π»Π΅ΠΉ
- ΠΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΡΡΡ: ΠΠ°ΠΆΠΌΠΈΡΠ΅ "β‘ ΠΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΡΡΡ" Π΄Π»Ρ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΊΠΈ
{
"dashboard": {
"title": "ποΈ ΠΠ΄ΠΎΡΠΎΠ²ΡΠ΅ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΡ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠΎΠ²",
"panels": [
{
"title": "Π‘ΡΠ°ΡΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ²",
"type": "graph",
"targets": [
{
"expr": "up{job=~\"auth-service|payment-service|user-service\"}",
"legendFormat": "{{job}}"
}
]
},
{
"title": "ΠΡΠΎΡΠ΅Π½Ρ ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠΉ Π² ΠΊΡΡ Redis ΠΏΠΎ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌ",
"type": "stat",
"targets": [
{
"expr": "redis_keyspace_hits_total / (redis_keyspace_hits_total + redis_keyspace_misses_total) * 100",
"legendFormat": "ΠΡΠΎΡΠ΅Π½Ρ ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠΉ %"
}
]
},
{
"title": "Π‘ΠΎΡΡΠΎΡΠ½ΠΈΡ Π°Π²ΡΠΎΠ²ΡΠΊΠ»ΡΡΠ°ΡΠ΅Π»Π΅ΠΉ",
"type": "table",
"targets": [
{
"expr": "circuit_breaker_state",
"format": "table"
}
]
}
]
}
}
π§ ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ Π°Π½Π°Π»ΠΈΠ·Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ
Π‘ΠΊΡΠΈΠΏΡ Π΄Π»Ρ Π°ΡΠ΄ΠΈΡΠ° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ
#!/bin/bash
# analyze-dependencies.sh
echo "π ΠΠ½Π°Π»ΠΈΠ· Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΡ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠΎΠ²"
echo "================================================="
# ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΡΠ΅ΡΠ²ΠΈΡΠΎΠ²
ΠΠ ΠΠ’ΠΠ§ΠΠ‘ΠΠΠ_Π‘ΠΠ ΠΠΠ‘Π«=("ΡΠ΅ΡΠ²ΠΈΡ-Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ" "ΠΏΠ»Π°ΡΠ΅ΠΆΠ½ΡΠΉ-ΡΠ΅ΡΠ²ΠΈΡ" "ΠΊΡΡ-redis" "Π±Π°Π·Π°-Π΄Π°Π½Π½ΡΡ
")
ΠΠ’ΠΠ ΠΠ§ΠΠ«Π_Π‘ΠΠ ΠΠΠ‘Π«=("ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ-ΡΠ΅ΡΠ²ΠΈΡ" "ΡΠ΅ΡΠ²ΠΈΡ-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ" "ΠΎΡΠ΅ΡΠ΅Π΄Ρ-ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ")
ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ_Π·Π΄ΠΎΡΠΎΠ²ΡΠ΅_ΡΠ΅ΡΠ²ΠΈΡΠ°() {
local ΡΠ΅ΡΠ²ΠΈΡ=$1
local Π°Π΄ΡΠ΅Ρ=$2
if curl -sf "$Π°Π΄ΡΠ΅Ρ/health" > /dev/null 2>&1; then
echo "β
$ΡΠ΅ΡΠ²ΠΈΡ - Π ΠΠΠΠ’ΠΠΠ’"
return 0
else
echo "β $ΡΠ΅ΡΠ²ΠΈΡ - ΠΠ’ΠΠΠ"
return 1
fi
}
echo "π ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΡΠ΅ΡΠ²ΠΈΡΠΎΠ²:"
ΠΎΡΠΊΠ°Π·Π°Π²ΡΠΈΠ΅_ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠ΅=0
for ΡΠ΅ΡΠ²ΠΈΡ in "${ΠΠ ΠΠ’ΠΠ§ΠΠ‘ΠΠΠ_Π‘ΠΠ ΠΠΠ‘Π«[@]}"; do
Π°Π΄ΡΠ΅Ρ="http://localhost:$(ΠΏΠΎΠ»ΡΡΠΈΡΡ_ΠΏΠΎΡΡ_ΡΠ΅ΡΠ²ΠΈΡΠ° $ΡΠ΅ΡΠ²ΠΈΡ)"
if ! ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ_Π·Π΄ΠΎΡΠΎΠ²ΡΠ΅_ΡΠ΅ΡΠ²ΠΈΡΠ° "$ΡΠ΅ΡΠ²ΠΈΡ" "$Π°Π΄ΡΠ΅Ρ"; then
((ΠΎΡΠΊΠ°Π·Π°Π²ΡΠΈΠ΅_ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠ΅++))
fi
done
echo ""
echo "π ΠΠ½Π°Π»ΠΈΠ· ΡΠΈΡΠΊΠΎΠ²:"
if [ $ΠΎΡΠΊΠ°Π·Π°Π²ΡΠΈΠ΅_ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ -gt 0 ]; then
echo "π¨ ΠΠ ΠΠ’ΠΠ§ΠΠ: $ΠΎΡΠΊΠ°Π·Π°Π²ΡΠΈΠ΅_ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½Ρ"
echo "β οΈ Π ΠΈΡΠΊ ΠΊΠ°ΡΠΊΠ°Π΄Π½ΠΎΠ³ΠΎ ΡΠ±ΠΎΡ: ΠΠ«Π‘ΠΠΠΠ"
# ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ
if ! ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ_Π·Π΄ΠΎΡΠΎΠ²ΡΠ΅_ΡΠ΅ΡΠ²ΠΈΡΠ° "ΠΊΡΡ-redis" "http://localhost:6379"; then
echo "π₯ ΠΡΡ Redis Π½Π΅Π΄ΠΎΡΡΡΠΏΠ΅Π½ - Π²Π»ΠΈΡΠ½ΠΈΠ΅ Π½Π° Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΈ ΠΏΠ»Π°ΡΠ΅ΠΆΠΈ"
echo "π§ Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ: ΠΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅Π·Π΅ΡΠ²Π½ΡΠΉ ΠΏΠ»Π°Π½ Ρ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½ΡΡ
"
fi
else
echo "β
ΠΡΠ΅ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ΅ΡΠ²ΠΈΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ"
fi
# ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΎΡΡΠ΅ΡΠ°
ΡΠΎΠ·Π΄Π°ΡΡ_ΠΎΡΡΠ΅Ρ_Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ() {
cat << EOF > ΠΎΡΡΠ΅Ρ-Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ.md
# π ΠΡΡΠ΅Ρ Π°Π½Π°Π»ΠΈΠ·Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ
**ΠΠ°ΡΠ°:** $(date)
**Π‘ΡΠ°ΡΡΡ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΡΠ΅ΡΠ²ΠΈΡΠΎΠ²:** $((${#ΠΠ ΠΠ’ΠΠ§ΠΠ‘ΠΠΠ_Π‘ΠΠ ΠΠΠ‘Π«[@]} - ΠΎΡΠΊΠ°Π·Π°Π²ΡΠΈΠ΅_ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠ΅))/${#ΠΠ ΠΠ’ΠΠ§ΠΠ‘ΠΠΠ_Π‘ΠΠ ΠΠΠ‘Π«[@]}
## π― Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΈ:
1. **ΠΡΡΠΎΠΊΠΈΠΉ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ:**
- ΠΠ½Π΅Π΄ΡΠΈΡΡ ΠΊΠ»Π°ΡΡΠ΅Ρ Redis Π΄Π»Ρ ΡΡΡΡΠ°Π½Π΅Π½ΠΈΡ Π΅Π΄ΠΈΠ½ΠΎΠΉ ΡΠΎΡΠΊΠΈ ΠΎΡΠΊΠ°Π·Π°
- ΠΠΎΠ±Π°Π²ΠΈΡΡ Π°Π²ΡΠΎΠ²ΡΠΊΠ»ΡΡΠ°ΡΠ΅Π»Ρ Π² ΡΠ΅ΡΠ²ΠΈΡ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ
- ΠΠ°ΡΡΡΠΎΠΈΡΡ ΠΈΠ·ΠΎΠ»ΡΡΠΈΡ ΠΊΡΡΠ΅ΠΉ ΠΏΠΎ ΠΏΡΠ΅Π΄ΠΌΠ΅ΡΠ½ΡΠΌ ΠΎΠ±Π»Π°ΡΡΡΠΌ
2. **Π‘ΡΠ΅Π΄Π½ΠΈΠΉ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ:**
- Π£Π»ΡΡΡΠΈΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌΠΈ
- ΠΠΎΠ±Π°Π²ΠΈΡΡ ΡΠ΅ΡΡΡ ΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΠΈ ΠΊ Ρ
Π°ΠΎΡΡ
- ΠΠ°ΡΡΡΠΎΠΈΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈ ΠΎΡΠΊΠ°Π·Π°Ρ
3. **ΠΠΎΠ»Π³ΠΎΡΡΠΎΡΠ½ΡΠ΅ ΡΠ΅Π»ΠΈ:**
- ΠΠ΅ΡΠ΅Ρ
ΠΎΠ΄ Π½Π° ΡΠ΅ΡΠ²ΠΈΡΠ½ΡΡ ΡΠ΅ΡΠΊΡ (Istio/Linkerd)
- ΠΠ½Π΅Π΄ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΡΡΠ΅ΡΠ½Π° Β«ΠΠ΅ΡΠ΅Π³ΠΎΡΠΎΠ΄ΠΊΠΈΒ»
- ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ
EOF
echo "π ΠΡΡΠ΅Ρ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ Π² ΠΎΡΡΠ΅Ρ-Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ.md"
}
ΡΠΎΠ·Π΄Π°ΡΡ_ΠΎΡΡΠ΅Ρ_Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ
π― ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠ°Π³ΠΈ
β Π§ΡΠΎ ΠΌΡ Π²ΡΡΠ²ΠΈΠ»ΠΈ
ΠΡΠΎΠ³ΠΎΠ²Π°Ρ ΡΠ²ΠΎΠ΄ΠΊΠ° Π²ΡΡΠ²Π»Π΅Π½Π½ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ
ΠΠ°ΡΠ΅Π³ΠΎΡΠΈΡ | ΠΠ°ΠΉΠ΄Π΅Π½ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌ | ΠΡΠΈΡΠΈΡΠ½ΠΎΡΡΡ | Π‘ΡΠ°ΡΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΡ |
---|---|---|---|
ΠΠ΄ΠΈΠ½ΡΠ΅ ΡΠΎΡΠΊΠΈ ΠΎΡΠΊΠ°Π·Π° | 1 (Redis) | ΠΡΠΈΡΠΈΡΠ΅ΡΠΊΠ°Ρ | π Π ΡΠ°Π±ΠΎΡΠ΅ |
Π‘ΠΊΡΡΡΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ | 3 | ΠΡΡΠΎΠΊΠ°Ρ | π ΠΠ°ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΎ |
ΠΡΡΡΡΡΡΠ²ΠΈΠ΅ fallback | 2 ΡΠ΅ΡΠ²ΠΈΡΠ° | ΠΡΡΠΎΠΊΠ°Ρ | π Π ΡΠ°Π±ΠΎΡΠ΅ |
ΠΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΠΏΡΠΎΠ±Π΅Π»Ρ | 5 ΠΌΠ΅ΡΡΠΈΠΊ | Π‘ΡΠ΅Π΄Π½ΡΡ | β Π Π΅ΡΠ΅Π½ΠΎ |
π ΠΠ»Π°Π½ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ
ΠΠΎΡΠΎΠΆΠ½Π°Ρ ΠΊΠ°ΡΡΠ° ΡΠ»ΡΡΡΠ΅Π½ΠΈΠΉ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ
ΠΡΠΈΠΎΡΠΈΡΠ΅Ρ | ΠΠ°Π΄Π°ΡΠ° | Π‘ΡΠΎΠΊ | ΠΠ»ΠΈΡΠ½ΠΈΠ΅ Π½Π° Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΡ | Π Π΅ΡΡΡΡΡ |
---|---|---|---|---|
π΄ Π0 | ΠΠ»Π°ΡΡΠ΅Ρ Redis + ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ | 1 Π½Π΅Π΄Π΅Π»Ρ | +99.9% β 99.95% | 2 ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΠ° |
π Π1 | ΠΠ²ΡΠΎΠ²ΡΠΊΠ»ΡΡΠ°ΡΠ΅Π»ΠΈ Π² auth/payment | 2 Π½Π΅Π΄Π΅Π»ΠΈ | +99.5% β 99.9% | 1 ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ |
π‘ Π2 | ΠΠ·ΠΎΠ»ΡΡΠΈΡ ΠΊΡΡΠ΅ΠΉ ΠΏΠΎ ΠΎΠ±Π»Π°ΡΡΡΠΌ | 3 Π½Π΅Π΄Π΅Π»ΠΈ | Π‘ΠΎΠΊΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π΄ΠΈΡΡΠ° ΡΠ±ΠΎΠ΅Π² Π½Π° 70% | 1 ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ |
π’ Π3 | ΠΠ½Π΅Π΄ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ²ΠΈΡΠ½ΠΎΠΉ ΡΠ΅ΡΠΊΠΈ | 2 ΠΌΠ΅ΡΡΡΠ° | ΠΠΎΠ»Π½Π°Ρ Π½Π°Π±Π»ΡΠ΄Π°Π΅ΠΌΠΎΡΡΡ + Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ | 3 ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΠ° |
π ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΡΡΠ΅Π½ΠΈΠ΅
- Building Microservices (Sam Newman)
- Release It! (Michael Nygard)
- Microservices Patterns (Chris Richardson)
π‘ ΠΠΎΠΌΠ½ΠΈΡΠ΅: ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠΎΠ² - ΡΡΠΎ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ΅ΡΠ²ΠΈΡΡ, Π½ΠΎ ΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π½ΠΈΠΌΠΈ. Π‘ΠΊΡΡΡΡΠ΅ ΡΠ²ΡΠ·ΠΈ ΠΌΠΎΠ³ΡΡ ΡΡΠ°ΡΡ ΠΏΡΠΈΡΠΈΠ½ΠΎΠΉ ΠΊΠ°ΡΠΊΠ°Π΄Π½ΡΡ ΡΠ±ΠΎΠ΅Π² Π² ΡΠ°ΠΌΡΠΉ Π½Π΅ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ!
π ΠΡΠΎΡ ΠΏΠΎΡΡ ΠΎΡΠ½ΠΎΠ²Π°Π½ Π½Π° ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ Π°Π½Π°Π»ΠΈΠ·Π΅ ΡΠ°Π±ΠΎΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΡ. ΠΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π±ΡΠ»ΠΈ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½Ρ ΠΈ ΡΡΡΡΠ°Π½Π΅Π½Ρ Π΄ΠΎ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΈΠ½ΡΠΈΠ΄Π΅Π½ΡΠΎΠ² Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΌΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Ρ ΠΊ Π°Π½Π°Π»ΠΈΠ·Ρ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ.