中小型研發團隊架構實踐六:如何用好消息隊列RabbitMQ?

来源:https://www.cnblogs.com/supersnowyao/archive/2018/01/28/8370708.html
-Advertisement-
Play Games

一、寫在前面 使用過分散式中間件的人都知道,程式員使用起來並不複雜,常用的客戶端 API 就那麼幾個,比我們日常編寫程式時用到的 API 要少得多。但是分散式中間件在中小研發團隊中使用得並不多,為什麼會這樣呢? 原因是中間件的職責相對單一,客戶端的使用雖然簡單,但整個環境搭起來卻不容易。所以對於系列 ...


一、寫在前面

     使用過分散式中間件的人都知道,程式員使用起來並不複雜,常用的客戶端 API 就那麼幾個,比我們日常編寫程式時用到的 API 要少得多。但是分散式中間件在中小研發團隊中使用得並不多,為什麼會這樣呢?

     原因是中間件的職責相對單一,客戶端的使用雖然簡單,但整個環境搭起來卻不容易。所以對於系列中的幾篇中間件文章,我們重點放在解決門檻問題,把服務端環境搭好(後期可雲或運維解決),把中間件的基本職責和功能介紹好,把客戶端 Demo 寫好,讓程式員抬抬腳,在調試代碼中即可輕鬆入門。

     根據我們以往幾年的經驗,初次接觸也可以自主快速學習,文章和 Demo 以實用為主,以下是消息隊列 RabbitMQ 的快速入門及應用。

 

二、為什麼要用消息隊列 MQ

     1、業務系統往往要求響應能力特別強,能夠起到削峰填谷的作用。

     2、解耦:如果一個系統掛了,則不會影響另外系統的繼續運行。

     3、業務系統往往有對消息的高可靠要求,以及有對複雜功能如 Ack 的要求。

     4、增強業務系統的非同步處理能力,減少甚至幾乎不可能出現併發現象:

     使用消息隊列,就好比為了防汛而建葛洲壩,有大量數據的堆積能力,然後可靠地進行非同步輸出。例如:

    

     傳統做法存在如下問題,請見上圖:

  1. 一旦業務處理時間超過了定時器時間間隔,就會導致漏單。
  2. 如果採用新開線程的方式獲取數據,那麼由於大量新開線程處理,會容易造成伺服器宕機。
  3. 資料庫壓力大,易併發。

 

     使用 MQ 後的好處,請見上圖

  1. 業務可註冊、可配置。
  2. 獲取數據規則可配置。
  3. 成功消費 MQ 中的消息才會被 Ack,提高可靠性。
  4. 大大增強了非同步處理業務作業的能力:

     定時從資料庫獲取數據後,存入 MQ 消息隊列,然後 Job 會定期掃描 MQ 消息隊列,假設 Job 掃描後先預取 5 條消息,然後非同步處理這 5 條消息,也就是說這 5 條消息可能會同時被處理。

 

三、RabbitMQ 簡介

     RabbitMQ 是基於 AMQP 實現的一個開源消息組件,主要用於在分散式系統中存儲轉發消息,由因高性能、高可用以及高擴展而出名的 Erlang 語言寫成。

     其中,AMQP(Advanced Message Queuing Protocol,即高級消息隊列協議),是一個非同步消息傳遞所使用的應用層協議規範,為面向消息的中間件設計。

     RabbitMQ 特點如下

     高可靠:RabbitMQ 提供了多種多樣的特性讓你在可靠性和性能之間做出權衡,包括持久化、發送應答、發佈確認以及高可用性。

     高可用隊列:支持跨機器集群,支持隊列安全鏡像備份,消息的生產者與消費者不論哪一方出現問題,均不會影響消息的正常發出與接收。

     靈活的路由:所有的消息都會通過路由器轉發到各個消息隊列中,RabbitMQ 內建了幾個常用的路由器,並且可以通過路由器的組合以及自定義路由器插件來完成複雜的路由功能。

     支持多客戶端:對主流開發語言(如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等)都有客戶端實現。

     集群:本地網路內的多個 Server 可以聚合在一起,共同組成一個邏輯上的 broker。

     擴展性:支持負載均衡,動態增減伺服器簡單方便。

     許可權管理:靈活的用戶角色許可權管理,Virtual Host 是許可權控制的最小粒度。

     插件系統:支持各種豐富的插件擴展,同時也支持自定義插件,其中最常用的插件是 Web 管理工具 RabbitMQ_Management,可參考如下文章:https://www.cnblogs.com/gossip/p/4475978.html

 

