RocketMQ(6)---發送普通消息(三種方式)

發送普通消息(三種方式)

RocketMQ 發送普通消息有三種實現方式:可靠同步發送可靠異步發送單向(Oneway)發送html

注意順序消息只支持可靠同步發送java

GitHub地址: https://github.com/yudiandemingzi/SpringBootBloggit

1、概念

一、可靠同步發送

原理:同步發送是指消息發送方發出數據後,會在收到接收方發回響應以後才發下一個數據包的通信方式。github

應用場景:此種方式應用場景很是普遍,例如重要通知郵件、報名短信通知、營銷短信系統等。服務器

二、可靠異步發送

原理:異步發送是指發送方發出數據後,不等接收方發回響應,接着發送下個數據包的通信方式。 消息隊列 RocketMQ 的異步發送,須要用戶實現異步發送回調接口(SendCallback)。app

應用場景:異步發送通常用於鏈路耗時較長,對 RT 響應時間較爲敏感的業務場景,例如批量發貨等操做。異步

三、單向(Oneway)發送

原理:單向(Oneway)發送特色爲發送方只負責發送消息,不等待服務器迴應且沒有回調函數觸發,即只發送請求不等待應答。 此方式發送消息的過程耗時很是短,通常在微秒級別。async

應用場景:適用於某些耗時很是短,但對可靠性要求並不高的場景,例如日誌收集。ide

四、三種對比

下表歸納了三者的特色和主要區別。函數

發送方式 發送 TPS 發送結果反饋 可靠性
同步發送 不丟失
異步發送 不丟失
單向發送 最快 可能丟失


2、代碼示例

一、三種方式代碼示例

@Slf4j
@RestController
public class Controller {
    /**
     * 生產者組
     */
    private static String PRODUCE_RGROUP = "test_producer";
    /**
     * 建立生產者對象
     */
    private static DefaultMQProducer producer = null;

    static {
        producer = new DefaultMQProducer(PRODUCE_RGROUP);
        //不開啓vip通道 開通口端口會減2
        producer.setVipChannelEnabled(false);
        //綁定name server
        producer.setNamesrvAddr("47.99.03.25:9876");
        try {
            producer.start();
        } catch (MQClientException e) {
            e.printStackTrace();
        }

    }

    @GetMapping("/message")
    public  void  message() throws Exception {
        //一、同步
        sync();
        //二、異步
        async();
        //三、單項發送
        oneWay();
    }
    /**
     * 一、同步發送消息
     */
    private  void sync() throws Exception {
        //建立消息
        Message message = new Message("topic_family", ("  同步發送  ").getBytes());
        //同步發送消息
        SendResult sendResult = producer.send(message);
        log.info("Product-同步發送-Product信息={}", sendResult);
    }
    /**
     * 二、異步發送消息
     */
    private  void async() throws Exception {
        //建立消息
        Message message = new Message("topic_family", ("  異步發送  ").getBytes());
        //異步發送消息
        producer.send(message, new SendCallback() {
            @Override
            public void onSuccess(SendResult sendResult) {
                log.info("Product-異步發送-輸出信息={}", sendResult);
            }
            @Override
            public void onException(Throwable e) {
                e.printStackTrace();
                //補償機制,根據業務狀況進行使用,看是否進行重試
            }
        });
    }
    /**
     * 三、單項發送消息
     */
    private  void oneWay() throws Exception {
        //建立消息
        Message message = new Message("topic_family", (" 單項發送 ").getBytes());
        //同步發送消息
        producer.sendOneway(message);
    }
}

二、測試結果

這裏消費者代碼就不貼出來了。

經過這個很明顯能夠看出三種方式都被 Consumer 消費了。只不過對於 Product 同步和異步發送是有返回信息的,單項發送是沒有返回信息的。


參考

一、RocketMQ 阿里雲官網文檔



只要本身變優秀了,其餘的事情纔會跟着好起來(上將3)
相關文章
相關標籤/搜索