Kolejki w Java i mikroserwisach – ActiveMQ, RabbitMQ, SQS i SNS

Producer -> Message Broker -> Consumer
{
"eventId": "912ea3e7-54db-4df5-a25c-127d1f784b82",
"eventType": "OrderCreated",
"orderId": "12345"
}
@Service
public class MessageProcessor {

    @Retryable(
        retryFor = RuntimeException.class,
        maxAttempts = 3,
        backoff = @Backoff(delay = 1000, multiplier = 2)
    )
    public void process(Message message) {
        // przetwarzanie wiadomości
        externalService.send(message);
    }

    @Recover
    public void recover(RuntimeException exception, Message message) {
        // po wyczerpaniu retry wiadomość może trafić do DLQ
        deadLetterQueue.send(message);
    }
}
Producer -> SQS Queue -> Consumer
                   -> Subscriber A
Producer -> SNS    -> Subscriber B
                   -> Subscriber C
                       -> SQS -> PaymentService
                      /
OrderService -> SNS --+--> SQS -> WarehouseService
                      \
                       -> SQS -> NotificationService
Zalety kolejekWady kolejek
Komunikacja asynchronicznaWiększa złożoność architektury
Luźniejsze powiązanie mikroserwisówTrudniejsze debugowanie przepływu danych
Możliwość buforowania skoków obciążeniaMożliwe duplikaty wiadomości
Łatwiejsze skalowanie konsumentówProblemy z zachowaniem kolejności wiadomości
Większa odporność na chwilowe awarie usługKonieczność obsługi retry i Dead Letter Queue
Możliwość przetwarzania zadań w tleDane mogą być przez pewien czas niespójne
Niezależne tempo pracy producenta i konsumentaKonieczność monitorowania kolejek i backlogu

Dodaj komentarz