1. 消费端集群消费(负载均衡)

 示例代码:

  1. /**
  2. * Producer,发送消息
  3. *
  4. */
  5. public class Producer {
  6. public static void main(String[] args) throws MQClientException, InterruptedException {
  7. DefaultMQProducer producer = new DefaultMQProducer("message_producer");
  8. producer.setNamesrvAddr("192.168.32.135:9876;192.168.32.136:9876");
  9. producer.start();
  10.  
  11. for (int i = 0; i < 100; i++) {
  12. try {
  13. Message msg = new Message("TopicTest",// topic
  14. "Tag1",// tag
  15. ("Hello RocketMQ " + i).getBytes()// body
  16. );
  17. SendResult sendResult = producer.send(msg);
  18. System.out.println(sendResult);
  19. }
  20. catch (Exception e) {
  21. e.printStackTrace();
  22. Thread.sleep(1000);
  23. }
  24. }
  25.  
  26. producer.shutdown();
  27. }
  28. }
  29.  
  30. /**
  31. * Consumer,订阅消息
  32. */
  33. public class Consumer1 {
  34.  
  35. public Consumer1() {
  36. try {
  37. DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("message_consumer");
  38. consumer.setNamesrvAddr("192.168.32.135:9876;192.168.32.136:9876");
  39. consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
  40. consumer.subscribe("TopicTest", "Tag1||Tag2||Tag3");
  41. consumer.registerMessageListener(new Listener());
  42. consumer.start();
  43. } catch (MQClientException e) {
  44. // TODO Auto-generated catch block
  45. e.printStackTrace();
  46. }
  47. }
  48.  
  49. class Listener implements MessageListenerConcurrently {
  50.  
  51. @Override
  52. public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
  53. try {
  54. for (MessageExt msg : msgs) {
  55. String topic = msg.getTopic();
  56. String msgBody = new String(msg.getBody(), "utf-8");
  57. String tags = msg.getTags();
  58. System.out.println("收到消息:" + " topic:" + topic + " msgBody:" + msgBody + " tags:" + tags);
  59.  
  60. System.out.println("======暂停=====");
  61. Thread.sleep(60000);
  62. }
  63. } catch (Exception e) {
  64. e.printStackTrace();
  65. return ConsumeConcurrentlyStatus.RECONSUME_LATER;
  66. }
  67.  
  68. return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
  69. }
  70.  
  71. }
  72.  
  73. public static void main(String[] args) throws InterruptedException, MQClientException {
  74. Consumer1 consumer1 = new Consumer1();
  75. System.out.println("Consumer1 Started.");
  76. }
  77. }
  78.  
  79. /**
  80. * Consumer,订阅消息
  81. */
  82. public class Consumer2 {
  83.  
  84. public Consumer2() {
  85. try {
  86. DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("message_consumer");
  87. consumer.setNamesrvAddr("192.168.32.135:9876;192.168.32.136:9876");
  88. consumer.subscribe("TopicTest", "Tag1||Tag2||Tag3");
  89. consumer.registerMessageListener(new Listener());
  90. consumer.start();
  91. } catch (MQClientException e) {
  92. // TODO Auto-generated catch block
  93. e.printStackTrace();
  94. }
  95. }
  96.  
  97. class Listener implements MessageListenerConcurrently {
  98.  
  99. @Override
  100. public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
  101. try {
  102. for (MessageExt msg : msgs) {
  103. String topic = msg.getTopic();
  104. String msgBody = new String(msg.getBody(), "utf-8");
  105. String tags = msg.getTags();
  106. System.out.println("收到消息:" + " topic:" + topic + " msgBody:" + msgBody + " tags:" + tags);
  107. }
  108. } catch (UnsupportedEncodingException e) {
  109. e.printStackTrace();
  110. return ConsumeConcurrentlyStatus.RECONSUME_LATER;
  111. }
  112.  
  113. return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
  114. }
  115.  
  116. }
  117.  
  118. public static void main(String[] args) throws InterruptedException, MQClientException {
  119. Consumer2 consumer2 = new Consumer2();
  120. System.out.println("Consumer2 Started.");
  121. }
  122. }

一个生产者,两个消费者,注意两个消费者的组名要一样。

先启动两个消费者(customer1,customer2),通过控制台查看如下:

再启动生产者生成100条消息,消费情况如下:

生成的100条消息被customer1和customer2平均的消费了。可以通过consumer.setAllocateMessageQueueStrategy去设置分配策略。

BTW:这是默认的模式,可以通过consumer.setMessageModel设置,MessageModel.CLUSTERING | MessageModel.BROADCASTING,如果是广播消费,则每个客户端都会收到生产端的所有消息