四、RabbitMQ 工作原理

     消息從發送端到接收端的流轉過程即 RabbitMQ 的消息工作機制,請見下圖:

 

                                                           消息發送與接收的工作機制

 

五、RabbitMQ 基本用法

     共有 6 種基本用法:單對單、單對多、發佈訂閱模式、按路由規則發送接收、主題、RPC(即遠程存儲調用)。我們將介紹單對單、單對多和主題的用法。

1、單對單:單發送、單接收。請見下圖。

 

2、單對多:一個發送端,多個接收端,如分散式的任務派發。請見下圖:

 

3、主題:Exchange Type 為 topic,發送消息時需要指定交換機及 Routing Key,消費者的消息隊列綁定到該交換機並匹配到 Routing Key 實現消息的訂閱,訂閱後則可接收消息。只有消費者將隊列綁定到該交換機且指定的 Routing Key 符合匹配規則,才能收到消息。

     其中 Routing Key 可以設置成通配符,如:*或 #(*表示匹配 Routing Key 中的某個單詞,# 表示任意的 Routing Key 的消息都能被收到)。如果 Routing Key 由多個單片語成,則單詞之間用. 來分隔。

 

命名規範:

     交換機名的命名建議:Ex{AppID}.{自定義 ExchangeName},隊列名的命名建議:MQ{AppID}.{自定義 QueueName} 。

 

六、Demo 下載及更多資料

RabbitMQDemo 下載地址https://github.com/das2017/RabbitMQDemo

RabbitMQ 的官方網址http://www.rabbitmq.com

 

轉載地址:http://www.infoq.com/cn/articles/architecture-practice-02-rabbitmq?utm_source=infoq&utm_campaign=user_page&utm_medium=link


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首次接觸 ,就感覺非常棒。它節省了我們以前寫SQL語句的過程,同時也讓我們更加的理解面向對象的編程思想。最近學習了EF的增刪改查的過程,下麵給大家分享使用EF對增刪改查時如何處理的。 第一步:創建自定義的 來連接自己的資料庫。 1、新增操作 我們會根據前臺傳過來的實體信息對資料庫的表進行新增操作。對 ...
  • 為什麼要使用任務? 上一篇博客中提到了線程池ThreadPool,可以調用QueueUserWorkItem方法來發起一次非同步的操作。但是這個技術存在許多限制,最大的問題是沒有一個內建的機制讓你知道操作在什麼時候完成,也沒有一個機制在操作完成時獲得一個返回值。 為了剋服這些限制,微軟引入了Task的 ...
  • 使用C#代碼模擬web請求,是一種常用的方法,以前沒專門整理過,這裡暫時貼上自己整理的完整代碼,以後再做梳理: ...
  • NPOI導出EXCEL報_伺服器無法在發送 HTTP 標頭之後追加標頭 ...
  • 對象持久化到文本文件,策略是:將對象的屬性值打散,拆解,分別存儲。 序列化: 保存對象的"全景圖" 序列化是將對象轉換為可保存或可傳輸的格式的過程 三種: 二進位序列器: 對象序列化之後是二進位形式的,通過BinaryFormatter類來實現的,這個類位於System.Runtime.Serial ...
  • 第一部分: 如果在安裝的時候選中的是Window身份驗證,後來需要SQLServer身份驗證登錄,那麼 一、先用window賬號登錄資料庫 二、啟用window身份驗證和sql sever身份驗證方式 2.1 選中“實例”--右鍵--屬性--安全性--伺服器身份驗證--sql sever和windo ...
  • 內容概述 前面絮絮叨叨沒正事,到現在為止也沒有開始寫代碼,不過在考慮下貌似這一節還是開始不了。 B/S架構開發有一個特點,就是用瀏覽器打開,不同的用戶群體可能有不同的風格,不論是管理平臺還是普通的網站,也是有自己的風格。 我們要做這樣一個管理系統,風格上沒有客戶來約束要做什麼樣,那簡單處理,我們採用... ...
  • 先瞭解一個概念,CLR,以前認為CLR就只是一個軟體運行的環境,今天發現其實並不是這樣。每個.net程式都運行在一個完全獨立的CLR實例上,每個CLR都有一個線程池,當然一個進程也可以載入多個CLR。 為什麼要使用線程池,即比起直接新建線程的優勢在哪裡? 線程池其實就是一個存放線程對象的“池子(po ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...