rocketmq知识点总结

RocketMQ——Producer篇:发送顺序消息

顺序消息主要是指局部顺序,即生产者通过将某一类消息发送至同一个队列来实现。与发生普通消息相比,在发送顺序消息时要对同一类型的消息选择同一个队列,即同一个MessageQueue对象。 
目前RocketMQ定义了选择MessageQueue对象的接口MessageQueueSelector,里面有方法select(final List mqs, final Message msg, final Object arg),并且RocketMQ默认实现了提供了两个实现类SelectMessageQueueByHash和SelectMessageQueueByRandoom,即根据arg参数通过Hash或者随机方式选择MessageQueue对象。 
为了业务层根据业务需要能自定义选择规则,也可以在业务层自定义选择规则,然后调用DefaultMQProducer.send(Message msg, MessageQueueSelector selector, Object arg)方法完成顺序消息的方式。 
与普通消息的发送方法DefaultMQProducer.send(Message msg)相比,在仅仅在选择MessageQueue对象上面有区别,DefaultMQProducer.send(Message msg, MessageQueueSelector selector, Object arg)方法最终调用DefaultMQProducerImpl.sendSelectImpl(Message msg, MessageQueueSelector selector, Object arg, CommunicationMode communicationMode, SendCallback sendCallback, long timeout)方法,其中 communicationMode等于SYNC,timeout等于DefaultMQProducer.sendMsgTimeout,默认为3秒(表示发送的超时时间为3秒),大致逻辑如下: 
1、检查DefaultMQProducerImpl的ServiceState是否为RUNNING,若不是RUNNING状态则直接抛出MQClientException异常给调用者; 
2、校验Message消息对象的各个字段的合法性,其中Message对象的body的长度不能大于128KB; 
3、以Message消息中的topic为参数调用DefaultMQProducerImpl.tryToFindTopicPublishInfo(String topic)方法从topicPublishInfoTable变量中获取TopicPublishInfo对象; 
4、若上一步获取的TopicPublishInfo对象不为空,并且该对象的List队列也不为空,则执行下面的消息发送逻辑,否则抛出MQClientException异常; 
5、调用请求参数MessageQueueSelector对象的select(final List mqs, final Message msg, final Object arg)方法选择MessageQueue对象,其中arg参数为send方法中的arg参数,mqs等于TopicPublishInfo对象的List队列;根据此参数来HASH或随机或者自定义规则的方式从List列表中选择MessageQueue对象; 
6、若MessageQueue对象不为null,则调用sendKernelImpl(Message msg, MessageQueue mq, CommunicationMode communicationMode, SendCallback sendCallback, long timeout)进行消息的发送工作;

http://blog.csdn.net/meilong_whpu/article/details/76946562

 

 

 

rocketmq宕机试验测试

http://blog.csdn.net/lovesomnus/article/details/51769977

 

3.

深入理解 RocketMQ

  本文对RocketMQ的仅做理论性阐述,以便更深入的理解RocketMQ的内部机制,遇到棘手的问题更容易入手解决。关于代码实战请参考鄙人的另一篇文章:RocketMQ 入门使用详解

1. RocketMQ的负载均衡:
          RocketMQ采用轮询所有队列的方式确定消息发送到哪一个队列,RocketMQ提供了两种消息队列轮询(MessageQueueSelector)方式,一种是根据Hash值进行轮询(即
SelectMessageQueueByHash implements MessageQueueSelector),另一种是随机方式(即SelectMessageQueueByRandoom implements MessageQueueSelector)。

          

 

                                         图片来源于:分布式开放消息系统(RocketMQ)的原理与实践

         具体源码如下:          

[java] view plain copy

  1. private SendResult sendSelectImpl(Message msg, MessageQueueSelector selector, Object arg, CommunicationMode communicationMode, SendCallback sendCallback, long timeout) throws MQClientException, RemotingException, MQBrokerException, InterruptedException {  
  2.     this.makeSureStateOK();  
  3.     Validators.checkMessage(msg, this.defaultMQProducer);  
  4.     TopicPublishInfo topicPublishInfo = this.tryToFindTopicPublishInfo(msg.getTopic());  
  5.     if(topicPublishInfo != null && topicPublishInfo.ok()) {  
  6.         MessageQueue mq = null;  
  7.   
  8.         try {  
  9.             mq = selector.select(topicPublishInfo.getMessageQueueList(), msg, arg);  
  10.         } catch (Throwable var11) {  
  11.             throw new MQClientException("select message queue throwed exception.", var11);  
  12.         }  
  13.   
  14.         if(mq != null) {  
  15.             return this.sendKernelImpl(msg, mq, communicationMode, sendCallback, timeout);  
  16.         } else {  
  17.             throw new MQClientException("select message queue return null.", (Throwable)null);  
  18.         }  
  19.     } else {  
  20.         throw new MQClientException("No route info for this topic, " + msg.getTopic(), (Throwable)null);  
  21.     }  
  22. }  

 

 

      2.RocketMQ的消费者获取重复消息的问题

        RocketMQ目前不能够保证消息重复消息的不出现,如果业务方严格要求不重复,则业务方需要自己处理消息重复的问题,具体方式如下: 

                2.1 消费者处理MQ消息时必须幂等性(即无论接收到多少相同的消息,执行后的结果一致),如果不具有幂等性,则转换成幂等性处理方法;

                2.2  业务方自己保证每条发送到RocketMQ消息都有唯一的ID,这样消费者根据消息的唯一ID去重,并确保消息处理成功。

------------------------------------------------------------

 

 

 

集群消费

集群消费是指,一个consumer group下的consumer,平均消费topic下的queue。具体如何平均可以看一下下面的架构图,这里先用文字简单描述一下。假如一个topic下有4个queue,然后当前有一个consumer group,该分组下有4个consumer,那每个consumer就被分配到该topic下的一个queue,这样就达到了平均消费topic下的queue的目的。如果consumer group下只有两个consumer,那每个consumer就消费2个queue。如果有3个consumer,则第一个消费2个queue,后面两个每个消费一个queue,从而达到尽量平均消费。所以,可以看出,我们应该尽量让consumer group下的consumer的数目和topic的queue的数目一致或成倍数关系。这样每个consumer消费的queue的数量总是一样的,这样每个consumer服务器的压力才会差不多。当前前提是这个topic下的每个queue里的消息的数量总是差不多多的。这点我们可以对消息根据某个用户自己定义的key来进行hash路由来保证。

http://www.360doc.com/content/16/0113/21/1073512_527694205.shtml

 

 

-------------------------------------------

 

顺序发送到一个队列 分配队列给特定消费者 (不是很完善)

这样,所有的消息会根据消息的尾号,轮询的落到相应的queue上。参考图2,假设id=10001231,由于一共有20个queue,所以10001231%20=11,故消息会落到broker-b queue-1上。 
图2

这个图看出一个topic上面队列可以大于4 并且 队列选取取得是总个数取模  %20

还可以看出 生产的消息都被发到了master上面(然后异步复制到slave上面) 消费者从master上面的队列获取信息,如果master当掉,去对应的slave的里面队列获取消息

 

参考 http://blog.csdn.net/a417930422/article/details/51198531

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值