Что считаешь своим лучшим достижением на работе

Ответ

Моим ключевым достижением стала оптимизация критического микросервиса обработки платежей, который сократил среднее время отклика с 2 секунд до 150-200 мс и повысил устойчивость к нагрузке с 1K до 10K RPS (запросов в секунду).

Что было сделано:

  1. Архитектура: Переход от монолитного взаимодействия с БД к гибридной модели с кэшированием и асинхронной обработкой.
  2. Оптимизация доступа к данным:
    • Замена части синхронных EF Core-запросов на Dapper для сложных выборок.
    • Введение двухуровневого кэширования (in-memory для горячих данных, распределенный Redis для сессионных).
      public async Task<Order> GetOrderAsync(int id)
      {
      var cacheKey = $"order:{id}";
      // Сначала проверяем быстрый in-memory кэш
      if (!_localCache.TryGetValue(cacheKey, out Order order))
      {
          // Затем распределенный Redis
          order = await _distributedCache.GetAsync<Order>(cacheKey);
          if (order == null)
          {
              // И только потом идем в БД (через Dapper для скорости)
              order = await _dapperConnection.QueryFirstOrDefaultAsync<Order>(
                  "SELECT * FROM Orders WHERE Id = @id", new { id });
              // Асинхронно обновляем кэши
              await _distributedCache.SetAsync(cacheKey, order, TimeSpan.FromMinutes(5));
          }
          _localCache.Set(cacheKey, order, TimeSpan.FromMinutes(1));
      }
      return order;
      }
  3. Результат: Система стала стабильнее при пиковых нагрузках (например, в Black Friday), а также снизила нагрузку на БД и операционные затраты на инфраструктуру примерно на 20%.

Ответ 18+ 🔞

Ну вот, сидим мы тут, а я вспомнил, как один наш микросервис по обработке платежей просто агонизировал. Представь: клик — и две секунды ждёшь, как лох. А нагрузка? Тысяча запросов в секунду — и он уже пиздец как дышит, как паровоз последний. Прям волнение ебать, смотреть на это.

И вот пришла мне в голову светлая мысль: а давай его, этого увальня, перекрафтим, чтобы не жрал ресурсы, как не в себя, а летал.

Что я с ним сделал, рассказываю:

  1. Архитектуру перевернул. Была у него прямолинейная, тупая схема: запрос — лезет в базу, копается там — ответ. Ядрёна вошь! Сделал гибрид: кэш впихнул везде, где можно, и часть работы в асинхрон отправил, чтобы не тормозило всё.
  2. С данными разобрался.
    • Выкинул часть этих навороченных запросов через EF Core, где они не к месту были. Вставил Dapper для тяжёлых выборок — он проще, да и быстрее, как хуй с горы.
    • Кэширование двухэтажное прикрутил. Сначала память быстрая проверяется, потом Redis общий, и только если нихуя не нашлось — идём в базу, с поклоном. И всё это — чтобы базу-матушку не ебашить по каждому чиху.
public async Task<Order> GetOrderAsync(int id)
{
    var cacheKey = $"order:{id}";
    // Первый удар — локальный кэш, чтоб сразу
    if (!_localCache.TryGetValue(cacheKey, out Order order))
    {
        // Не попал — лезем в Redis, тоже не пешком
        order = await _distributedCache.GetAsync<Order>(cacheKey);
        if (order == null)
        {
            // Вот тут уже последний рубеж — база, но через быстрый Dapper
            order = await _dapperConnection.QueryFirstOrDefaultAsync<Order>(
                "SELECT * FROM Orders WHERE Id = @id", new { id });
            // Нашли — сразу в кэши пихаем, чтобы в следующий раз летело
            await _distributedCache.SetAsync(cacheKey, order, TimeSpan.FromMinutes(5));
        }
        _localCache.Set(cacheKey, order, TimeSpan.FromMinutes(1));
    }
    return order;
}
  1. И что в итоге? Сервис с 2 секунд скаканул на 150-200 миллисекунд. Это ж, блядь, вдесятеро быстрее! А нагрузку теперь держит не 1K, а все 10K RPS. На чёрную пятницу смотрел — стоит, сука, как танк, даже не дрогнул. Заодно и база вздохнула свободно, и на инфраструктуре процентов 20 сэкономили. Красота!