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

Что использовал на своем проекте

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

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

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

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

Технологический стек личного проекта

В своём коммерческом проекте я использовал современный и масштабируемый стек для построения высоконагруженной системы обработки платежей и управления подписками.

Backend архитектура

1. Framework и язык

Spring Boot 3.x — основной фреймворк для быстрой разработки REST API:

@SpringBootApplication
@EnableAsync
@EnableScheduling
public class PaymentServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(PaymentServiceApplication.class, args);
    }
}

@RestController
@RequestMapping("/api/v1/payments")
public class PaymentController {
    @PostMapping
    public ResponseEntity<PaymentResponse> createPayment(
            @Valid @RequestBody PaymentRequest request) {
        // Обработка платежа
    }
}

2. Database

PostgreSQL с оптимизированными запросами и индексами:

CREATE TABLE payments (
    id UUID PRIMARY KEY,
    user_id UUID NOT NULL,
    amount DECIMAL(10, 2) NOT NULL,
    status VARCHAR(20) NOT NULL,
    created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

CREATE INDEX idx_payments_user_status ON payments(user_id, status);

Hibernate/JPA для ORM:

@Entity
@Table(name = "payments")
public class Payment {
    @Id
    @GeneratedValue(strategy = GenerationType.UUID)
    private UUID id;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;
    
    @Enumerated(EnumType.STRING)
    private PaymentStatus status;
    
    @Column(columnDefinition = "DECIMAL(10, 2)")
    private BigDecimal amount;
}

3. Асинхронная обработка

RabbitMQ для обработки событий платежей:

@Configuration
@EnableRabbit
public class RabbitConfig {
    @Bean
    public Queue paymentQueue() {
        return new Queue("payment.queue", true);
    }
    
    @Bean
    public Exchange paymentExchange() {
        return new DirectExchange("payment.exchange");
    }
    
    @Bean
    public Binding paymentBinding(Queue queue, Exchange exchange) {
        return BindingBuilder.bind(queue)
            .to(exchange)
            .with("payment.*");
    }
}

@Service
public class PaymentEventProducer {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    public void publishPaymentCreated(PaymentEvent event) {
        rabbitTemplate.convertAndSend(
            "payment.exchange", 
            "payment.created", 
            event
        );
    }
}

@Service
public class PaymentEventConsumer {
    @RabbitListener(queues = "payment.queue")
    public void handlePaymentEvent(PaymentEvent event) {
        // Обработка события
    }
}

4. Кэширование

Redis для кэширования и управления сессиями:

@Configuration
@EnableCaching
public class RedisConfig {
    @Bean
    public LettuceConnectionFactory connectionFactory() {
        return new LettuceConnectionFactory();
    }
    
    @Bean
    public RedisCacheManager cacheManager(LettuceConnectionFactory connectionFactory) {
        return RedisCacheManager.create(connectionFactory);
    }
}

@Service
public class UserService {
    @Cacheable(value = "users", key = "#userId")
    public User getUserById(UUID userId) {
        return userRepository.findById(userId)
            .orElseThrow(() -> new UserNotFoundException());
    }
    
    @CacheEvict(value = "users", key = "#userId")
    public void updateUser(UUID userId, UserUpdateRequest request) {
        User user = getUserById(userId);
        user.setName(request.getName());
        userRepository.save(user);
    }
}

5. Security

Spring Security с JWT токенами:

@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
            .authorizeRequests()
                .antMatchers("/api/v1/auth/**").permitAll()
                .anyRequest().authenticated()
            .and()
            .addFilter(new JwtAuthenticationFilter(authenticationManager()))
            .addFilter(new JwtAuthorizationFilter(authenticationManager()));
        
        return http.build();
    }
}

Мониторинг и логирование

Prometheus + Grafana для метрик:

@RestController
@RequestMapping("/api/v1/admin/metrics")
public class MetricsController {
    private final MeterRegistry meterRegistry;
    
    @PostMapping("/payment")
    public void recordPayment(BigDecimal amount) {
        Timer.Sample sample = Timer.start(meterRegistry);
        // Обработка платежа
        sample.stop(Timer.builder("payment.processing")
            .tag("amount", amount.toString())
            .register(meterRegistry));
    }
}

ELK Stack (Elasticsearch, Logstash, Kibana) для логирования:

@Slf4j
@Service
public class PaymentProcessor {
    public void processPayment(Payment payment) {
        log.info("Processing payment: userId={}, amount={}", 
            payment.getUser().getId(), 
            payment.getAmount());
        
        try {
            // Обработка
        } catch (Exception e) {
            log.error("Payment processing failed", e);
        }
    }
}

Тестирование

JUnit 5 + Mockito для unit-тестов:

@ExtendWith(MockitoExtension.class)
class PaymentServiceTest {
    @Mock
    private PaymentRepository paymentRepository;
    
    @InjectMocks
    private PaymentService paymentService;
    
    @Test
    void testCreatePayment() {
        Payment payment = new Payment();
        when(paymentRepository.save(any())).thenReturn(payment);
        
        assertNotNull(paymentService.createPayment(new PaymentRequest()));
    }
}

Testcontainers для интеграционных тестов:

@Testcontainers
class PaymentRepositoryTest {
    @Container
    static PostgreSQLContainer<?> postgres = 
        new PostgreSQLContainer<>("postgres:15")
            .withDatabaseName("testdb")
            .withUsername("test")
            .withPassword("test");
    
    @Test
    void testSavePayment() {
        Payment payment = new Payment();
        paymentRepository.save(payment);
        assertNotNull(paymentRepository.findById(payment.getId()));
    }
}

DevOps и развёртывание

Docker для контейнеризации:

FROM openjdk:17-slim
WORKDIR /app
COPY target/payment-service.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

Kubernetes для оркестрации:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: payment-service
spec:
  replicas: 3
  selector:
    matchLabels:
      app: payment-service
  template:
    metadata:
      labels:
        app: payment-service
    spec:
      containers:
      - name: payment-service
        image: payment-service:1.0
        ports:
        - containerPort: 8080
        env:
        - name: DATABASE_URL
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: url

Ключевые особенности архитектуры

  • Микросервисная архитектура с API Gateway
  • Event-driven обработка для масштабируемости
  • Circuit breaker pattern для резильентности
  • Горизонтальное масштабирование через Kubernetes
  • CI/CD пайплайны через GitLab CI

В результате система обрабатывает 10,000+ транзакций в день с 99.9% uptime.