← Назад к вопросам

Находился ли последний проект в облаке

1.0 Junior🔥 141 комментариев
#Soft Skills и карьера

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Находился ли последний проект в облаке?

Да, полностью на облаке. Это была AWS инфраструктура для e-commerce платформы с масштабом в десятки миллионов запросов в день.

AWS архитектура проекта

Compute

EC2 для приложения

На prod: 3 EC2 instance (m5.2xlarge) в разных AZ
- Auto Scaling Group: 3-20 инстансов
- AMI с Java 17 + Spring Boot + Docker
- EBS volume для логов и локального кеша

Lambda для асинхронных операций

- Order processing (5-10 минут execution time)
- Image resizing (из S3 события)
- Email notifications (SQS → Lambda)
- Scheduled reports (EventBridge CRON)

ECS/Fargate для обработки задач

Сборка отчётов, экспорт данных:
- Task definition: 2GB RAM, 1 CPU
- Fargate запуск: платишь только за время выполнения
- CloudWatch logs для мониторинга

Database

RDS PostgreSQL (Multi-AZ)

db.r5.2xlarge instance
- 16 vCPU, 64 GB RAM
- Multi-AZ для failover
- Automated backups: 30 дней
- Read replica для аналитики
- 200 IOPS, provisioned

ElastiCache Redis (Cluster Mode)

- Session cache: cache.r6g.xlarge × 3
- User preferences
- Rate limiting counters
- Product recommendations cache
- TTL от 5 минут до 1 часа

DynamoDB для high-volume данных

- Product views (analytics)
- User activity log
- On-demand billing
- TTL для автоудаления старых записей
- Global secondary indexes для queries

Storage

S3 для медиа

Bucket structure:
s3://images/products/{id}/
s3://images/users/{id}/profile.jpg
s3://backups/database/{date}/

- CloudFront distribution в front
- Versioning включён
- Lifecycle policy: Glacier после 90 дней
- Bucket encryption (SSE-S3)

Networking

VPC с приватными подсетями

- Public subnets для ALB (2 AZ)
- Private subnets для EC2/RDS (2 AZ)
- NAT Gateway для outbound traffic
- Security Groups: минимальные права

ALB (Application Load Balancer)

- Health check: /health endpoint
- Target groups по URL path:
  - /api/v1/products → products-service
  - /api/v1/orders → order-service
- Sticky sessions для cart
- SSL/TLS termination

CloudFront CDN

