关于ActiveMQ 消息吞吐量的如何优化?

问题描述

最近公司想对公司应用结构进行优化,对现在架构中很多耗费资源严重且耗时比较长的应用间大数据量同步通信的接口进行优化,讨论决定引入消息中间件,网上浏览了一圈最后锁定ActiveMQ,在网上看到很多关于ActiveMQ的测试分析文档,大部分测试结果 AMQ的每秒吞吐量大概都在2000以上甚至更多,但是我在公司服务器上面测试的数据并不是很理想,有点让人头疼,不能够达到峰值,甚至在多线程下速度极速下降,效率方面有点不能让人接受,想看看有没有更好的优化配置。 下面是我的Amq的配置: [size=large;] 单机服务器:CPU :8个 内存:16G 系统:Linux Red Hat Amq版本:5.5.1[/size]${activemq_base}/conf/activemq.xml :配置 [color=blue]<broker xmlns="http://activemq.apache.org/schema/core" brokerName="pure_master" destroyApplicationContextOnStop="true" persistent="true" useJmx="true"> <destinationPolicy> <policyMap><policyEntries><policyEntry topic=">" producerFlowControl="false" memoryLimit="16mb" optimizedDispatch="true"><dispatchPolicy><strictOrderDispatchPolicy /></dispatchPolicy><subscriptionRecoveryPolicy><lastImageSubscriptionRecoveryPolicy /></subscriptionRecoveryPolicy> </policyEntry><policyEntry queue=">" producerFlowControl="false" memoryLimit="16mb" optimizedDispatch="true"> </policyEntry> </policyEntries> </policyMap> </destinationPolicy> <managementContext> <managementContext createConnector="false"/> </managementContext> <persistenceAdapter> <kahaDB directory="/opt/activemq_data/kahadb_master" indexWriteBatchSize="1000" journalMaxFileLength="32mb" enableIndexWriteAsync="true" enableJournalDiskSyncs="false"/> </persistenceAdapter> <systemUsage> <systemUsage sendFailIfNoSpaceAfterTimeout="3000"> <memoryUsage> <memoryUsage limit="128 mb"/> </memoryUsage> <storeUsage> <storeUsage limit="15 gb" name="dbstore"/> </storeUsage> <tempUsage> <tempUsage limit="128 mb"/> </tempUsage> </systemUsage> </systemUsage> <transportConnectors> <transportConnector name="openwire" uri="tcp://192.168.2.215:61616"/> </transportConnectors> </broker> <import resource="jetty.xml"/>[/color]JVM设置:[color=black] /opt/java/jdk1.6.0_29/bin/java -server -Xmx2g -Xms2g -XX:SurvivorRatio=8 -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError -XX:ErrorFile=/opt/mqdata/logfile/dump.log -XX:+UseParNewGC -XX:MaxTenuringThreshold=1 -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.2.215 -Dorg.apache.activemq.UseDedicatedTaskRunner=true -Djava.util.logging.config.file=logging.properties -Dcom.sun.management.jmxremote -Dactivemq.classpath=/opt/work/activemq/conf; -Dactivemq.home=/opt/work/activemq -Dactivemq.base=/opt/work/activemq -jar /opt/work/activemq/bin/run.jar start[/color]单机模式下测试流程:只对queue进行测试, 1、broker和producer、consumer 都是分离开得 ,一台服务器专门做broker的主机服务器。 2、使用activemq在example下提供的例子在另一台服务器(8核,16G)进行消息生产 3、1个producer 没有consumer 的情况下,消息大小:1K,非持久化消息,每秒大概在2500左右,1000W以后大概每秒1500/s左右4、1个peoducer 没有consumer,消息大小:1K,持久化消息(kaha),每秒 1200-1500左右,内存到1G左右时,缩减到800-1000左右/s5、1个producer,1个consumer,消息大小:1K,持久化消息(kaha),每秒1200左右,持续稳定在这个状况6、5个producer,5个consumer,消息大小:1K,持久化消息(kaha)、每秒在1000左右/s 持续7、p:1,c:1, 消息大小:1024K,持久化消息,每秒在700-900/s8、p:5,c:5,消息大小:1024,持久化消息,每秒大概在700左右/s[size=small;]二、:Pure Master-Slave 模式[/size]配置:硬件配置:主从都一样,8 CPU,16G内存Master 配置与单机模式一样Slave 只是在<broker> 中增加了masterConnectorURI="tcp://192.168.2.215:61616" shutdownOnMasterFailure="false"ActiveMQ 内存分配为2G只对queue进行测试,1、1个producer 没有consumer 的情况下,消息大小:1K,持久化消息,每秒大概在1000左右,内存过半(1G)时,大概在500-700左右2、1个producer,1个consumer,消息大小:1K,持久化消息(kaha),每秒800-1000左右,持续稳定在这个状况3、5个producer,5个consumer,消息大小:1K,持久化消息(kaha)、每秒在500-800左右/s 持续4、p:1,c:1, 消息大小:1024K,持久化消息,每秒在700左右/s5、p:5,c:5,消息大小:1024,持久化消息,每秒大概在500左右/s这是我现在的测试结果.但是这个结果让我不是很满意,想问问大家在配置ActiveMQ 的时候 我是否有配置有耗时的地方,还可以在那些方面进行优化。公司的方案倾向于Pure Master-Slave模式但是这种模式有 双向存储的性能消耗,也想问问大家在应用方面那种模式更好一些,初步预算在生产环境为两个服务器。希望大家能帮忙解决下问题 ,谢谢啊 问题补充:283433775 写道

