1. 程式人生 > >MQ傳送普通訊息(三種方式)

MQ傳送普通訊息(三種方式)

MQ 傳送普通訊息有三種實現方式:可靠同步傳送、可靠非同步傳送、單向(Oneway)傳送。本文介紹了每種實現的原理、使用場景以及三種實現的異同,同時提供了程式碼示例以供參考。

  • 可靠同步傳送

    原理:同步傳送是指訊息傳送方發出資料後,會在收到接收方發回響應之後才發下一個數據包的通訊方式。sync-send

應用場景:此種方式應用場景非常廣泛,例如重要通知郵件、報名簡訊通知、營銷簡訊系統等。

  • 可靠非同步傳送

    原理:非同步傳送是指傳送方發出資料後,不等接收方發回響應,接著傳送下個數據包的通訊方式。MQ 的非同步傳送,需要使用者實現非同步傳送回撥介面(SendCallback),在執行訊息的非同步傳送時,應用不需要等待伺服器響應即可直接返回,通過回撥介面接收伺服器響應,並對伺服器的響應結果進行處理。

    async_send

    應用場景:非同步傳送一般用於鏈路耗時較長,對 RT 響應時間較為敏感的業務場景,例如使用者視訊上傳後通知啟動轉碼服務,轉碼完成後通知推送轉碼結果等。

  • 單向(Oneway)傳送

    原理:單向(Oneway)傳送特點為只負責傳送訊息,不等待伺服器迴應且沒有回撥函式觸發,即只發送請求不等待應答。此方式傳送訊息的過程耗時非常短,一般在微秒級別。

    oneway

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

下表概括了三者的特點和主要區別。

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

示例程式碼

同步傳送

  1. publicclassProducerTest{
  2. publicstaticvoid main(String[] args){
  3. Properties properties =newProperties();
  4. properties.put(PropertyKeyConst.ProducerId,"XXX");//您在控制檯建立的Producer ID
  5. properties.put
    (PropertyKeyConst.AccessKey,"XXX");// AccessKey 阿里雲身份驗證,在阿里雲伺服器管理控制檯建立
  6. properties.put(PropertyKeyConst.SecretKey,"XXX");// SecretKey 阿里雲身份驗證,在阿里雲伺服器管理控制檯建立
  7. properties.setProperty(PropertyKeyConst.SendMsgTimeoutMillis,"3000");//設定傳送超時時間,單位毫秒
  8. //PropertyKeyConst.ONSAddr地址請根據實際情況對應以下幾類進行輸入:
  9. //公共雲生產環境:http://onsaddr-internal.aliyun.com:8080/rocketmq/nsaddr4client-internal
  10. //公共雲公測環境:http://onsaddr-internet.aliyun.com/rocketmq/nsaddr4client-internet
  11. //杭州金融雲環境:http://jbponsaddr-internal.aliyun.com:8080/rocketmq/nsaddr4client-internal
  12. //杭州深圳雲環境:http://mq4finance-sz.addr.aliyun.com:8080/rocketmq/nsaddr4client-internal
  13. //亞太東南1公共雲環境(只適用於新加坡ECS):http://ap-southeastaddr-internal.aliyun.com:8080/rocketmq/nsaddr4client-internal
  14. properties.put(PropertyKeyConst.ONSAddr,
  15. "http://onsaddr-internal.aliyun.com:8080/rocketmq/nsaddr4client-internal");//此處以公共雲生產環境為例
  16. Producer producer =ONSFactory.createProducer(properties);
  17. // 在傳送訊息前,必須呼叫start方法來啟動Producer,只需呼叫一次即可
  18. producer.start();
  19. //迴圈傳送訊息
  20. for(int i =0; i <100; i++){
  21. Message msg =newMessage(//
  22. // Message所屬的Topic
  23. "TopicTestMQ",
  24. // Message Tag 可理解為Gmail中的標籤,對訊息進行再歸類,方便Consumer指定過濾條件在MQ伺服器過濾
  25. "TagA",
  26. // Message Body 可以是任何二進位制形式的資料, MQ不做任何干預,
  27. // 需要Producer與Consumer協商好一致的序列化和反序列化方式
  28. "Hello MQ".getBytes());
  29. // 設定代表訊息的業務關鍵屬性,請儘可能全域性唯一。
  30. // 以方便您在無法正常收到訊息情況下,可通過阿里雲伺服器管理控制檯查詢訊息並補發
  31. // 注意:不設定也不會影響訊息正常收發
  32. msg.setKey("ORDERID_"+ i);
  33. // 同步傳送訊息,只要不拋異常就是成功
  34. SendResult sendResult = producer.send(msg);
  35. System.out.println(sendResult);
  36. }
  37. // 在應用退出前,銷燬Producer物件
  38. // 注意:如果不銷燬也沒有問題
  39. producer.shutdown();
  40. }
  41. }

