【问题标题】:Which offers better performance: A single JMS topic with a switch statement, or individual topics?哪个提供更好的性能:带有 switch 语句的单个 JMS 主题,还是单独的主题?
【发布时间】:2017-02-08 02:30:59
【问题描述】:

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

我们主要关心的是性能和可扩展性。我们预计每秒可能有数千条消息到达。我们提出了两种选择:

  1. 使用单个主题和单个 @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);
    }
    
  2. 使用多个主题和多个@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 侦听器之间有效分配。

此外,感谢任何有关容器工厂配置的建议。

【问题讨论】:

    标签: java jms activemq scalability spring-jms


    【解决方案1】:

    这取决于邮件大小和数量。使用多个侦听器,您还将获得多个线程,因此可能会运行得更快,直到拥有大量主题(以及因此线程)的下降。我建议在您的代表性系统上设置一个快速测试和基准测试,这样您就可以掌握可靠的数据来进行比较。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 2020-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      相关资源
      最近更新 更多