rabbitmq 对多服务器p2p模式配置的一个测试
一直对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 相当于阻塞队列 多个线程同时处理,各吃掉一部分队列的数据,起到了分流的效果
当然每个消费者那里还可以在起动线程池来处理各自接收的数据。
高并发情况下 这种配置也是可以减轻各个服务器压力