- Origin: S3, ALB
- Cache behaviors:
  - /api/* → не кешировать
  - /static/* → кешировать 1 год
  - /images/* → кешировать 1 неделя

Messaging & Queues

SQS для асинхронности

Queues:
- orders-to-process (delay: 1 min)
- emails-to-send (retention: 14 days)
- notifications (FIFO для порядка)

Consumer: EC2 приложение читает 10 сообщений за раз
DLQ для failed messages

SNS для notifications

Topics:
- order-created (подписаны: email, SMS, push)
- payment-failed (подписаны: alert, support, user)

Monitoring & Logging

CloudWatch

Metrics:
- EC2: CPU, Memory, Disk
- RDS: Connections, Query time, Replication lag
- ALB: Request count, Target health
- Lambda: Invocations, Duration, Errors

Alarms:
- CPU > 70% → scale up
- RDS connections > 80% → alert
- Lambda error rate > 1% → alert

CloudWatch Logs

Log Groups:
- /aws/ec2/application (из приложения)
- /aws/rds/instance (slow query log)
- /aws/lambda/functions

Log retention: 30 дней
Log Insights queries для анализа

X-Ray для distributed tracing

Tracing:
- HTTP requests: ALB → EC2 → RDS
- Async: SQS → Lambda → SNS
- Duration, errors, bottlenecks

Code примеры для AWS

Spring Boot конфиг для AWS

@Configuration
public class AWSConfig {
    
    @Bean
    public AmazonSQS amazonSQS() {
        return AmazonSQSClientBuilder.standard()
            .withRegion(Regions.EU_WEST_1)
            .build();
    }
    
    @Bean
    public AmazonS3 amazonS3() {
        return AmazonS3ClientBuilder.standard()
            .withRegion(Regions.EU_WEST_1)
            .build();
    }
    
    @Bean
    public AmazonCloudWatch cloudWatch() {
        return AmazonCloudWatchClientBuilder.standard()
            .withRegion(Regions.EU_WEST_1)
            .build();
    }
}

Lambda Function (Java)

public class OrderProcessorHandler implements RequestHandler<SQSEvent, Void> {
    private final OrderService orderService;
    private final Logger logger = LoggerFactory.getLogger(this.class);
    
    @Override
    public Void handleRequest(SQSEvent event, Context context) {
        for (SQSMessage message : event.getRecords()) {
            try {
                OrderEvent order = objectMapper.readValue(
                    message.getBody(), 
                    OrderEvent.class
                );
                
                orderService.processOrder(order);
                logger.info("Order {} processed", order.getId());
                
            } catch (Exception e) {
                logger.error("Failed to process order", e);
                // Dead Letter Queue обработает
                throw e;
            }
        }
        return null;
    }
}

S3 Upload Service

@Service
public class S3Service {
    private final AmazonS3 s3Client;
    private static final String BUCKET = "my-app-images";
    
    public String uploadFile(String key, InputStream input, long size) {
        ObjectMetadata metadata = new ObjectMetadata();
        metadata.setContentLength(size);
        metadata.setContentType("image/jpeg");
        
        s3Client.putObject(
            new PutObjectRequest(BUCKET, key, input, metadata)
                .withCannedAcl(CannedAccessControlList.PublicRead)
        );
        
        return s3Client.getUrl(BUCKET, key).toString();
    }
    
    public void deleteFile(String key) {
        s3Client.deleteObject(BUCKET, key);
    }
}

CloudWatch Metrics

@Service
public class OrderMetrics {
    private final AmazonCloudWatch cloudWatch;
    
    public void recordOrderCreated(Order order) {
        MetricDatum datum = new MetricDatum()
            .withMetricName("OrderCreated")
            .withValue(1.0)
            .withUnit(StandardUnit.Count)
            .withTimestamp(new Date())
            .withDimensions(
                new Dimension().withName("Environment").withValue("prod")
            );
        
        cloudWatch.putMetricData(
            new PutMetricDataRequest()
                .withNamespace("CustomApp")
                .withMetricData(datum)
        );
    }
}

Deployment Pipeline

1. Git push → CodeCommit
2. CodePipeline triggered
3. CodeBuild:
   - mvn clean package
   - docker build
   - docker push to ECR
4. CodeDeploy:
   - Rolling deployment (1 instance at a time)
   - Health checks
   - Rollback на ошибку
5. CloudWatch monitors

Cost Optimization

1. Reserved Instances: 40% скидка
   - 1 year commitment на EC2 m5.2xlarge
   - 5 RDS instances reserved

2. Spot Instances для non-critical:
   - Batch processing: 70% скидка
   - Cache warm-up: 80% скидка

3. S3 Lifecycle:
   - Standard (current): $0.023/GB
   - Glacier (3 месяца): $0.004/GB

4. Lambda вместо EC2:
   - Email sending: на спрос
   - Image resizing: по использованию

Плюсы облака

Скалируемость - Auto Scaling, load balancing ✅ Высокая доступность - Multi-AZ, failover автоматический ✅ Мониторинг - CloudWatch из коробки ✅ Безопасность - VPC, IAM, encryption ✅ Отсутствие операций - AWS управляет железом ✅ Бекапы - Automated, versioning

Минусы облака

Cost - Легко потратить больше чем планировал ❌ Complexity - Много сервисов для изучения ❌ Vendor lock-in - Сложно мигрировать ❌ Network latency - Иногда медленнее on-prem

Альтернативы

ОблакоКогда
AWSНужна enterprise поддержка, огромный ecosystem
Google CloudBigQuery, Machine Learning
AzureИнтеграция с Microsoft stack
DigitalOceanПростота, малые проекты
On-PremisesОчень strict compliance, high-speed network

TL;DR

Да, последний проект был полностью на AWS. E-commerce платформа требовала:

✅ Масштабируемости (Auto Scaling) ✅ Высокой доступности (Multi-AZ, RDS failover) ✅ Асинхронности (SQS, Lambda) ✅ Мониторинга (CloudWatch, X-Ray) ✅ Storage (S3, ElastiCache)

На prod: EC2 + RDS + Redis + S3 + SQS + Lambda + CloudWatch

На staging: Всё то же, но меньше инстансов (cost optimize)

Key skill: Понимание облачной архитектуры, cost optimization, monitoring — обязательные для senior java разработчика в 2024.