解决方案

引用公司内部使用的系统来架设MQ服务器,想说如果像我上面测试中的吞吐量结果,在大约3K人左右使用的内部系统中,是否能够满足并发处理的需求? 还有正常来说MQ服务器,比如说RabbitMQ 或者openMQ等正常的吞吐量大概维持在多少,请问下有测试过,或者您工作中理想的峰值、平均值是多少? 抱歉,其实我们也只是刚才调研没多久,只是了解了一下几个MQ之间,并且怎么使用,真正的性能测试,暂时还没有做呢,所以不能提供给你具体信息了,我对他们具体的效率问题还不是太清楚。你还是上网上找一找把。
解决方案二:
1. 你的调用程序是你自己写的吗?确认瓶颈不是出在程序上,你是用自带的example跑起来的吗?2. 其实ActiveMQ在网上很多人使用时都说了,并不是很好,肯定这方面多多少少有缺陷。其实RabbitMQ是Erlang推出的,并且是工业标准,我更建议用这个。

时间: 2024-10-03 00:19:11

关于ActiveMQ 消息吞吐量的如何优化?的相关文章

ActiveMQ消息传送机制以及ACK机制详解 AcitveMQ是作为一种消息存储和分发组件,涉及到client与broker端数据交互的方方面面,它不仅要担保消息的存储安全性,还要提供额外的

ActiveMQ消息传送机制以及ACK机制详解     AcitveMQ是作为一种消息存储和分发组件,涉及到client与broker端数据交互的方方面面,它不仅要担保消息的存储安全性,还要提供额外的手段来确保消息的分发是可靠的.   一. ActiveMQ消息传送机制     Producer客户端使用来发送消息的, Consumer客户端用来消费消息:它们的协同中心就是ActiveMQ broker,broker也是让producer和consumer调用过程解耦的工具,最终实现了异步RPC

【转】ActiveMQ消息传送机制以及ACK机制详解

本文转载自 http://shift-alt-ctrl.iteye.com/blog/2020182 AcitveMQ是作为一种消息存储和分发组件,涉及到client与broker端数据交互的方方面面,它不仅要担保消息的存储安全性,还要提供额外的手段来确保消息的分发是可靠的.   一. ActiveMQ消息传送机制     Producer客户端使用来发送消息的, Consumer客户端用来消费消息:它们的协同中心就是ActiveMQ broker,broker也是让producer和consu

