一、Broker集群部署方式:

1、单Master:这种方式风险较大,一旦 BrokerBroker Broker 重启或者宕机时,会导致整个服务不可用 ,不建议线上使用

2、多Master,无Slave:

优点:配置简单,性能最高

缺点:单台机器宕机期间,这台机器上未被消费的消息在恢复之前不可订阅,消息实时性会受到影响。多master多slave方式一台master宕机后,在回复之前可以从slave里消费,master恢复后再同步slave

3、多Master多Slave,异步复制   主备有短暂消息延迟,毫秒级

优点:性能同多Master几乎一样,实时性高,主备间切换对应用透明,不需人工干预

缺点:Master宕机或磁盘损坏时会有少量消息丢失

4、多Master多Slave,同步双写  主备都写成功,向应用返回成功

优点:服务可用性与数据可用性非常高
缺点:性能比异步集群略低,当前版本主宕备不能自动切换为主

二、RocketMq消息永远持久化,即producer发送的消息,consumer未消费,关机后重启仍然存在。

三、启动顺序先启consumer,再启producer。否则会产生重复消费的问题

四、consumer消息的消费方式是一条一条消费的,虽然api上定义的是list,即使设置了批量消费size

consumer.setConsumeMessageBatchMaxSize(10);
consumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
                ConsumeConcurrentlyContext context) {
                System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs);
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
});

 先启动producer,再启动consumer消费消息时setConsumeMessageBatchMaxSize会起作用,进行批量消费

五、消息重试机制,包含producer的重试和consumer的重试

producer重试指生产者发送消息队列超时的重试,有默认配置,隔多久重试,会一直循环重试

consumer重试包含超时重试和exception重试

超时重试指消息队列发送consumer消息超时的重试,同producer重试机制,间隔一定时间重试,无限循环重试

exception重试指consumer消费代码抛出了异常返回ConsumeConcurrentlyStatus.RECONSUME_LATER;

可通过如下机制处理:

consumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
                ConsumeConcurrentlyContext context) {
                System.out.print("message size:" + msgs.size() + "  ");
                MessageExt message = msgs.get(0);
                try {
                    if(message != null) {
                        String topic = message.getTopic();
                        String tags = message.getTags();
                        String body = new String(message.getBody(),"UTF-8");
                        System.out.println("topic:" + topic +",tags:" + tags + ",body:" + body);
                        if("Hello RocketMQ 5".equals(body)) {
                            System.out.print(",msg:" + message);
                            int a = 5/0;
                        }
                    }
                } catch (Throwable e) {
                    e.printStackTrace();
                    if(message.getReconsumeTimes() > 2) {  //超过两次,记录日志,返回成功
                        //TODO logger.error("...");
                        System.out.println("重试次数超过2次...");
                        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
                    }
                    return ConsumeConcurrentlyStatus.RECONSUME_LATER;
                }
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });

 六、消费模式:广播和负载均衡,默认负载均衡方式

consumer.setMessageModel(MessageModel.BROADCASTING);  //广播

七、broker配置storePathCommitLog和storePathConsumeQueue作用

storePathCommitLog=/usr/local/rocketmq/store/commitlog  持久化存储消息

storePathConsumeQueue存储消息在commitLog中的位置信息,方便consumer快速查找消费

八、双consumer c1 c2消费,其中一个宕机再重启后可能产生重复消费问题,消费端代码需做幂等性控制

九、RocketMq里的一个很重要的概念就是GroupName。无论生产端还是消费端都必须指定一个groupname,主要用于负责均衡用的,制定了groupname,生产端或消费端一台宕机后,broker就会找groupname的另一台进行生产或消费。groupName在jvm维度上必须唯一。生产端和消费端的groupName可以不同。groupname维护在应用系统级别上,一类producer集合的名称,通常会发送一类消息,且发送逻辑一致。消费端也是如此。

 十、每个topic主题表示一个逻辑上存储的概念。而在其MQ上有与之对应的多个Queue队列,这是物理存储的概念