Что такое асинхронная коммуникация в архитектуре приложений? Приведите пример.

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

Ответ

Асинхронная коммуникация — это модель взаимодействия между компонентами системы, при которой отправитель не блокируется в ожидании немедленного ответа от получателя. Сообщение помещается в канал (очередь, шину), и получатель обрабатывает его тогда, когда сможет. Это повышает отказоустойчивость, масштабируемость и развязывает компоненты системы.

Пример с использованием RabbitMQ и Spring Boot:

1. Сервис-отправитель (Producer):

@Service
public class NotificationProducer {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void sendWelcomeEmail(String userId, String email) {
        // Создание сообщения
        Map<String, String> message = new HashMap<>();
        message.put("userId", userId);
        message.put("email", email);
        message.put("type", "welcome");

        // Асинхронная отправка в очередь. Метод возвращает управление сразу.
        rabbitTemplate.convertAndSend("notifications.exchange", "email.routing.key", message);
        System.out.println("Сообщение отправлено в очередь для email: " + email);
    }
}

2. Сервис-получатель (Consumer):

@Service
public class EmailConsumer {
    // Метод будет вызван асинхронно при поступлении сообщения в очередь
    @RabbitListener(queues = "email.queue")
    public void handleWelcomeEmail(Map<String, String> message) {
        System.out.println("Получен запрос на отправку email для: " + message.get("email"));
        // Имитация долгой операции (отправка email)
        sendEmail(message.get("email"), "Добро пожаловать!");
    }

    private void sendEmail(String to, String body) {
        // Логика отправки email...
    }
}

Преимущества:

  • Устойчивость к пиковым нагрузкам: Очередь буферизует сообщения.
  • Отказоустойчивость: Если сервис отправки email упадет, сообщения не потеряются и будут обработаны после его восстановления.
  • Развязка: Сервису-отправителю не нужно знать адрес или состояние сервиса-получателя.