`
- 浏览:
114330 次
- 性别:
- 来自:
苏州
-
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,就用单台,通过硬件冗余保证数据不会丢失,并找另外一台刀片机做冷备,在主服务器失效时顶替。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
4. **存储机制**:ActiveMQ可以使用文件系统、数据库或内存作为消息存储。源码中可以查看MessageStore的实现,了解消息的存储和检索策略。 5. **网络传输**:ActiveMQ支持网络集群,通过TCP/IP进行通信。源码分析...
《ActiveMQ及其依赖库的深度解析》 ActiveMQ,作为一款强大的开源消息中间件,是Apache软件基金会...掌握它们的原理和作用,不仅有助于我们顺利部署和运行ActiveMQ,还能为我们在更广泛的IT领域中积累宝贵的实践经验。
总的来说,"granite-server-activemq-3.0.4.GA.zip"和"common-angularjs.zip"这两个项目为IT专业人士提供了一个了解和实践消息中间件与前端框架的绝佳机会,无论你是初学者还是经验丰富的开发者,都可以从中受益匪浅...
Dubbo服务接口的设计原则(实战经验) Dubbo设计原理及源码分析 基于Dubbo构建大型分布式电商平台实战雏形 Dubbo容错机制及扩展性分析 分布式解决方案 分布式全局ID生成方案 session跨域共享及企业级单点登录...
这个"Apache Camel 开发使用指南中文版"压缩包文件很可能是为初学者和有经验的开发者准备的一份详细教程,帮助他们理解和掌握Apache Camel的核心概念和实际应用。 在学习Apache Camel时,首先要理解的是它的核心...
- **消息队列**:熟悉ActiveMQ消息队列技术。 - **搜索引擎**:了解ElasticSearch搜索引擎。 - **缓存管理**:接触过Redis缓存管理系统,处理分布式缓存和集群下session共享问题。 ### 工作经验 1. **杭州商快软件...
在四川鱼鳞图信息技术有限公司,张杰参与了省级和国家级接入系统开发,使用了Spring Boot、Spring Data、ActiveMQ、Quartz、Sftp、WebSocket和Mysql数据库。他的职责包括接入系统的转发管理、监控、定时任务编码,...
《XStream详解与应用》 XStream是一款强大的Java库,用于将对象序列化为XML,同时也能从XML数据中反序列化回对象。...无论你是新手还是经验丰富的开发者,都能从XStream的易用性和强大功能中受益。
9. **中间件技术**:如消息队列MQ(RabbitMQ、Kafka、ActiveMQ等)、缓存系统Redis、分布式服务框架Dubbo或Spring Cloud、负载均衡技术、分布式锁等。 10. **Java框架**:如Spring Boot的自动配置、AOP、IOC等核心...
### Camel in Action:核心概念与应用实践 #### 核心知识点概述 《Camel in Action》是一本关于Apache Camel框架的权威指南,本书由Claud ...无论您是新手还是有经验的开发者,都可以从中获得宝贵的经验和灵感。
1. 广创挖机配件开发项目:一个B2C的在线平台服务项目,使用了SpringMVC、Spring、MyBatis等开源框架进行开发。刘某某主要负责后台商品管理、前台首页、登录、搜索、购物车等模块。 2. 达远商贸信息化平台开发项目:...
使用消息队列(如RabbitMQ、Kafka或ActiveMQ)能有效地解耦无人机的各个组件,提高系统的可扩展性和容错性。Java有丰富的客户端库支持这些消息中间件。 6. **RESTful API设计** 设计清晰、规范的RESTful API是...
### Apache Camel 2.4.0 用户手册关键知识点解析 #### 一、引言 **Apache Camel** 是一个强大的开源集成框架,它基于已知的企业集成模式...无论是新手还是经验丰富的开发者,都能够从这份手册中找到有价值的信息。
为了使用Apache Camel 2.7.4,开发者需要在自己的Java项目中添加对应的依赖,这可以通过Maven或Gradle等构建工具来实现。在Maven中,可以在pom.xml文件中添加对应的dependency节点,引用Camel的2.7.4版本。然后,...
- 高级支持:为有经验的 Mule 开发者提供高级功能支持,如复杂的路由逻辑、转换规则等。 #### 三、MuleStudio 使用流程 1. **安装步骤**: - 下载 MuleStudio 安装包。 - 安装 Eclipse 或兼容的 IDE 并导入 ...
8. **消息队列**:为了处理高并发和消息顺序,开发者可能会引入消息队列(如RabbitMQ、ActiveMQ)来缓存和分发消息,提高系统的稳定性和可扩展性。 9. **安全性**:聊天系统必须考虑安全因素,包括数据加密、身份...
- **消息队列**:例如ActiveMQ,用于异步处理和解耦系统组件。 - **全文检索**:如Lucene/Solr,能够实现高效的文本搜索。 - **分布式文件存储**:如FastDFS,用于大规模数据的存储与访问。 - **定时任务框架**:如...
6. **JMS**:Java消息服务的理解,如何使用ActiveMQ或RabbitMQ进行消息传递。 7. **JTA与JPA**:分布式事务处理和实体管理框架,如Hibernate和MyBatis的使用。 8. **Web容器和应用服务器**:Tomcat、Jetty、...
在“如何迅速成为Java高手.doc”中,可能会详细阐述上述各个知识点的学习方法、实践建议和进阶技巧,包括时间管理、学习资源选择、项目经验积累等方面,帮助初学者快速提升Java EE技能。记住,持续学习和保持热情是...
在这个场景中,MQ扮演了消息传递的角色,一旦发现DNS状态异常,程序就会生成一条消息并将其发送到MQ,如RabbitMQ、Kafka或ActiveMQ等。消息内容可能包括DNS服务器的标识、异常类型、发生时间等信息。 在实现过程中...