RabbitMQ 使用場景

HuDu發表於2021-05-21

1.1 同步非同步問題(序列)

序列方式:將訂單資訊寫入資料庫成功後,傳送註冊郵件,再傳送簡訊。以上三個任務全部完成後,返回給客戶端。

public void makrOrder() {
    // 1.訂單儲存
    orderService.saveOrder();
    // 2.傳送簡訊服務
    messageService.sendSMS("order");
    // 3.傳送email服務
    emailService.sendEmail("order");
    // 4.傳送 APP 服務
    appService.sendApp("order");
}

1.2 並行方式 非同步執行緒池

並行方式:將訂單資訊寫入資料庫成功後,傳送註冊郵件的同時,傳送註冊簡訊。以上三個任務完成後,返回給客戶端。與序列的差別是,並行的方式可以提高處理的時間。

缺點:需要自己維護執行緒池、永續性、高可用,高可用都需要自己實現,最重要的是耦合在應用程式中。
public void makeOrder() {
    // 1.儲存訂單
    orderService.saveOrder();
    // 傳送
    relationMessage();
}

public void relationMessage() {
    // 非同步
    threadpool.submit(new Callable<Object>{
        public Object call() {
            // 傳送簡訊服務
            messageService.sendSMS("order");
        }
    });
    // 非同步
    threadpool.submit(new Callable<Object>{
        public Object call() {
            // 傳送email服務
            messageService.sendEmail("order");
        }
    });
    // 非同步
    threadpool.submit(new Callable<Object>{
        public Object call() {
            // 傳送email服務
            messageService.sendApp("order");
        }
    });
}

1.3 非同步訊息佇列

完全解耦,用 MQ 建立橋樑
有獨立的執行緒池和執行模組
出現了訊息坑會丟失,MQ 有持久化功能
如何保證訊息的可靠性,死信佇列和訊息轉移等
如果伺服器承載不了,需要自己去寫高可用,HA 映象模型高可用
public void makeOrder() {
    orderService.saveOrder();
    rabbitTemplate.convertSend("ex","2","訊息內容");
}

2、高內聚,低耦合

3、流量的削峰
4、分散式事務的可好消費和可靠生產
5、索引、快取、靜態化處理的資料同步
6、流量監控
7、日誌監控(ELK8、下單、訂單分發、搶票
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章