RocketMq(1) -初探RocketMq

RocketMq的介紹

RocketMq是阿里巴巴公司研發的一款消息中間間,雖然它支持的消息類型就只有一種,就是發佈/訂閱的模式。它是參照rabbitmq實現的,但是RocketMq爲我們提供了一個非常重要的一個概念,那就是組。在一個組中我們可以定義多個消費者,生產者,當有多條信息發送過來時,會把信息平均分配給組內的所有成員,感覺就像是天生的負載均衡。但是我們可以通過設置消費者的消息類型,是廣播的方式還是集羣的方式。

首先我們會先安裝RocketMq,

安裝RocketMq可以參照我的博文在linux下安裝rocketmq

接下來我們開始實現一個簡單的消息的發送以及消費者(無序)

下面是生產者的代碼

    //定義一個生產者,並制定生產者的組名 MyDemo
    DefaultMQProducer defaultMQProducer=new DefaultMQProducer("MyDemo");
    //設置生成者中有幾個隊列數
    defaultMQProducer.setDefaultTopicQueueNums(1);
    //指定nameserver的地址
    defaultMQProducer.setNamesrvAddr("47.106.132.60:9876");
    //啓動生產者
    defaultMQProducer.start();
    for (int i=0;i<10;i++){
        //構建一個Message對象,第一個參數是Topic,
        // 第二個參數是tag,標籤,可以通過該參數進行選擇消息
        //第三個參數是消息體
        Message message=new Message("MyTop","MyTag",("你好啊,這是第"+(i+1)+"條消息").getBytes());
        //使用send發送消息,並返回sendResult,裏面包含發送狀態,信息Id,信息所在隊列,某個Topic.某個Mq,
        SendResult sendResult=defaultMQProducer.send(message);
        System.out.println(sendResult);
        Thread.sleep(1000);

    }
    //關閉消息生成者
    defaultMQProducer.shutdown();

消費者的代碼

     //指定消費者的組名
    DefaultMQPushConsumer consumer=new DefaultMQPushConsumer("MyConsumeDemo");
    //設置nameserver的地址
    consumer.setNamesrvAddr("47.106.132.60:9876");
    //指定從何處開始讀取消息
    //CONSUME_FROM_FIRST_OFFSET 總是從隊列的頭部讀取消息
    //CONSUME_FROM_LAST_OFFSET 總是從隊列的最後位置讀取消息
    //CONSUME_FROM_TIMESTAMP 指定從某個時間開始讀取消息
    //consumer.setConsumeTimestamp()配合 CONSUME_FROM_TIMESTAMP使用
    consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
    //設置消費者消費信息的模式
    //BROADCASTING 廣播的方式,就是每個組中的成員都會收到所有的消息
    //CLUSTERING 集羣的方式,消息會平均的分配到每個組的所有成員,但是組之間還是會獲取到所有信息
    consumer.setMessageModel(MessageModel.BROADCASTING);
    //指定消費者從哪裏獲取消息
    //第一個參數 是指從那個Topic中獲取消息
    //第二個參數 是指從某個Topic下的某個表現中獲取消息,多個使用"|"分割,*代表訂閱這個Topic中所有的tag
    consumer.subscribe("MyTop","MyTag");
    //註冊處理消息的事件
    consumer.registerMessageListener(new MessageListenerConcurrently() {
        public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
            for (MessageExt messageExt:list){
                try {
                    System.out.println(new String(messageExt.getBody(),"utf-8"));
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            }
            //必須返回消息處理的狀態
            //CONSUME_SUCCESS 處理成功
            //RECONSUME_LATER 處理失敗或者稍後重試,這可以用來處理消費者的發生異常時信息的處理
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        }
    });
    //開始監聽
    consumer.start();

如何實現消息發送失敗的重試

  1. 在生產者這邊就只需要修改幾個地方就可以實現消息的失敗重試,
    1.1 指定失敗重試的次數

    //指定消息發送失敗重試的次數,我們可以通過啓動日誌可以看到消息重試的時間間隔
     defaultMQProducer.setRetryTimesWhenSendFailed(3);
    

    1.2 指定失敗後是否使用其他的broker發送消息,默認爲 false,
    1.3 在發送消息時,我們會指定相應的時間,在多少時間之內失敗,會重試

    defaultMQProducer.send(msg,1000)
    
  2. 在消費者這怎麼處理消息失敗的問題
    2.1 第一種情況 消息沒有發送到消費者,Rocketmq內部會自動的重發,重試。
    2.2 第二種情況 當我們接受到信息,處理消息的時候發生了異常,我們可以通過返回 ConsumeConcurrentlyStatus.RECONSUME_LATER ;來讓消息重發,重新處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章