Расскажи о последнем месте работы
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Последнее место работы
Моё последнее место работы — крупная финтех-компания PayCore (условное имя), специализирующаяся на платежных системах и обработке транзакций для e-commerce платформ. Я работал там 4 года в роли Senior Java Developer, а в конце стал Lead Developer.
О компании
PayCore — это B2B платежный гейтвей, обрабатывающий миллиарды рублей ежедневно. Клиенты — крупные онлайн-магазины, маркетплейсы, системы подписок. Требования к надёжности и производительности очень высокие.
Stack:
- Java 11+ (позже Java 17)
- Spring Boot 2.x (позже 3.x)
- PostgreSQL, Redis, Kafka
- Docker, Kubernetes
- AWS (EC2, S3, SQS)
- Gradle, Jenkins, GitLab CI/CD
Мои основные ответственности
1. Разработка ядра платёжной системы
Основной проект: микросервис обработки платежей
Текущая архитектура при приходе:
- Monolith на Spring Boot
- 15K строк в main service class
- Медленный code review (2+ недели)
- Трудно добавлять новые платёжные методы
Что я сделал:
-
Рефакторинг в микросервисы
- Разделил на 6 микросервисов: Payment Processing, Acquirer Integration, Settlement, Reconciliation, Notification Service, Admin API
- Внедрил Event-Driven архитектуру через Kafka
- Сократил среднее время обработки платежа с 800ms до 150ms
-
Реализовал Strategy паттерн для платёжных методов
interface PaymentMethod { PaymentResult process(Payment payment); PaymentResult refund(Payment payment); PaymentResult capture(Payment payment); } class CreditCardPaymentMethod implements PaymentMethod { ... } class PayPalPaymentMethod implements PaymentMethod { ... } class YandexKassaPaymentMethod implements PaymentMethod { ... }Теперь добавление нового способа оплаты — это 1-2 дня работы вместо 2 недель
-
Внедрил CQRS и Event Sourcing
- Все события платежей хранятся в EventStore
- Отделил read модель от write модели
- Упростил аудит и отладку проблем
2. Оптимизация performance
Проблема: во время sales peaks система падала, TPS (transactions per second) падал с 1000 до 200.
Решение:
-
Профилирование с JFR (Java Flight Recorder)
- Нашёл N+1 queries в платёжном сервисе
- Обнаружил неоптимальную обработку больших объёмов в Kafka
- Выявил утечку памяти в кэше (забыли TTL)
-
Оптимизация БД
- Добавил правильные индексы
- Реализовал Connection Pooling (HikariCP)
- Использовал batch inserts для reconciliation
- Результат: query time сократился на 70%
-
Внедрил Redis для кэширования
- Кэшировал данные acquirers, комиссии, курсы валют
- Использовал Redis Pub/Sub для invalidation
- Hit rate достиг 92% для критичных данных
-
Оптимизация Kafka consumers
- Настроил batch processing (вместо обработки по одному сообщению)
- Внедрил backpressure handling
- Увеличил throughput в 5 раз
Результат: TPS в peak hours увеличился до 5000, latency p99 снизился с 2500ms до 200ms.
3. Обработка отказоустойчивости
В платёжной системе отказоустойчивость критична:
-
Реализовал Circuit Breaker паттерн
@CircuitBreaker(name = "acquirerService", failureThreshold = 5, delay = 1000) public PaymentResponse callAcquirer(Payment payment) { // Автоматически откроется при 5 ошибках подряд return acquirerClient.process(payment); } -
Retry logic с exponential backoff
- Критичные операции пересылаются автоматически
- Временные сбои acquirers обрабатываются корректно
-
Graceful degradation
- Если Redis недоступен, падаем на БД (медленнее, но работает)
- Если один acquirer slow, переходим на другого
-
Distributed transactions с Saga паттерном
- Платёж состоит из 5 шагов (validation, authorization, capture, settlement, notification)
- При ошибке на любом шаге — компенсирующие транзакции
- Гарантия консистентности без 2-phase commit
4. Безопасность
В финтехе это очень серьёзно:
-
PCI DSS комплайанс
- Никогда не храним полные номера карт (только токены)
- Шифруем sensitive данные (PAN, CVV)
- Логируем все операции для аудита
-
Внедрил OAuth 2.0 + JWT
- Клиенты аутентифицируются через API keys + signatures
- JWT токены для внутренних сервисов
-
Rate limiting и DDoS protection
@RateLimiter("payment-api", limits = "1000 calls per minute") @PostMapping("/payments") public ResponseEntity<PaymentResponse> createPayment(@RequestBody PaymentRequest req) { // Защита от перегруза }
5. Сбор метрик и логирование
-
Metrics с Micrometer + Prometheus
- Отслеживаем TPS, latency (p50, p95, p99), error rate
- Custom метрики: платежи по методам, по странам, конверсии
-
ELK Stack для логов
- Структурированное логирование (JSON)
- Трейсинг запросов через correlation IDs
- Быстрый поиск по логам
-
Distributed tracing с Jaeger
- Видим пути запроса через все микросервисы
- Находим узкие места в цепи
Лидерская работа (последний год)
В конце я стал Lead Developer команды из 6 человек:
-
Архитектурные решения
- Выбор технологий (Spring Boot 3.0, Java 17, Kotlin для нового функционала)
- Дизайн новых микросервисов
- Code review сложных PR
-
Ментoring
- Помогал junior разработчикам расти
- Code reviews с подробными объяснениями
- Проводил техдискуссии
-
Planning
- Оценка сложности задач
- Идентификация технических долгов
- Планирование refactoring работ
Ключевые достижения
- 5x рост TPS в peak hours (1K → 5K transactions/sec)
- 70% reduction в latency (p99 с 2500ms → 200ms)
- 99.99% uptime (была 99.5%)
- Успешно обработал чёрную пятницу (3 млн платежей в день без падений)
- Сократил time-to-market для новых платёжных методов (2 недели → 2 дня)
- Построил и воспитал team из 3 юниоров, сейчас они работают как мидлы
Технологии, которые я использовал
Языки:
- Java (основной)
- Kotlin (новые microservices)
- Bash (deployment scripts)
- SQL (performance tuning)
Frameworks/Libraries:
- Spring Boot, Spring Cloud, Spring Security
- Apache Kafka
- Redis
- PostgreSQL (с оптимизацией)
- Docker & Kubernetes
- JUnit 5, Testcontainers, Mockito
Tools:
- Git, GitLab CI/CD
- Jenkins для deployment
- Prometheus + Grafana
- ELK Stack
- Jaeger
- JFR для профилирования
Почему я ухожу
- Достиг потолка — система стабильна, оптимизирована, все processes in place
- Хочу новых вызовов — интересуют более сложные архитектурные задачи
- Стремлюсь к growth — хочу расширить знания в new technologies (Cloud Native, AI/ML integration)
- Баланс — была очень интенсивная работа (на-call в выходные, быстрые отклики на production issues)
Что я вынес из этого опыта
- Как создавать надёжные системы — когда ошибка стоит денег, нужно быть очень аккуратным
- Importance of monitoring — what you can't measure, you can't improve
- Team leadership — как помочь людям расти и достичь целей
- Database optimization — indexes, query plans, transactions
- Event-Driven design — когда хорошо использовать, как избежать pitfalls
Этот опыт делает меня более зрелым разработчиком, который может работать с высоконагруженными системами и обучать других.