
如:注冊用戶這種服務,它可能解耦成好幾種獨立的服務(賬號驗證,郵箱驗證碼,手機短信碼等)。它們作為消費者,等待用戶輸入數據,在前臺數據提交之后會經過分解并發送到各個服務所在的url,分發的那個角色就相當于生產者。消費者在獲取數據時候有可能一次不能處理完,那么它們各自有一個請求隊列,那就是內存緩沖區了。做這項工作的框架叫做消息隊列。
又比如:電商系統中的訂單處理系統,傳統處理模式是:下訂單的時候,訂單系統可能會調用庫存系統的接口,這樣兩個系統之間存在一個嚴重依賴關系,如果庫存系統宕機,那么整個流程都會受到影響。現在大多公司的處理方法是:引入消息隊列,下完訂單,訂單系統完成持久化處理,將消息寫入消息隊列,返回用戶訂單下單成功。
幾個概念說明:
Broker:簡單來說就是消息隊列服務器實體。
Exchange:消息交換機,它指定消息按什么規則,路由到哪個隊列。
Queue:消息隊列載體,每個消息都會被投入到一個或多個隊列。
Binding:綁定,它的作用就是把exchange和queue按照路由規則綁定起來。
Routing Key:路由關鍵字,exchange根據這個關鍵字進行消息投遞。
vhost:虛擬主機,一個broker里可以開設多個vhost,用作不同用戶的權限分離。
producer:消息生產者,就是投遞消息的程序。
consumer:消息消費者,就是接受消息的程序。
channel:消息通道,在客戶端的每個連接里,可建立多個channel,每個channel代表一個會話任務。
消息隊列的使用過程大概如下:
(1)客戶端連接到消息隊列服務器,打開一個channel。
(2)客戶端聲明一個exchange,并設置相關屬性。
(3)客戶端聲明一個queue,并設置相關屬性。
(4)客戶端使用routing key,在exchange和queue之間建立好綁定關系。
(5)客戶端投遞消息到exchange。
exchange接收到消息后,就根據消息的key和已經設置的binding,進行消息路由,將消息投遞到一個或多個隊列里。
exchange也有幾個類型,完全根據key進行投遞的叫做Direct交換機,例如,綁定時設置了routing key為”abc”,那么客戶端提交的消息,只有設置了key為”abc”的才會投遞到隊列。對key進行模式匹配后進行投遞的叫做Topic交換機,符號”#”匹配一個或多個詞,符號”*”匹配正好一個詞。例如”abc.#”匹配”abc.def.ghi”,”abc.*”只匹配”abc.def”。還有一種不需要key的,叫做Fanout交換機,它采取廣播模式,一個消息進來時,投遞到與該交換機綁定的所有隊列。
RabbitMQ支持消息的持久化,也就是數據寫在磁盤上,為了數據安全考慮,我想大多數用戶都會選擇持久化。消息隊列持久化包括3個部分:
(1)exchange持久化,在聲明時指定durable => 1
(2)queue持久化,在聲明時指定durable => 1
(3)消息持久化,在投遞時指定delivery_mode => 2(1是非持久化)
如果exchange和queue都是持久化的,那么它們之間的binding也是持久化的。如果exchange和queue兩者之間有一個持久化,一個非持久化,就不允許建立綁定。
- 關于我
- laravel
- quickstart
- quickstart-intermediate
- swoole
- (一)快速起步
- php7
- swoole異步高性能
- 開發中常見問題
- event擴展的安裝
- phptrace
- 用C/C++寫php擴展
- 無聊的筆試題
- rewrite二級目錄轉二級域名
- php多進程
- rpc-yar
- php專家列表
- php守護進程
- php函數防止超時
- php分析報錯信息
- gdb調試php
- php-cli模式
- composer/pear
- 基礎
- sublime+xdebug
- 開啟opcache
- 前端
- js
- linux
- Xshell連接不上Ubuntu解決方式
- xshell
- centos安裝中文輸入
- centos下安裝谷歌瀏覽器
- centos安裝phpstorm
- php7之phpredis安裝
- 磁盤大小
- dns
- TCP/IP協議
- HTTP
- tcpdump
- zbacktrace
- gdb調試php擴展
- lsof
- perf
- lnmp
- first
- 重定向
- echo
- 鍵盤高效操作
- 權限控制
- 進程
- 環境變量
- vi
- 軟件包管理
- 網絡
- 查找文件
- 壓縮
- 正則
- sed/awk
- 編譯程序
- shell腳本
- shell認識
- sh腳本
- sh調試相關
- win共享文件夾給虛擬機
- git
- git的安裝
- 常用命令
- 本地到遠程倉庫
- 遠程到本地倉庫
- 分支管理
- bug分支
- feature
- 標簽
- 多人協作
- FAQ
- C/C++
- 難點
- 修飾符
- 數組
- 字符串
- 指針
- 引用
- 面向對象
- 類訪問修飾符
- 構造函數
- 操作文件
- mysql集群
- 使用navicat操作MySQL數據庫能不能整個數據庫搜索一條數據?
- 幫助的使用
- 存儲引擎的選擇
- 數據類型/字符集
- 索引
- kafka集群
- rabbitmq集群
- (一)初識rabbitmq
- (二)原理
- (三)消息模型
- (四)rabbitmq&php基礎
- (五)持久化&route&指定exchange
- (六)發布訂閱
- (七)route key
- (八)topic
- elasticsearch集群
- (一)服務端搭建
- (二)elasticsearch&php
- (三)head插件
- redis集群
- github
- 設計模式
- createType
- factory_method.php
- abstract_factory.php
- mysql_singleton.php
- builder.php
- prototype.php
- structType
- adapter.php
- 數據結構與算法
- python