ActiveMQ消息队列

什么是MQ? 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们.消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术(如:WebService).排队指的是应用程序通过队列来通信.队列的使用除去了接收和发送应用程序同时执行的要求. 为什么要用MQ? 1.调用异步化,提高服务器性能 在不使用消息队列的情况下,用户的请求数据直接写入数据库,

ActiveMQ消息队列介绍(转)

ActiveMQ是一个开源兼容Java Message Service (JMS) 1.1面向消息的中件间. 来自Apache Software Foundation. ActiveMQ提供松耦合的应用程序架构. 先来看两个应用通过RPC通讯的紧耦合: 通过面向消息的中件间, 架构演变为: 我们看到应用程序1发送message到中件间, 应用程序2从中件间接收message. ActiveMQ提供了灵活的应用程序架构. ActiveMQ消息存储也是FIFO: 什么时候使用ActiveMQ: 1.

ActiveMQ消息队列侦听的问题

问题描述 实现MessageListener接口,重写onMessage()方法来侦听信息,只是不明白为什么ActiveMQ自带的例子程序侦听程序启动之后不会停止,除非我手动停止该线程.我自己仿照的却会很快停止,自己写的源代码如下(仿照ActiveMQ自带的点对点通讯的例子),主方法是最下面的testReceiveMessage()希望高手分析分析:packagecom.sjhr.jms.activemq;importjava.util.ArrayList;importjava.util.Arr

activemq消息积累,请教原因

问题描述 我们系统使用ActiveMQ作用两个系统间的交互.现在的问题是,每发送几个消息(个数不定),就有一个消息被mq放到pending里,队列的消费者始终读不了这个消息.时间长了,pending的数量就缓慢的增长.什么情况下消息会被MQ留下来,不能收走呢? 解决方案 解决方案二:是最新版本吗?有没有可能是它自身的一个bug解决方案三:消息数据被持久化,每条消息都能被消费,没有监听QUEUE地址也能被消费,数据不会丢失,一对一的发布接受策略,保证数据完整.一个消息只能由一个消费者消费:消息消费

JMS ActiveMQ 消息丢失

问题描述 对于单点故障情况断线期间所有消息自动丢弃请教一下各位大虾是如何解决类似问题的 问题补充:<div class="quote_title">zhanjia 写道</div><div class="quote_div">消息发送端设置为:PERSISTENT<br />PERSISTENT(持久化)的消息在JMS服务器中持久化.<br /><br />JMSDeliveryMode <

MSN机器人发送消息时的性能优化

问题描述 现在正在做MSN机器人,但是做完之后发觉机器人发送消息的速度响应非常慢,当有多个人同时向机器人发送消息时,有可能得不到你需要的消息.求高人指点 解决方案 解决方案二:把发送的消息放在队列里当前一个人的请求没有回复时下一人的请求等待设置请求超时时间超时机器人发送请求失败的消息再执行下一人的请求解决方案三:我是放在消息队列里的,也设置了请求超时时间,但还是会出现lag解决方案四:我也在学习msn机器人,你的问题会不会是同步问题啊.

ActiveMQ消息传送模型

  无论采用哪种JMS 组件,JMS 支持两种截然不同的消息传送模型:PTP(即点对点模型)和Pub/Sub(即发布/订阅模型),分别称作:PTP Domain 和Pub/Sub Domain. PTP(使用Queue即队列目标)     消息从一个生产者传送至一个消费者.在此传送模型中,目标是一个队列.消息首先被传送至队列目标,然后根据队列传送策略,从该队列将消息传送至向此队列进行注册的某一个消费者,一次只传送一条消息.可以向队列目标发送消息的生产者的数量没有限制,但每条消息只能发送至.并由一