`
JAVA-JVM
  • 浏览: 13368 次
  • 性别: Icon_minigender_1
  • 来自: 陕西
社区版块
存档分类
最新评论

JMS使用注意问题

阅读更多
1 使用jms需要注意的问题
一下所述的问题,不仅是对ActiveMQ,对于其他的JMS也一样有效。

1.1 不要频繁的建立和关闭连接
JMS使用长连接方式,一个程序,只要和JMS服务器保持一个连接就可以了,不要频繁的建立和关闭连接。频繁的建立和关闭连接,对程序的性能影响还是很大的。这一点和jdbc还是不太一样的。

1.2 Connection的start()和stop()方法代价很高
JMS的Connection的start()和stop()方法代价很高,不能经常调用。我们试用的时候,写了个jms的connection pool,每次将connection取出pool时调用start()方法,归还时调用stop()方法,然而后来用jprofiler发现,一般的 cpu时间都耗在了这两个方法上。

1.3 start()后才能收消息
Connection的start()方法调用后,才能收到jms消息。如果不调用这个方法,能发出消息,但是一直收不到消息。不知道其它的jms服务器也是这样。

1.4 显示关闭Session
如果忘记了最后关闭Connection或Session对象,都会导致内存泄漏。这个在我测试的时候也发现了。本来以为关闭了 Connection,由这个Connection生成的Session也会被自动关闭,结果并非如此,Session并没有关闭,导致内存泄漏。所以一定要显示的关闭Connection和Session。

1.5 对Session做对象池
对Session做对象池,而不是Connection。Session也是昂贵的对象,每次使用都新建和关闭,代价也非常高。而且后来我们发现,原来Connection是线程安全的,而Session不是,所以后来改成了对Session做对象池,而只保留一个Connection。

2 集群
ActiveMQ有强大而灵活的集群功能,但是使用起来还是会有很多陷阱。

2.1 broker cluster和 master-slave
ActiveMQ可以做broker的集群,也可以做master-slave方式的集群。前者能在多个broker之前fail-over和 load-balance,但是在某个节点出故障时,可能导致消息丢失;而后者能实时备份消息,和fail-over,但是不能load- balance。broker cluser的方式,在一个broker上发送的消息可以在其它的broker上收到。当一个broker失效时,客户端可以自动的转到别的broker 上运行,多个broker可以同时提供服务,但是消息只存储在一个broker上,如果那个broker失效了,那么客户端直到它重新启动后才能收到该 broker上的消息,假如很不幸,那个broker的存储介质坏了,那么消息就丢失掉了。
Master-slave方式中,只有master提供服务,slave只是实时的备份master的数据,所以消息不会丢失。当master失效时,slave会自动升为master,客户端会自动转到slave上工作,所以能fail-over。由于只有master提供服务,所以不能将负载分到多个broker上。
其实单个broker的性能已经是相当的惊人了,在我们公司的机器上能达到每秒收发4000个消息,没个消息4K字节这样的速度,足够公司目前的需要了,而公司并不希望丢失任何数据,所以我们选择使用master-slave模式。

2.2 多种master-slave模式
master-slave也有多种实现方式。它们的不同只是在共享数据和锁机制上。

2.2.1 Pure master-slave
Pure master-slave,显示的在配置文件中指定一个broker做为另一个broker的slave。运行时,slave同过网络自动从master 出复制数据,同时在和master失去连接时自动升级为master。当master失效,slave成为master后,如果要让原先的master重新投入运行,需要停掉运行中的slave(现在升级为master了),手动复制slave中的数据到master中。再重新启动master和 slave。这种方式最简单,效率也不错,但是只能有两台做集群,只能fail-over一次,而且需要停机回复master-slave结构。

2.2.2 JDBC master-slave
这种方式不需要特殊的配置,只要让所有的节点都把数据存储到同一个数据库中。先拿到数据库表的锁的节点成为master,一旦它失效了,其它的节点获得锁,就可以成为master。因为数据通过数据库共享,放在一个地方,不需要停机恢复master-slave。这种方式,需要额外的数据库服务器,如果数据库失效了,那么就全失效了,而且速度不是很快。我们在用mysql测试时,并没有成功,master失效后,其他的节点始终没有升级成 slave,可能是数据库配置的问题。

2.2.3 Share file master-slave
这种方式类似于前者,也不需要特别的配置,只是通过共享文件系统来共享数据,靠文件锁实现只有一台成为master。共享文件系统的方式有很多,我们测试了nfs v4 (v3有bug,不行), 最终在稳定性,效率等方面不是很满意,可能是通过网络太慢了。

测试过众多master-slave模式后发现,pure方式管理起来麻烦,jdbc方式成本高,效率低,share file方式需要高性能的共享文件,都有缺点。鉴于单台activeMQ很可靠,而我们的基础平台组愿意用硬件备份,最终还是决定不用master- slave了,也不用broker cluster,就用单台,通过硬件冗余保证数据不会丢失,并找另外一台刀片机做冷备,在主服务器失效时顶替。
分享到:
评论
1 楼 skyyan 2012-03-31  
你好,很庆幸能看到你的文章,

我对apache amq应用的时候 ,碰到了一些问题,希望能指教。


具体情况是 模拟客户端循环发消息(每秒1条), 服务端并发处理消息。
整个工程跑起来不到24小时 就挂掉了,

根据抛出异常为 amq 内存溢出,用jconsole监测,发现Connection下边的openwire 不停的在创建,很少有销毁的。

  希望博主 提供些思路 谢谢!!
 

相关推荐

    USB转SATA硬盘盒JMS583量产工具

    在使用JMS583量产工具时,用户首先需要确保电脑上已正确安装了相应的驱动程序,然后按照"JMS578_FW_Update step"文档的步骤操作,通过"Tool"运行工具并加载"Firmware"中的固件文件进行升级。这个过程需要注意的是,...

    JMS577主控通刷固件

    综合资源标签表明这个压缩包包含了多种资源,包括固件文件和更新工具,旨在解决特定问题,即恢复更换硬盘后JMS577主控的正常工作。 在实际操作中,用户首先需要下载这个压缩包,解压后运行"FwUpdateTool_v1_19_16_...

    Weblogic创建JMS服务器

    WebLogic Server是一款由Oracle公司提供的企业级Java应用服务器,它支持Java ...同时,熟悉源码和工具的使用能帮助你更好地诊断和优化JMS服务器的性能。在实际操作中,一定要遵循最佳实践,确保系统的稳定性和安全性。

    JBOSS建立JMS应用实例

    提供的文档《JBOSST建立JMS应用实例.doc》应该详细介绍了整个配置和编程过程,包括步骤、示例代码和注意事项。建议仔细阅读,结合实际操作进行学习。 六、MyTestWeb项目 这个项目的名称可能是包含一个或多个演示JMS...

    webLogic9.2配置JMS步骤

    在这个例子中,我们使用了SQL Server 2005。 - 接下来,启动WebLogic Server。WebLogic是Oracle提供的一个企业级Java应用服务器,用于部署和管理Java应用程序。 2. **WebLogic Console**: - 通过浏览器访问...

    JMS调用IBM MQ监听模式

    此外,开发过程中还应注意异常处理、并发控制以及性能优化等问题。对于“源码”标签,意味着可能需要查看和理解示例代码来学习如何实现这一功能。至于“工具”,可能涉及到集成开发环境(IDE)、版本控制系统(如Git...

    JMS567_578设置休眠工具.rar

    标题中的“JMS567_578设置休眠工具.rar”暗示这是一款针对ORICO 3.5寸硬盘盒的休眠设置调整软件,主要用于管理设备的节能模式。这款硬盘盒,如ORICO 3588US3,通常会...同时,注意定期检查更新,以获取更好的使用体验。

    JMS578_PPE_v124.01.00.02.zip

    WD MyBook JMS578固件升级涉及的"JMS578_PPE_v124.01.00.02"是针对这款硬盘控制器的特定版本,旨在解决已知问题、提升读写速度、增强稳定性,并可能包含新的安全特性。版本号中的"v124.01.00.02"表示固件的版本信息...

    jms基本用法

    使用JMS时,需要选择一个JMS实现,如ActiveMQ、RabbitMQ或Apache Qpid等。配置连接工厂和目的地(队列或主题)后,就可以创建生产者和消费者了。例如: ```java // 创建连接工厂 ConnectionFactory cf = new ...

    spring,weblogic配置jms

    Spring框架是一个广泛使用的Java应用开发框架,它提供了与多种消息中间件集成的能力,包括WebLogic Server的JMS服务。WebLogic是Oracle公司的一款企业级应用服务器,它支持JMS规范,提供了强大的消息队列和发布/订阅...

    JMS代码示例及配置相关资料

    - **对象消息(ObjectMessage)**:可以封装Java对象,但需要注意序列化问题。 JMS的配置通常涉及到以下步骤: 1. **选择JMS提供者**:如ActiveMQ、RabbitMQ、Apache Kafka等。 2. **创建连接工厂...

    前端开源库-jms-deploy

    在实际使用`jms-deploy`时,开发者需要注意以下几点: - **安全**:确保JMS服务器的连接信息在传输过程中是加密的,并且不在公开的代码仓库中暴露敏感信息。 - **测试环境**:在正式部署前,应在测试环境中进行...

    Spring整合JMS

    然而,需要注意的是,尽管Spring提供了ConnectionFactory的配置,但真正的JMS连接是由JMS服务厂商提供的ConnectionFactory来创建的,Spring中的bean需要将这个实际的工厂实例注入到Spring容器中。 10. 发布和订阅...

    JMS配置文档

    应用程序可以通过编程方式(使用JMS API)或者通过JNDI查找来访问连接工厂和队列,从而实现消息的发送和接收。 总的来说,WebLogic中的JMS配置是一项关键任务,它确保了基于消息的通信能够在分布式环境中有效地进行...

    JMS578最新固件(188.02.00.01)

    而其他版本如“46.01.00.01”、“00.02.00.03”和“133.02.00.02”则可能是针对特定问题的修正或不同阶段的改进,确保了在不同环境下设备的稳定运行。 绿联作为知名的数据连接解决方案提供商,其易驱线产品凭借优秀...

    GoldenGate With JMS

    - 使用较旧版本的Weblogic(如Weblogic 10.3),以避免出现兼容性问题。 - 新版本的Weblogic(如11g)可能不包含必要的类,如`weblogic/security/subject/AbstractSubject`。 2. **生成JMS客户端**: - 进入...

    JMS578 Datasheet (Rev. 1.01).pdf

    此外,手册中提供的信息并不构成或暗示任何形式的许可或授权,其提供的信息以“现状”为基础,JMicron不对由此手册中信息的任何直接或间接使用造成的损害负责。 总的来说,JMS578的详细数据手册为工程师和技术人员...

    JMS583 最新固件 v00.02.01.03

    4. `583烧入教程.xlsx`:这份教程可能是详细指导用户如何进行固件烧录的文档,包括步骤、注意事项和常见问题解答。 5. `log`:通常这是一个日志文件,记录了固件升级过程中的详细信息,对于排查问题非常有用。 6. `...

    Spring JMS消息处理-不基于JNDI

    JNDI通常用于查找JMS资源,如ConnectionFactory和Destination,但在某些环境中,我们可能需要避免使用JNDI,例如在本地开发或测试时。 首先,让我们了解JMS的基本概念。JMS是一个Java API,定义了生产、消费、队列...

Global site tag (gtag.js) - Google Analytics