Ответ
Асинхронная коммуникация — это модель взаимодействия между компонентами системы, при которой отправитель не блокируется в ожидании немедленного ответа от получателя. Сообщение помещается в канал (очередь, шину), и получатель обрабатывает его тогда, когда сможет. Это повышает отказоустойчивость, масштабируемость и развязывает компоненты системы.
Пример с использованием 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 упадет, сообщения не потеряются и будут обработаны после его восстановления.
- Развязка: Сервису-отправителю не нужно знать адрес или состояние сервиса-получателя.