使用 JMS 临时队列进行同步使用是否是一种很好的做法?

2022-09-01 21:24:20

如果我们使用使用“临时队列”的JMS请求/应答机制,该代码是否可扩展?

截至目前,我们不知道我们是否将支持每秒100个请求,还是每秒支持1000个请求。

下面的代码是我想实现的。它以“同步”方式使用JMS。关键部分是创建“使用者”以指向为此会话创建的“临时队列”的位置。我只是无法弄清楚使用这样的临时队列是否是一种可扩展的设计。

  destination = session.createQueue("queue:///Q1");
  producer = session.createProducer(destination);
  tempDestination = session.createTemporaryQueue();
  consumer = session.createConsumer(tempDestination);

  long uniqueNumber = System.currentTimeMillis() % 1000;
  TextMessage message = session
      .createTextMessage("SimpleRequestor: Your lucky number today is " + uniqueNumber);

  // Set the JMSReplyTo
  message.setJMSReplyTo(tempDestination);

  // Start the connection
  connection.start();

  // And, send the request
  producer.send(message);
  System.out.println("Sent message:\n" + message);

  // Now, receive the reply
  Message receivedMessage = consumer.receive(15000); // in ms or 15 seconds
  System.out.println("\nReceived message:\n" + receivedMessage);

更新:

我遇到了另一种模式,请参阅此博客 的想法是使用“常规”队列进行发送和接收。但是,对于“同步”调用,为了获得所需的响应(即匹配请求),您需要创建一个使用“选择器”侦听接收队列的使用者。

步骤:

    // 1. Create Send and Receive Queue.
    // 2. Create a msg with a specific ID
 final String correlationId = UUID.randomUUID().toString();
 final TextMessage textMessage = session.createTextMessage( msg );
 textMessage.setJMSCorrelationID( correlationId );

    // 3. Start a consumer that receives using a 'Selector'.
           consumer = session.createConsumer( replyQueue, "JMSCorrelationID = '" + correlationId + "'" );

因此,此模式的不同之处在于,我们不会为每个新请求创建新的临时队列。相反,所有响应都只进入一个队列,但使用“选择器”来确保每个请求线程接收唯一关心的响应。

我认为这里的缺点是你必须使用“选择器”。我还不知道这是否比前面提到的模式更不受欢迎或更受欢迎。思潮?


答案 1

关于您帖子中的更新 - 如果在消息头上执行选择器,则选择器非常有效,就像您对关联ID所做的那样。


答案 2

有趣的是,这种可伸缩性实际上可能与其他响应所描述的相反。

WebSphere MQ 在可能的情况下保存和重用动态队列对象。因此,尽管动态队列的使用不是免费的,但它确实可以很好地扩展,因为随着队列的释放,WMQ需要做的就是将句柄传递给请求新队列实例的下一个线程。在繁忙的 QMgr 中,当句柄在线程之间传递时,动态队列的数量将保持相对静态。严格来说,它不像重用单个队列那么快,但它并不坏。

另一方面,即使索引速度很快,性能也与索引中的消息数相反。如果队列深度开始构建,也会有所不同。当应用在空队列上使用时,没有延迟。但在深度队列中,QMgr 必须搜索现有消息的索引,以确定回复消息不在其中。在您的示例中,这是每秒搜索空索引与搜索大型索引 1,000 次之间的区别。CORRELIDGETWAIT

结果是,1000 个动态队列(每个队列包含一条消息)实际上可能比具有 1000 个线程的单个队列更快,具体取决于应用和负载的特征。我建议在进行特定设计之前对其进行大规模测试。CORRELID


推荐