Java 哪一个提供了更好的性能:带switch语句的单个JMS主题,还是单个主题?

Java 哪一个提供了更好的性能:带switch语句的单个JMS主题,还是单个主题?,java,jms,activemq,scalability,spring-jms,Java,Jms,Activemq,Scalability,Spring Jms,我正在编写一个Spring引导应用程序,它将侦听一个或多个JMS主题。我们选择ActiveMQ作为JMS实现 我们主要关注的是性能和可伸缩性。我们预计每秒可能会收到数千条消息。我们提出了两个备选方案: 使用单个主题和单个@JmsListener方法。在侦听器内部,检查JMS属性以确定处理消息的正确策略 @JmsListener(destination = "response", containerFactory = "myTopicFactory") public void onMessage(

我正在编写一个Spring引导应用程序,它将侦听一个或多个JMS主题。我们选择ActiveMQ作为JMS实现

我们主要关注的是性能和可伸缩性。我们预计每秒可能会收到数千条消息。我们提出了两个备选方案:

  • 使用单个主题和单个@JmsListener方法。在侦听器内部,检查JMS属性以确定处理消息的正确策略

    @JmsListener(destination = "response", containerFactory = "myTopicFactory")
    public void onMessage(Message message) throws IOException {
        message.getProperty("message.type")
        JmsHandler handler = messageStrategyMap.get(messageType);
        handler.handle(message);
    }
    
  • 使用多个主题和多个@JmsListener方法。在这种情况下,不需要切换逻辑

    @JmsListener(destination = "responseType1", containerFactory = "myTopicFactory")
    public void onMessage1(Message message) throws IOException {
        // Handle message type 1
    }
    
    @JmsListener(destination = "responseType2", containerFactory = "myTopicFactory")
    public void onMessage2(Message message) throws IOException {
        // Handle message type 2
    }
    
  • 方法#1的一个优点是不需要为多个目的地管理资源;只有一个目的地。这也意味着协作系统只需要知道一个主题

    方法2的一个优点是不需要任何类型的切换逻辑。在主题A上传入的任何消息都有一个专门为主题A格式化的有效负载。这种方法的问题是,处理传入消息的资源可能无法在不同的JMS侦听器之间有效分配


    此外,欢迎提供有关容器工厂配置的任何建议。

    这取决于消息大小和数量。有了多个监听器,您还可以获得多个线程,因此在主题(以及线程)减少之前,运行速度可能会更快。我建议在你的代理系统上建立一个快速的测试和基准,你会有固定的数据进行比较