rocketmq注意点

来源:互联网 发布:阿里云免费ssl 编辑:程序博客网 时间:2024/06/01 18:12
1.消费者与生产者如何负载均衡

生产者发送:
重试3次,循环负载。其中一台broker挂了,如果存在另外一台broker有这个topic则往这台发送。
思者:borker单点,可以布署多组master,slave。每组master都有这个topic。这样保证某个组的broker master挂了后,业务还能正常进行。

消费者根据消费者个数及topic下对应queue个数进行负载均衡。

2.防止业务上broker的单点
布署多组master,slave。
每个topic在每组都有分布,如果其中一组的master挂了,只会暂时不能消费这组的消息消费。

3.消息最大值
最大4g,一个消息索引由以下几个字段构成:
commitOffset:8个字节
size: 4个字节
tag的hash code:8个字节,用于设置过滤。

4.消息查询
根据消息key查询出来的结果,不一定就是要找的消息,原因是可能存在消息hash冲突。
所以查询后,客户端还是要比较下对应返回结果是否就是要查找的key.

5.消息过滤tag
服务端只会根据tag的hashcode进行过滤,所以客户端还要再过滤一遍。

6.slave是不是冷备?
不是,如果发现某个consumer访问了堆积在磁盘的消息时,会指示这个consumer去slave拉取数据。
long diff = this.getMaxPhyOffset() - maxPhyOffsetPulling;//commitlog最大偏移量 - 当前正在拉取的最大偏移量long memory = (long) (StoreUtil.TotalPhysicalMemorySize * (this.messageStoreConfig.getAccessMessageInMemoryMaxRatio() / 100.0)); //物理内存*40%getResult.setSuggestPullingFromSlave(diff > memory);//建议是否从slave拉取。

7.顺序消费如何实现
业务上有订单创建,订单更新,订单修改消息,要保证消费顺序。
两个方案:
方案一:
发送者将同一订单号的消息发往同一个broker同一个queue。一个消费者顺序消费。
实现:
  producer.send(msg, new MessageQueueSelector() {
@Override
public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
String orderId=(String)arg; 
    int orderIdNum=Integer.valueOf(orderId); //orderId不一定能转成long
int res=orderIdNum%mqs.size();
return mqs.get(res);
}
}, "orderId");

方案二:
业务消费去做状态控制,如果遇到当前订单消息跨消息状态了,暂不消费。
不可取,会阻塞其它业务订单的处理。

8.如果需要搭建一个rocketmq,怎么做?
分析业务需求场景,业务量,对消息的可靠性要求,及时性要求。
金融行业对消息可靠性要求高(当然指的是核心业务)。
对于消息的可靠性需要以下几种设置:
1.避免单点,包括可写入的master以及消息存储的单点,这时可部署多组master,slave
2.消息持久化可以是同步刷盘(看核心业务是否真的需要)

容量规则:
每台broker最大处理容量(接收存储消息的最大值以及接收消费者拉取消息的量)。以及单台broker的物理内存。
看业务消息量,如果压测时超出这个broker最大值可能会压跨,所以需要根据压测结果看是否需要多台master。
并且如果带宽出现瓶颈也需要多台master。
9.broker master挂了如何处理?
broker挂了后,消费会从slave取。
如果只有一组的话,这时消息的生产者不能写入,会影响正常业务。
挂了后,需要将master恢复。因为有可能有部分消息没有同步到slave,所以如果采用将slave提升为master可能会造成消息丢失。
10.不支持主从自动切换
风险点,因此需要布署多组master,slave。

11.如果想增加两个topic的消费者,怎么做,会有哪些风险点?
可能会造成消息消费重复。
例:
原先一个topic有4个队列,两台消费者:a,b;
a分别消费:0,1队列;b消费:2,3队列。
如果这个时候增加两个新的消费者c,d,那么最终消费者与队列关系如下:
a消费0队列,b消费1队列,c消费2队列,d消费3队列。
这时假设,1队列的消息offset为我10000,commitOffset为8000,然后a正在消费第8001个消息但未完成提交ack。
由于a还在处理未提交消费完的ack,所以这时b认为1队列要从8000开始消费,所以就重复了。

建议业务上做幂等。

12.新增一个topic的消费组时,默认会消费历史消息吗?
不会,默认策略是从消息队列尾部,即跳过历史消息。
如果想消费历史消息,则需要设置:ConsumeFromWhere

有以下三种值:
CONSUME_FROM_LAST_OFFSET //默认策略,从该队列最尾开始消费,即跳过历史消息CONSUME_FROM_FIRST_OFFSET //从队列最开始开始消费,即历史消息(还储存在broker的)全部消费一遍CONSUME_FROM_TIMESTAMP//从某个时间点开始消费,和setConsumeTimestamp()配合使用,默认是半个小时以前

设置代码:
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);

12.单个broker master性能出现瓶颈怎么办?



原创粉丝点击