从交换

时间:2017-12-02 10:21:14

标签: java spring rabbitmq spring-amqp

我们有一个以随机顺序接收消息的微服务,该服务负责编排这些消息并按顺序放入rabbitmq。让我们说一个示例类型看起来像

{
  "type": "Orange",
  "sequence": 4
}

此服务的目的是按类型过滤我们的消息,并按顺序将消息推送到rabbitmq。因此,如果服务收到的第一条消息是“芒果”类型,序列为“2”,它将等待直到它获得“芒果”,序列“1”先推送,然后按“2”。

所以目前我正在使用与路由密钥的直接交换作为“类型”(根据我的理解,在rabbitmq中自动创建一种队列PER类型)。由于服务,它们按“序列”的顺序推送。路由键也是动态的,可以随时添加新类型。

目前我正在计划的是从直接交换中获得订阅所有这些队列的服务(例如:Apple,Orange等队列)。此服务将按比例放大(群集)。假设“Apple”队列中有17条消息。然后,一个服务实例在队列末尾接收类型为“Apple”的消息,当发生这种情况时,没有其他服务应该能够接收下一条“Apple”消息,直到队列获得该消息的确认时为止处理。 因此,任何服务实例一次只能处理每种类型的一条消息,直到队列获得当前消息的确认。但是,任何多种类型都可以并行处理,因为可以有很多类型(即使是多个线程上的相同服务)。

如何编程我的消费者以这种方式从直接交换中读取,目前我还无法编写消费者来读取所有路由密钥中的消息作为第一步?

我使用Spring与rabbitmq通信,指定明确工作的密钥但我们希望从所有密钥接收消息。

我们想要的一个例子是

@Bean
public Binding binding1b(DirectExchange direct, Queue autoDeleteQueue1) {
    return BindingBuilder.bind(autoDeleteQueue1).to(direct).with("*");
}

另外还有他们担心有很多动态的路由键,因为随着应用程序的增长,键的数量会增加,所以可能会有1000多个键。

1 个答案:

答案 0 :(得分:0)

  

根据我的理解,在rabbitmq中自动创建一种队列PER类型

这不正确。您必须创建所有这些队列,然后将它们绑定到交换机。是的,这里已经可以使用routingKey来进行交换和队列之间的绑定。您需要记住,routingKey仅适用于代理方,它在交换中决定将消息发送到何处。

  

因此,任何服务实例

一次只能处理每种类型的一条消息

这确实是队列抽象的目的:只有一个消费者获得一条要处理的消息。但是,如果您不想并行处理来自同一队列的消息,则应考虑使用exclusive consumer

  

我如何编程我的消费者阅读直接交换

您不会阅读来自交易所的消息。这是排队责任。你必须在使用它们之前声明所有队列。一个ListenerContainer确实可以从许多队列中读取。您甚至可以在运行时向消费者添加队列。但是在这种情况下,如果对所有队列使用单个独占使用者,则可能会失去并发功能。

  

指定明确工作的密钥,但我们希望从所有密钥接收消息。

routingKey是绑定问题。消费没什么。虽然您可以在邮件amqp_receivedRoutingKey中获得此类标头,以便在客户端进行过滤。但是我不确定这对我们有什么帮助。

我认为您需要更多地了解AMQP协议的工作原理,并重新考虑您的架构和期望。我现在对你没有解决方案,但我应该吗?..