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、日誌監控(ELK)
8、下單、訂單分發、搶票
本作品採用《CC 協議》,轉載必須註明作者和本文連結