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

Какие операции чтения микросервиса использовались на последней работе

1.7 Middle🔥 251 комментариев
#REST API и микросервисы

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

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

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

Операции чтения в микросервисах

На последней работе я работал с микросервисной архитектурой, где использовались различные паттерны чтения данных.

REST API вызовы между сервисами

Основной способ получения информации из других микросервисов:

@Service
public class OrderService {
    private final WebClient webClient;
    
    public Mono<Order> getOrderWithDetails(Long orderId) {
        return webClient.get()
            .uri("/api/v1/orders/" + orderId)
            .retrieve()
            .bodyToMono(Order.class);
    }
}

Кэширование результатов

Часто используемые данные кэшировались в Redis:

@Service
public class ProductService {
    @Cacheable(value = "products", key = "#id")
    public Product getProduct(Long id) {
        return productRepository.findById(id).orElse(null);
    }
}

Event-driven чтение через Message Queue

Для асинхронной синхронизации использовали RabbitMQ:

@Service
public class OrderEventListener {
    @RabbitListener(queues = "order-created")
    public void handleOrderCreated(OrderEvent event) {
        orderRepository.save(event.toOrder());
    }
}

Read Replicas для масштабирования

Для операций чтения использовали отдельные реплики БД:

@Service
public class ReportService {
    @Qualifier("replicaDataSource")
    private final DataSource readDataSource;
    
    public List<Report> getReports() {
        return reportRepository.findAll(); // из replica
    }
}

GraphQL для гибких запросов

Для сложных операций чтения использовали GraphQL:

query {
  user(id: 1) {
    id
    name
    orders {
      id
      total
    }
  }
}

Это позволяло клиентам запрашивать только нужные данные.

Пакетное чтение (Batch Operations)

Для оптимизации N+1 проблемы:

public List<User> getUsersWithOrders(List<Long> userIds) {
    return userRepository.findByIdInWithOrders(userIds);
}

Circuit Breaker паттерн

Для надёжности при чтении из других сервисов:

@CircuitBreaker(name = "recommendation-service", fallbackMethod = "fallback")
public Mono<List<Product>> getRecommendations(Long userId) {
    return webClient.get()
        .uri("/api/v1/recommendations/" + userId)
        .retrieve()
        .bodyToFlux(Product.class)
        .collectList();
}

Elasticsearch для полнотекстового поиска

Для быстрого поиска:

public List<Product> searchProducts(String query) {
    return elasticsearchRepository.search(query).getContent();
}

Результаты

Эти техники позволили нам добиться:

  • Низких лейтенсей (< 100ms)
  • Высокой пропускной способности (> 10k req/s)
  • Отказоустойчивости при сбое других сервисов
  • Снижения нагрузки на основную БД

Критично было мониторить эти операции и использовать правильные паттерны для каждого сценария.

Какие операции чтения микросервиса использовались на последней работе | PrepBro