Какие виды состояния может хранить сервис и как это реализовать?

«Какие виды состояния может хранить сервис и как это реализовать?» — вопрос из категории Архитектура, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Вид состояния Пример Типичное решение
Сессионное Корзина покупок, данные авторизованного пользователя. Redis или Memcached (быстро, in-memory, с TTL).
Кэш Результаты тяжелых запросов, статичные справочники. Redis, Caffeine (in-memory cache для JVM).
Постоянное Основные бизнес-сущности (пользователи, заказы). Реляционная БД (PostgreSQL, MySQL) или NoSQL (MongoDB).
Файловое Загруженные изображения, документы. Объектное хранилище (S3, MinIO) или файловая система.

Пример реализации кэширования в Spring:

@Service
public class ProductService {
    @Cacheable(value = "products", key = "#id")
    public Product getProduct(String id) {
        // Дорогой запрос к БД выполнится только при промахе кэша
        return productRepository.findById(id).orElseThrow();
    }

    @CacheEvict(value = "products", key = "#product.id")
    public Product updateProduct(Product product) {
        // При обновлении запись инвалидируется из кэша
        return productRepository.save(product);
    }
}

Ключевой принцип: Старайтесь проектировать сервисы как stateless, вынося состояние во внешние, специализированные хранилища. Это упрощает масштабирование и отказоустойчивость.