簡體   English   中英

Spring Cloud Stream 不會向 RabbitMQ 發送消息,而是在同一個 pod 中消費。 生產者和消費者在同一個應用程序中

[英]Spring Cloud Stream is not sending messages to RabbitMQ, instead consumes in the same pod. Producer and Consumer are in the same app

我正在使用 Spring Cloud Stream 和 RabbitMQ,並且我在同一個應用程序中配置了生產者和消費者,但使用了兩個不同的通道。 問題是我的應用程序有五個副本在 Kubernetes 上運行,但只有發送消息的 pod 使用它們,其他四個不使用。 在 RabbitMQ 控制台上,沒有收到任何消息,消息速率圖不會改變。 當我評論 OrdersListener 時,消息成功發送到 RabbitMQ 集群。 有誰知道可能有什么問題?

以下是制作人頻道:

@Component
public interface OrdersChannel {
   @Output("Orders")
   MessageChannel publishOrders();
}

這是消費者頻道:

@Component
public interface OrdersListenerChannel {
   String BINDING = "Orders";

   @Input(BINDING)
   SubscribableChannel input();
}

這是產生消息的服務:

@Service
@RequiredArgsConstructor
@EnableBinding(OrdersChannel.class)
public class OrdersEventService {

    private final OrdersChannel ordersChannel;

    public void sendOrderEvents(final Set<Order> orders) {
        orders.parallelStream().forEach(order ->
            ordersChannel.publishOrders()
            .send(message(OrderMessageDTOBuilder.build(order))));
    }

    private static <T> Message<T> message(T val) {
        return MessageBuilder.withPayload(val).build();
    }
}

這是監聽器:

@Component
@RequiredArgsConstructor
@EnableBinding(OrdersListenerChannel.class)
public class OrdersListener {

    private final OrderService orderService;

    @StreamListener(OrdersListenerChannel.BINDING)
    public void listen(final OrderMessageDTO orderMessageDTO) {
       // orderService method call
    }
}

而我的 application.properties 是這樣的:

spring.cloud.stream.bindings.Orders.destination=GeneralExchange
spring.cloud.stream.bindings.Orders.producer.requiredGroups=OrdersQueue
spring.cloud.stream.rabbit.bindings.Orders.producer.bindingRoutingKey=OrdersQueue
spring.cloud.stream.rabbit.bindings.Orders.producer.routingKeyExpression='OrdersQueue'


spring.cloud.stream.bindings.OrdersListenerChannel.group=OrdersQueue
spring.cloud.stream.bindings.OrdersListenerChannel.consumer.max-attempts=3
spring.cloud.stream.bindings.OrdersListenerChannel.consumer.concurrency=10
spring.cloud.stream.rabbit.bindings.OrdersListenerChannel.consumer.bind-queue=false
spring.cloud.stream.rabbit.bindings.OrdersListenerChannel.consumer.republish-to-dlq=false

所以,你要問幾個問題。 首先,您的配置和編程模型(基於注解)早已棄用,實際上將在下一個主要版本中刪除。 我們一直渴望切換到明顯更簡單的函數式編程模型

關於你的副本。 . . 我不認為這與您正在觀察的內容有任何關系。 您實際上是在說您有五個消費者,但只有一個消費者收到消息。 這意味着您沒有在 RabbiotMQ 中配置發布-訂閱模型。 這類似於對交換類型和隊列路由鍵之間的 RabbitMQ 關系的未配置或未理解。 您的交換必須是正確路由到綁定隊列的topic類型(例如, #作為路由鍵)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM