当前位置: 首页 > 面试题库 >

JMS连接,会话和生产者/消费者之间的关系

宋经业
2023-03-14
问题内容

我想向同一队列发送一批20k JMS消息。我使用10个线程将任务拆分,因此每个线程将处理2k条消息。我不需要交易。

我想知道是否建议建立一个连接,一个会话和10个生产者?

如果所有线程共享一个生产者,该怎么办?我的消息会损坏还是会同步发送(不会提高性能)?

如果我总是连接到同一队列,那么决定是创建新连接还是会话的一般指导方针是什么?

谢谢你,很抱歉一次问了很多。


问题答案:

如果某些消息重复或丢失可以吗?当JMS客户端通过网络连接到JMS代理时,任何API调用都分为三个阶段。

  1. 包括任何消息数据在内的API调用都通过电线传输给代理。
  2. API调用由代理执行。
  3. 结果代码和任何消息数据将被发送回客户端。

考虑生产者一分钟。如果第一步断开连接,则代理将永远不会收到消息,应用程序将需要再次发送消息。如果在第三步中断开连接,则消息已成功发送,再次发送将产生重复消息。该应用无法分辨两者之间的区别,因此唯一安全的选择是在错误时重新发送消息。如果处理了该会话,则在所有情况下都可以安全地重新发送该消息,因为如果原始消息已发送给代理,它将被回滚。

考虑消费者。如果在第三步中丢失了连接,则会从队列中删除该消息,但永远不会将其发送回客户端。但是,如果进行了会话处理,则在重新连接应用程序时将重新发送该消息。

在交易之外,可能会丢失或重复发送消息。在事务内部,存在相同的歧义窗口,但它是在COMMIT调用上,而不是PUT或GET上。使用事务处理会话,可以发送或接收两次消息,但不会丢失一条消息。

JMS规范认识到这种歧义的窗口,并提供以下指导:

如果在客户端在会话上提交其工作到返回commit方法之间发生故障,则客户端无法确定事务是已提交还是已回滚。当在非事务性发送PERSISTENT消息与从发送方法返回之间发生故障时,存在相同的歧义。

由JMS应用程序来处理这种歧义。在某些情况下,这可能会导致客户端产生功能上重复的消息。

由于会话恢复而重新发送的消息不被视为重复消息。

除确实可以丢失消息的情况外,应始终进行JMS会话处理。如果会话是事务处理的,则由于JMS线程模型,您需要每个线程的会话和连接。

关于性能影响的任何建议都是特定于供应商的,但是通常,在API调用返回之前,同步点之外的持久性消息会被硬化到磁盘上。但是 ,只要持久消息在COMMIT返回
之前一直存在,事务处理调用就可以在将持久消息写入磁盘 之前返回
。如果供应商基于此进行优化,则将多个消息写入磁盘然后分批提交它们的性能要高得多。这使代理可以按磁盘块而不是按消息优化写入和磁盘刷新。放入事务中的消息数量随着消息的大小而减少,并且超过一定的消息大小会减少到一个。

如果您的20k消息相对较小(以k为单位,而不是以mb为单位),则您可能希望每个线程使用事务处理的会话并调整提交间隔。



 类似资料:
  • 本教程演示了如何发送和接收来自Spring Kafka的消息。 首先创建一个能够发送消息给Kafka主题的Spring Kafka Producer。 接下来,我们创建一个Spring Kafka Consumer,它可以收听发送给Kafka主题的消息。使用适当的键/值序列化器和解串器来配置它们。 最后用一个简单的Spring Boot应用程序演示应用程序。 下载并安装Apache Kafka 要

  • 这两个队列运行在同一个EMS服务器上。有些人对这种配置有看法:只使用一个ConnectionFactory就可以配置它们,两个实例不是必需的。但是,如果我使用一个ConnectionFactory实例,那么该实例将同时用于DefaultMessageListenerContainer和CachingConnectionFactory(进一步用于JmsTemplate)。我不知道他们是否互相影响。

  • 我想使用一个camel组件,它提供了使用和生成RESTful资源的能力。 对于这个例子,我想使用camel restlet组件。restlet组件一切正常,我已经使用REST DSL成功地实现了restlet consumer。然而,我有几个问题: 问题 1) 将restlet启用为异步是否安全?我读过restlet async可能会导致一些问题。这仍然正确吗?如何提高服务绩效?我应该改用码头吗?

  • 在这种情况下,我是否需要求助于Kafka事务API来在消费者轮询循环中创建事务生产者,在该循环中,我在事务中执行:(1)处理消耗的记录和(2)在关闭事务之前提交它们的偏移量。在这种情况下,普通的commitsync/commitasync是否有效?

  • 最近,我们与Kafka消费者和生产商之间出现了一些性能问题。我们在scala中使用Kafka Java API。打开和关闭消费者和生产者对象的良好做法是什么?我认为这是一个非常开放的问题,正确的答案总是,但我正在尝试对此进行推理。 消费者可以长时间运行连接并保持开放吗? 当我们完成信息生成时,生产者是否应该关闭?

  • 生产者线程与消费者线程使用信号量同步 生产者线程与消费者线程使用信号量同步 源码/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2018-08-24 yangjie the f