2.消息未响应会重发

代码示例:

  1. public class Producer {
  2. public static void main(String[] args) throws MQClientException, InterruptedException {
  3. DefaultMQProducer producer = new DefaultMQProducer("message_producer");
  4. producer.setNamesrvAddr("192.168.32.135:9876;192.168.32.136:9876");
  5. producer.start();
  6.  
  7. for (int i = 0; i < 1; i++) {
  8. try {
  9. Message msg = new Message("TopicTest",// topic
  10. "Tag1",// tag
  11. ("Hello RocketMQ " + i).getBytes()// body
  12. );
  13. SendResult sendResult = producer.send(msg);
  14. System.out.println(sendResult);
  15. }
  16. catch (Exception e) {
  17. e.printStackTrace();
  18. Thread.sleep(1000);
  19. }
  20. }
  21.  
  22. producer.shutdown();
  23. }
  24. }
  25.  
  26. public class Consumer1 {
  27.  
  28. public Consumer1() {
  29. try {
  30. DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("message_consumer");
  31. consumer.setNamesrvAddr("192.168.32.135:9876;192.168.32.136:9876");
  32. consumer.subscribe("TopicTest", "Tag1||Tag2||Tag3");
  33. consumer.registerMessageListener(new Listener());
  34. consumer.start();
  35. } catch (MQClientException e) {
  36. // TODO Auto-generated catch block
  37. e.printStackTrace();
  38. }
  39. }
  40.  
  41. class Listener implements MessageListenerConcurrently {
  42.  
  43. @Override
  44. public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
  45. try {
  46. for (MessageExt msg : msgs) {
  47. String topic = msg.getTopic();
  48. String msgBody = new String(msg.getBody(), "utf-8");
  49. String tags = msg.getTags();
  50. System.out.println("收到消息:" + " topic:" + topic + " msgBody:" + msgBody + " tags:" + tags);
  51.  
  52. System.out.println("======暂停=====");
  53. Thread.sleep(600000);
  54. }
  55. } catch (Exception e) {
  56. e.printStackTrace();
  57. return ConsumeConcurrentlyStatus.RECONSUME_LATER;
  58. }
  59.  
  60. return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
  61. }
  62.  
  63. }
  64.  
  65. public static void main(String[] args) throws InterruptedException, MQClientException {
  66. Consumer1 consumer1 = new Consumer1();
  67. System.out.println("Consumer1 Started.");
  68. }
  69. }
  70.  
  71. public class Consumer2 {
  72.  
  73. public Consumer2() {
  74. try {
  75. DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("message_consumer");
  76. consumer.setNamesrvAddr("192.168.32.135:9876;192.168.32.136:9876");
  77. consumer.subscribe("TopicTest", "Tag1||Tag2||Tag3");
  78. consumer.registerMessageListener(new Listener());
  79. consumer.start();
  80. } catch (MQClientException e) {
  81. // TODO Auto-generated catch block
  82. e.printStackTrace();
  83. }
  84. }
  85.  
  86. class Listener implements MessageListenerConcurrently {
  87.  
  88. @Override
  89. public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
  90. try {
  91. for (MessageExt msg : msgs) {
  92. String topic = msg.getTopic();
  93. String msgBody = new String(msg.getBody(), "utf-8");
  94. String tags = msg.getTags();
  95. System.out.println("收到消息:" + " topic:" + topic + " msgBody:" + msgBody + " tags:" + tags);
  96. }
  97. } catch (UnsupportedEncodingException e) {
  98. e.printStackTrace();
  99. return ConsumeConcurrentlyStatus.RECONSUME_LATER;
  100. }
  101.  
  102. return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
  103. }
  104.  
  105. }
  106.  
  107. public static void main(String[] args) throws InterruptedException, MQClientException {
  108. Consumer2 consumer2 = new Consumer2();
  109. System.out.println("Consumer2 Started.");
  110. }
  111. }

先启动consumer1,再启动consumer2,最后启动producer

consumer1收到了消息,consumer2没有收到消息,这时把consumer1强制停止,也就是说consumer1不会给MQ返回响应,查看结果:

consumer2也收到消息了,说明在MQ没收到消费端响应的情况下,会重发消息。

3. 修改topic的队列数

默认的队列数是4个,可以从执行结果中看出:queueId都是0-3

细节可以看https://www.cnblogs.com/dyfh/p/4113677.html

可以增加设置producer.createTopic("TopicTest", "TopicTest", 8);

 