非同步傳送

  1. publicstaticvoid main(String[] args){
  2. Properties properties =newProperties();
  3. properties.put(PropertyKeyConst.AccessKey,"DEMO_AK");// AccessKey 阿里雲身份驗證,在阿里雲伺服器管理控制檯建立
  4. properties.put(PropertyKeyConst.SecretKey,"DEMO_SK");// SecretKey 阿里雲身份驗證,在阿里雲伺服器管理控制檯建立
  5. properties.put(PropertyKeyConst.ProducerId,"DEMO_PID");//您在控制檯建立的Producer ID
  6. properties

    相關推薦

    MQ傳送普通訊息方式

    MQ 傳送普通訊息有三種實現方式:可靠同步傳送、可靠非同步傳送、單向(Oneway)傳送。本文介紹了每種實現的原理、使用場景以及三種實現的異同,同時提供了程式碼示例以供參考。 可靠

    RocketMQ(6)---傳送普通訊息方式

    傳送普通訊息(三種方式) RocketMQ 傳送普通訊息有三種實現方式:可靠同步傳送、可靠非同步傳送、單向(Oneway)傳送。 注意 :順序訊息只支援可靠同步傳送。 GitHub地址: https://github.com/yudiandemingzi/SpringBootBlog 一、概念 1、可靠同步

    個執行緒輪流執行順序列印ABC,依次是ABCABCABC......方式

    1.使用synchronized悲觀鎖 (秋招阿里的一個筆試題,應該寫的比較複雜,然後就沒有然後了o(╥﹏╥)o) public class ThreadThreadp { private int flag = 0; public synch

    Java 指定執行緒執行順序方式

         方法一:通過共享物件鎖加上可見變數來實現。 public class MyService { private volatile int orderNum = 1; pub

    python如何不生成pyc檔案方式

    pyc檔案的生成是什麼情況下生成呢: 當 import匯入另一個模組的時候會生成 python3會生成 __pycache__ 如何不生成編譯檔案呢: 1.使用 -B引數 即 python3 -B

    Activiti 分配組任務方式

    方式一:定義流程時指定組任務候選人(該方式不夠靈活,使用較少) 方式二:使用流程變數指定組任務候選人 流程圖程式碼 <?xml version="1.0" encoding="UTF-8"?> <definitions

    Vue---兄弟元件通訊方式

    第一種:eventBus     新建一個js檔案, 我這裡叫做 bus.js,     檔案內容:           import Vue from 'vue';            export default new Vue();    然後在你需要觸發的 

    python之收集網站資料方式

    方式一:python之收集整個網站資料 目的: 建立一個爬蟲和資料收集程式(資料列印) 1:程式碼 # coding=utf-8 """ @author: jiajiknag 程式功能:收集整個網站資料 建立一個爬蟲和資料收集程式(

    Java 設計模式—工廠模式方式

      來看下它的組成:        1)抽象工廠角色: 這是工廠方法模式的核心,它與應用程式無關。是具體工廠角色必須實現的介面或者必須繼承的父類。在java中它由抽象類或者介面來實現。        2)具體工廠角色:它含有和具體業務邏輯有關的程式碼。由應用程式呼叫以建立對應的具體產品的物件。      

    分散式鎖的實現方式

    很多小夥伴在學習Java的時候,總是感覺Java多執行緒在實際的業務中很少使用,以至於不會花太多的時間去學習,技術債不斷累積!等到了一定程度的時候對於與Java多執行緒相關的東西就很難理解,今天需要探討的東西也是一

    Rocket MQ傳送訊息方式初析

    前言 MQ 傳送訊息有三種實現方式:可靠同步傳送、可靠非同步傳送、單向(Oneway)傳送。基於版本4.2.0+。注意:順序訊息只支援可靠同步傳送。 可靠同步傳送 原理:同步傳送是指訊息傳送方發出

    django-Ajax傳送POST請求csrf跨站請求的方式,檔案的上傳

    <h3>Ajax上傳檔案</h3> <p><input type="text" name="username" id="username" placeholder="username"></p> <p><input type="

    Vue 實現點選空白處隱藏某節點方式:指令、普通、遮罩

    在專案中往往會有這樣的需求: 彈出框(或Popover)在 show 後,點選空白處可以將其 hide。 針對此需求,整理了三種實現方式,大家按實際情況選擇。 當然,我們做專案肯定會用到 UI 框架,常見的 Element 中的元件提供了這樣的方法。 但是,就算使用框架,有些時候還是要用到的,比如: El

    單例模式新談包含方式

      設計模式是一套被反覆使用,多數人知曉,經過分類編目的,程式碼設計的總結,也可以說是前人的智慧結晶。學習設計模式能讓我們對一些應用場景使用相同的套路達到很好的效果,我會不定時更新一些自己對設計模式的理解的文章,從定義,實現,應用場景來說說設計模式,今天我要說的物件是單例模式一,定義  什麼是單例模式,字面理

    linux服務之nginx-隨筆-2nginx配置站點的方式

    三種方式: 1.域名  2.埠  3.IP 直接上配置檔案  一.域名  server { listen 80; server_name www.e

    四十一、瀑布流佈局js,jquery,css3方式

    一、 簡介 1. 實現瀑布流的方法: JavaScript 原生方法、 jquery 方法、 css3 的多欄佈局 二、js 原生方法實現 -- 思想 1. 瀑布流的特點: 等寬不等高 <

    js對url進行編碼和解碼方式區別

    *** 只有 0-9[a-Z] $ - _ . + ! * ' ( ) , 以及某些保留字,才能不經過編碼直接用於 URL。 ***例如:搜尋的中文關鍵字,複製網址之後再貼上就會發現該URL已經被轉碼。 1、escape 和 unescape 原理:對除ASCII字母、數字、標點符號 @  *  _  +

    Linux 中執行Shell 指令碼的方式方法

    Shell 指令碼的執行方式通常有如下三種: (1)bash script-name 或者 sh script-name;(2)path/script-name或者./script-name;(3)sourcescript-name或者. script-name。下面,分別

    Linux中執行Shell指令碼的方式方法

    Shell 指令碼的執行方式通常有如下三種:(1)bash script-name 或者 sh script-name;(2)path/script-name或者./script-name;(3)source script-name或者. script-name。下面,分別介

    C# 連線 Oracle 資料庫方式:OracleClient、ODBC、OLEDB

    1、OracleClient //基於.NET 2.0,只有2.0中包含OracleClient using System; using System.Collections; using System.ComponentModel; using System.Data;