一、消息隊列
消息隊列就是一種<code>先進先出</code>的資料機構
當在分布式系統中的時候,不同的機器需要做資料互動,是以涉及到不同機器之間的資料互動,這樣的話就需要借助專業的消息隊列,常見的消息隊列有 RabbitMQ 、Kafka...他們都是開源且支援語言較多。
消息隊列解決的問題:
應用解耦
流量消峰:
如果訂單系統一秒最多能處理一萬次訂單,這個處理能力在平時綽綽有餘,正常時段我們下單一秒後就能傳回結果。但是在高峰期,如果有兩萬次下單作業系統是處理不了的,隻能限制訂單超過一萬後不允許使用者下單。
但是使用消息隊列,就可以取消這個限制,把這一秒内的訂單放入隊列中分散成一段時間來處理,這樣使用者就可能在下單幾十秒後才能收到下單成功的操作,但是比不能下單要好。
消息分發:
當A發送一次消息,B對消息感興趣,就隻需監聽消息,C感興趣,C也去監聽消息,而A完全不需要改動。
異步消息(Celery 就是對消息隊列的分裝)
RabbitMQ 和 Kafka
RabbitMQ :吞吐量小,有消息确認(對消息可靠性有要求,就用它)
Kafka:吞吐量高,注重高吞吐量,不注重消息的可靠性,資料量特别大
二、按裝RabbitMQ
1、原生安裝:
2、docker拉取
三、基本使用
生産者:
消費者:
四、确認機制
消息确認機制其實就是消費者中 auto_ack 的設定
生産者不變
五、持久化
隊列持久化:就是在聲明隊列的時候,指定持久化<code>durable=True</code>,隊列必須是新的才可以
消息持久化:就是在釋出消息的時候添加
六、閑置消費
當正常情況下如果有多個消費者,那麼就會按照順序第一個消息給 第一個消費者,第二個消息給第二個消費者
但是當第一個消息的消費者處理資訊很耗時,一直沒有結束,那麼就可以讓第二個消費者優先擷取閑置消息。
七、釋出訂閱
釋出訂閱就是:我可以有多個訂閱者來訂閱你的消息,這樣釋出者隻需要釋出一條, 我的所有隻要訂閱你的人都可以消費你的消息
模型:當我的訂閱者起來了之後,就會建立一個隊列,多個訂閱者就會建立多個隊列,當釋出者生産了消息之後,會傳給 exchange ,然後 exchange 會把消息複制分别分發到訂閱者建立的隊列中,這樣就實作了隻要監聽你,那就能收到你發的消息。
釋出者:
訂閱者:啟動多次,都綁定到了同一個 exchange,是以就會都收到同一個 exchange 分發的消息
需要設定 exchange_type 的類型為 direct
并且在釋出消息的時候設定多個關鍵字:routing_key
在訂閱者中也需要設定 exchange_type 的類型 direct
并且當訂閱者綁定 exchange 的時候也需要設定 routing_key,
這樣的話在釋出者釋出消息後,exchange 會根據釋出者和訂閱者設定的 routing_key 進行比對,當訂閱者的 routing_key 比對上了釋出者的 routing_key 的話,那麼訂閱者就可以接收到釋出者釋出的消息,反之收不到消息。
消費者1:
消費者2:
在訂閱者綁定比對的時候可以進行模糊比對釋出者的 routing_key ,比對上了就能接收到釋出者釋出的消息
訂閱者:
八、python中的RPC架構
RPC :遠端過程調用
例如:兩個服務調用,服務1通過網絡調用服務2的方法。
自帶的:資料包大,速度慢
服務端:
用戶端:
第三方的:底層使用 ZeroMQ 和 MessagePack ,速度快,響應時間短,并發高。
學習之旅