ActiveMQ 是apache的一个开源JMS服务器,不仅具备标准JMS的功能,还有很多额外的功能。公司里引入ActiveMQ后,ActiveMQ成里我们公司业 务系统中最重要的一个环节。所有应用都通过jms集成,如果ActiveMQ出了故障,整个系统就瘫痪了。因此,头对ActiveMQ的性能,可靠性,以 及如何正确使用,是非常的关心的,而我就被指派来做关于ActiveMQ的调研,本文对此做了些总结。
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,就用单台,通过硬件冗余保证数据不会丢失,并找另外一台刀片机做冷备,在主服务器失效时顶替。
http://sulong.me/archives/207
比 如说:订单创建后,发送一条消息到一个队列,另一个专门发邮件的程序接受队列里消息,给用户发送邮件。事实上,所有需要给用户发邮件的地方都只要给这个队 列里发送消息就可以了。 这样做的好处在于,用户不用等到邮件发送结束,就可以先看到订单创建结果。整个系统中只有一处对立发邮件功能,其它应用都只要向这个应用发消息就行了。
异 步调用的本质是可以让调用者在被调用者完成之前返回,这样调用者不用等待被调用者完成调用。所以异步的第一个用途就是用来提高响应速度。比如我前面的例子 里,用户确认创建订单后,他只要知道订单被创建好了就行了,订单创建后的发邮件等一系列的事情是否发生,有没有成功执行,他不关心。用户在感觉上就是响应 速度提升了。
至于你说的可扩展性,伸缩性,等等,都得建立在他们可以异步的基础上。比如,用户登录功能,用户在提交过登录信息后,就得马上见到是否登录成功,你不能告诉他你正在登录中,半个小时候来看结果。这个时候就算异步可以提升XX性,也是不能采用的。
再 次,采用异步后,并不意味着就能在扩展性,伸缩性或运行效率上的提升。扩展性主要是靠良好的程序设计来实现。在良好的程序设计的基础上,你才容易在不改动 或较少改动原有代码的基础上编写出新功能。如果程序设计得不好,即便用了异步,也不容易添加新的功能。异步也只能提升系统中那些可以异步的应用的伸缩性, 并不一定能提升整个系统的伸缩性。比方说,如果发送邮件服务器的负载太高,我们可以添加新的服务器来监听消息发邮件,发送邮件的应用伸缩性是提高了;如果 创建订单应用由于设计上的原因不能通过简单的加入服务器就可以支持更多的负载,那么创建订单应用的伸缩性并没有因为异步发送邮件而有多大的改善。对于整个 系统来说,伸缩性并没有太大的改善。最后,运行效率有很多具体的指标,我觉得异步确实提升了响应速度,但是对其它的指标可能也没有多少改善。
相关推荐
发布于2013-4-23ActiveMQ是apache的一个开源JMS服务器,不仅具备标准...及如何正确使用,是非常的关心的,而我就被指派来做关于ActiveMQ的调研,本文对此做了些总结。一下所述的问题,不仅是对ActiveMQ,对于其他的JMS
### Delphi ActiveMQ 使用帮助 #### 一、简介 Delphi ActiveMQ 使用帮助文档主要介绍了如何在 Delphi 开发环境中使用 HabariActiveMQClient 库与 Apache ActiveMQ 消息中间件进行交互的方法。这份文档提供了从安装...
4. **连接ActiveMQ**:使用ActiveMQ的Java API或客户端库(如MQTT-Demo中的MQTT协议)建立SSL连接时,你需要指定使用SSL协议并提供必要的认证信息。例如,使用Paho MQTT Java客户端库,你可以这样设置连接参数: ```...
详细讲解企业项目中ActiveMQ使用经验 ActiveMQ与Tomcat整合 分布式ActiveMQ集群开发详解 ActiveMQ集群配置方法 在Spring下集成ActiveMQ ActiveMQ中间件实现实时消息传递第13讲-使用ActiveMQ与Sping框架整合案例
测试团队由具备JMeter使用经验以及熟悉ActiveMQ特性的彭楚雄和聂志组成。 4. 测试过程与方法 4.1 第一轮(GUI模式) 在GUI模式下,首先进行小规模的压力测试,逐步增加并发用户数量,观察ActiveMQ的吞吐量、延迟和...
### ActiveMQ-CPP 开发手册知识点详述 ...掌握了 CMS 的基本原理和 ActiveMQ-CPP 的使用方法后,开发者就能够更高效地构建复杂的应用系统,并利用消息队列的强大功能来优化应用程序的性能和可靠性。
根据给定的文件信息,以下是从...无论是对于初学者还是有经验的开发者来说,这本书都提供了从理论到实践的全面指导,帮助读者掌握ActiveMQ的核心概念和实际操作技能,从而在分布式系统设计和开发中发挥关键作用。
这篇博客"ActiveMQ问题解决记录"可能涵盖了作者在使用ActiveMQ过程中遇到的问题以及解决这些问题的经验分享。 首先,让我们了解一下ActiveMQ的基本概念。ActiveMQ作为消息中间件,它充当应用程序之间的桥梁,负责...
**ActiveMQ实战(英文版)** ...总之,《ActiveMQ实战(英文版)》是一本全面介绍ActiveMQ的实用指南,无论你是初学者还是有经验的开发者,都能从中获得宝贵的知识,提升你在分布式系统中的消息处理能力。
ActiveMQ是中国最流行的开源消息中间件之一,它基于开放标准的...通过这些资料,用户可以系统性地学习和掌握ActiveMQ,从基本的安装配置到复杂的架构设计,从理论知识到实战经验,全面提高在消息中间件领域的专业技能。
#### ActiveMQ使用入门 对于初次接触ActiveMQ的用户而言,启动ActiveMQ并建立连接是最基本的操作。首先,确保ActiveMQ服务已启动,然后通过客户端程序建立连接,使用JMS API发送或接收消息。这一过程虽然简单,但却...
总的来说,《ActiveMQ In Action》及其源码是学习和掌握ActiveMQ不可或缺的参考资料,无论你是初学者还是经验丰富的开发者,都能从中受益匪浅。通过学习和实践,你可以更好地利用ActiveMQ构建可靠、高效的分布式系统...
Apache ActiveMQ 是一款高度可扩展且功能强大的消息中间件,它是Apache软件基金会的一部分,完全开源且免费...无论你是初学者还是经验丰富的开发者,深入理解并熟练掌握ActiveMQ都将极大地提升你的系统设计和实现能力。
"资源达人分享计划"的标签表明这是一个社区共享的资源,意味着你可以在社区中寻求帮助,或者分享你对ActiveMQ的理解和经验。研究和理解ActiveMQ的源码不仅能提升你的消息中间件知识,还能加深对Java编程、分布式系统...
ActiveMQ是Apache软件基金会开发的一款开源...无论你是初学者还是经验丰富的开发者,都能从中获益,提升对ActiveMQ的理解和使用能力。通过深入学习这些文档,你可以更好地利用ActiveMQ来构建健壮、可扩展的分布式系统。
在本文中,我们将深入探讨如何在Visual Studio 2017(简称VS2017)环境下成功配置和测试ActiveMQ-CPP,并分享2018年12月30日的测试经验。 首先,要开始使用ActiveMQ-CPP,我们需要确保我们的开发环境已经正确地设置...
ActiveMQ社区活跃,许多问题可能已经由其他用户解决并分享了经验。 总结来说,Apache ActiveMQ作为一款强大的消息中间件,能有效支持Windows环境下的消息传输,提供Web管理界面便于管理和监控,且具有高度可配置性...