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

时间:2016-09-29 16:44:06

标签: java jms activemq scalability spring-jms

我正在编写一个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
    }
    
  3. 方法#1的一个优点是不需要管理多个目的地的资源;那里只有一个目的地。这也意味着协作系统只需要知道一个主题。

    方法#2的一个优点是不需要任何类型的开关逻辑。进入主题A的任何消息都有专门针对主题A格式化的有效负载。此方法的关注点是,可能无法在不同的JMS侦听器之间有效地分配用于处理传入消息的资源。

    此外,对集装箱工厂配置的任何建议都表示赞赏。

1 个答案:

答案 0 :(得分:1)

取决于邮件大小和数量。使用多个侦听器,您也可以获得多个线程,因此可以更快地运行,直到有大量主题(因此线程)的下降。我建议在你的代表系统上设置一个快速测试和基准测试,然后你将使用公司数字进行比较。