RocketMQ(2)的更多相关文章

  1. RocketMQ原理解析-Remoting

    Remoting2. 通信层底层传输协议 RocketMq服务器与客户端通过传递RemotingCommand来交互,通过NettyDecoder,对RemotingCommand进行协议的编码与解码 ...

  2. RocketMQ原理解析-Broker

    broker 1. broker的启动 brker的启动 Broker向namesrv注册 1. 获取namesrv的地址列表(是乱序的) 2. 遍历向每个namesrv注册topic的配置信息top ...

  3. RocketMQ原理解析-Consumer

    consumer 1.启动 有别于其他消息中间件由broker做负载均衡并主动向consumer投递消息,RocketMq是基于拉模式拉取消息,consumer做负载均衡并通过长轮询向broker拉消 ...

  4. RocketMQ原理解析-Producer

    producer  producer 1.启动流程 Producer如何感知要发送消息的broker即brokerAddrTable中的值是怎么获得的, 1. 发送消息的时候指定会指定topic,如果 ...

  5. 分布式开放消息系统(RocketMQ)的原理与实践

    分布式消息系统作为实现分布式系统可扩展.可伸缩性的关键组件,需要具有高吞吐量.高可用等特点.而谈到消息系统的设计,就回避不了两个问题: 消息的顺序问题 消息的重复问题 RocketMQ作为阿里开源的一 ...

  6. rocketmq生产者和消费者

    1.生产者: package com.ebways.mq.test.mq; import com.alibaba.rocketmq.client.exception.MQClientException ...

  7. rocketmq查看命令

    首先进入 RocketMQ 工程,进入/RocketMQ/bin   在该目录下有个 mqadmin 脚本 .  查看帮助:   在 mqadmin 下可以查看有哪些命令    a: 查看具体命令的使 ...

  8. rocketmq生产者部署的机器注意事项

    报错: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'warningP ...

  9. Kafka vs RocketMQ——多Topic对性能稳定性的影响-转自阿里中间件

    引言 上期我们对比了RocketMQ和Kafka在多Topic场景下,收发消息的对比测试,RocketMQ表现稳定,而Kafka的TPS在64个Topic时可以保持13万,到了128个Topic就跌至 ...

  10. Kafka vs RocketMQ—— Topic数量对单机性能的影响-转自阿里中间件

    引言 上一期我们对比了三类消息产品(Kafka.RabbitMQ.RocketMQ)单纯发送小消息的性能,受到了程序猿们的广泛关注,其中大家对这种单纯的发送场景感到并不过瘾,因为没有任何一个网站的业务 ...

随机推荐

  1. <MySQL>入门四 事务控制语言 TCL

    -- TCL /* Transcation Control Language 事务控制语言 事务:一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行 案例:转账 name ...

  2. Java基础学习总结(78)——Java main方法深入研究学习

    1.不用main方法如何定义一个类? 不行,没有main方法我们不能运行Java类. 在Java 7之前,你可以通过使用静态初始化运行Java类.但是,从Java 7开始就行不通了. 2.main() ...

  3. Leetcode 123.买卖股票的最佳时机III

    买卖股票的最佳时机III 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意: 你不能同时参与多笔交易(你 ...

  4. Android NumberProgressBar:动态移动显示百分比进度的进度条

     Android NumberProgressBar:动态移动显示百分比进度的进度条 NumberProgressBar是github上一个开源项目,其项目主页是:https://github.c ...

  5. image url to base64

    image url to base64 https://www.base64-image.de/ https://www.browserling.com/tools/image-to-base64 h ...

  6. 【Java基础】Java基本数据类型与位运算

    1.赋值运算符 赋值使用操作符“=”.它的意思是“取右边的值(即右值),把它复制给左边(即左值)”.右值可以是任何 常数.变量或者表达式 (只要它能 生成 一个值就行).但左值必须是一个明确的,已命名 ...

  7. java数组知识总结(一)//按类

    在线api  目录: 零/数组(基本元素) 1.  声明一个数组 2.  创建一个数组 3.  数组名.length 4.  数组的引用 一/java.lang.reflect.Array     / ...

  8. 通过JQUERY获取SELECT OPTION中选中的值

    遇到一样学一样. 一个是取KEY,一个是取VALUE,一个是取所有文本. var dbuser_select = $("#dbuser_select option:selected" ...

  9. Ubuntu 16.04常用快捷键(转)

    注意:在Linux下Win键就是Super键 启动器 Win(长按) 打开启动器,显示快捷键 Win + Tab 通过启动器切换应用程序 Win + 1到9 与点击启动器上的图标效果一样 Win + ...

  10. Memcached高可用方案收集(集群及分布式)

    Memcached的集群方案有很多,不止magent一个,但是单靠集群软件去实现高可用感觉还是会缺少一步,最推荐的方案应该是软件加编码去实现高可用,至少能保证站点的99.5%的可运行行,以下是集群的方 ...