RocketMQ 發送普通消息有三種實現方式:可靠同步發送
、可靠異步發送
、單向(Oneway)發送
。html
注意
:順序消息只支持可靠同步發送。java
GitHub地址
: https://github.com/yudiandemingzi/SpringBootBloggit
原理
:同步發送是指消息發送方發出數據後,會在收到接收方發回響應以後才發下一個數據包的通信方式。github
應用場景:此種方式應用場景很是普遍,例如重要通知郵件、報名短信通知、營銷短信系統等。服務器
原理
:異步發送是指發送方發出數據後,不等接收方發回響應,接着發送下個數據包的通信方式。 消息隊列 RocketMQ 的異步發送,須要用戶實現異步發送回調接口(SendCallback)。app
應用場景:異步發送通常用於鏈路耗時較長,對 RT 響應時間較爲敏感的業務場景,例如批量發貨等操做。異步
原理
:單向(Oneway)發送特色爲發送方只負責發送消息,不等待服務器迴應且沒有回調函數觸發,即只發送請求不等待應答。 此方式發送消息的過程耗時很是短,通常在微秒級別。async
應用場景:適用於某些耗時很是短,但對可靠性要求並不高的場景,例如日誌收集。ide
下表歸納了三者的特色和主要區別。函數
發送方式 | 發送 TPS | 發送結果反饋 | 可靠性 |
---|---|---|---|
同步發送 | 快 | 有 | 不丟失 |
異步發送 | 快 | 有 | 不丟失 |
單向發送 | 最快 | 無 | 可能丟失 |
@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 同步和異步發送是有返回信息的,單項發送是沒有返回信息的。
只要本身變優秀了,其餘的事情纔會跟着好起來(上將3)