rocketmq注意点

xiaoxiao2021-02-28  111

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性能出现瓶颈怎么办?
转载请注明原文地址: https://www.6miu.com/read-61374.html

最新回复(0)