关闭

rabbitmq 对多服务器p2p模式配置的一个测试

973人阅读 评论(0) 收藏 举报
分类:

一直对rabbitmq p2p 模式的多服务器下做相同配置的 各个服务器数据接受情况比较好奇


今天有空测试了下 

xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     http://www.springframework.org/schema/rabbit
     http://www.springframework.org/schema/rabbit/spring-rabbit-1.0.xsd">
     
	<!--配置connection-factory,指定连接rabbit server参数 -->
	<rabbit:connection-factory id="connectionFactory"
		 port="5672"  username="guest" password="guest" host="127.0.0.1"
		/>
	
    
		<!--通过指定下面的admin信息,当前producer中的exchange和queue会在rabbitmq服务器上自动生成 -->
	<rabbit:admin connection-factory="connectionFactory" />
	
	<!--定义queue -->
	<rabbit:queue name="queueTest" durable="true" auto-delete="false" exclusive="false" />
	
		<!-- 定义direct exchange,绑定queueTest -->
	<rabbit:direct-exchange name="exchangeTest" durable="true" auto-delete="false">
		<rabbit:bindings>
			<rabbit:binding queue="queueTest" key="queueTestKey"></rabbit:binding>
		</rabbit:bindings>
	</rabbit:direct-exchange>
	
	<bean id="jsonMessageConverter"  
        class="org.springframework.amqp.support.converter.Jackson2JsonMessageConverter"></bean>
	
	<!--定义rabbit template用于数据的接收和发送 -->
	<rabbit:template id="amqpTemplate"  connection-factory="connectionFactory" 
	    exchange="exchangeTest"   message-converter="jsonMessageConverter" />
		
	  
	<!-- 消息接收者 -->
	<bean id="messageReceiver" class="com.bimatrix.revit.mq.MessageConsumer"></bean>
	
	<!-- queue litener  观察 监听模式 当有消息到达时会通知监听在对应的队列上的监听对象-->
    <rabbit:listener-container connection-factory="connectionFactory">
             <rabbit:listener queues="queueTest" ref="messageReceiver"/>
    </rabbit:listener-container>
	
</beans>
</pre><pre code_snippet_id="1702272" snippet_file_name="blog_20160531_4_8975174" name="code" class="html">
</pre><p></p><p>消费者:</p><p></p><pre code_snippet_id="1702272" snippet_file_name="blog_20160531_5_4133388" name="code" class="java">@Component
public class MessageConsumer implements MessageListener {
	
	private Logger logger = LoggerFactory.getLogger(MessageConsumer.class);
	int receiveNum =0 ;


	@Override
	public void onMessage(Message message) {
		receiveNum++ ;
		//logger.info("receive message:{}",message);
//		System.out.println("receive message:{}"+message);
		System.out.println("receive: "+receiveNum);
	}


}

测试代码:

@RunWith(value = SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath*:config/applicationContext.xml" })
public class TestQueue {
	@Autowired
	AmqpTemplate amqpTemplate;


	final String queue_key = "queueTestKey";


	@Test
	public void send() {
		try {
			//System.out.println("-----------------------------------------");
			for(int i=1;i<=1000;i++){
				amqpTemplate.convertAndSend(queue_key, i);
				//System.out.println(i);
			}
			//System.out.println("-----------------------------------------");
		} catch (Exception e) {
//			LOGGER.error(e);
		}
	}


连续发送1000条数据给消费者,同一台机器8080 9080端口各启动一个tomcat 代码完全一样,

接受情况

A 机器 receive: 481

receive: 57  不知道为什么分两次打出来 ,在两个输出界面一个tomcat console 一个是junit的测试输出console 

B 机器 receive: 462 


三者合计就是1000  再次测试总和也是对的


说明两台服务器在p2p的配置下 各接受了一部分生产者发送来的数据

再多服务器下配置p2p 相当于阻塞队列 多个线程同时处理,各吃掉一部分队列的数据,起到了分流的效果

当然每个消费者那里还可以在起动线程池来处理各自接收的数据。 

高并发情况下 这种配置也是可以减轻各个服务器压力


1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:545876次
    • 积分:8069
    • 等级:
    • 排名:第2521名
    • 原创:209篇
    • 转载:431篇
    • 译文:0篇
    • 评论:38条
    最新评论