天天看點

msf 生成php馬_PHP實作消息隊列MQ

1、MQ的應用場景

  優點:

    a)

主要解決異步消息

    b)

應用解耦

    c)

流量消峰等問題

    d)

日志處理(kafka)

  缺點:

    a)

系統可用性降低

:你想啊,本來其他系統隻要運作好好的,那你的系統就是正常的。現在你非要加個消息隊列進去,那

消息隊列挂了

,你的

系統不是呵呵了

。是以,系統可用性降低

    b)

系統複雜性增加

:要多考慮很多方面的問題,比如一緻性問題、如何保證消息不被

重複消費

,如何保證保證消息可靠傳輸。是以,需要考慮的東西更多,系統複雜性增大。

1、為什麼會造成重複消費?

因為

網絡傳輸等等故障

,确認資訊沒有傳送到消息隊列,導緻消息隊列不知道自己已經消費過該消息了,再次将該消息分發給其他的消費者。

2、解決重複消費的方案:

(1)比如,你拿到這個消息

做資料庫的insert操作

。那就容易了,給這個消息

做一個唯一主鍵

,那麼就算出現重複消費的情況,就會導緻主鍵沖突,避免資料庫出現髒資料。

(2)再比如,你拿到這個消息

做redis的set的操作

,那就容易了,不用解決,

因為你無論set幾次結果都是一樣的

,set操作本來就算幂等操作。

(3)如果上面兩種情況還不行,上大招。準備一個第三方媒體,來做消費記錄。以redis為例,給消息配置設定一個全局id,隻要消費過該消息,

将<id,message>以K-V形式寫入redis。那消費者開始消費前,先去redis中查詢有沒消費記錄即可。 2、消息模型 a)P2P(Point to Point)點對點模式(也就是一個任務隻能被一個消費者消費)

1、包含三個角色:消息隊列(Queue),發送者(Sender),接受者(Receiver)

PHP實作:

安裝rabbitMQ擴充:

在你的項目中添加一個 composer.json檔案:

{
     "require": {
      "php-amqplib/php-amqplib": "2.6.1"
     }
 }
           

2、

簡單模式

(一對一)

msf 生成php馬_PHP實作消息隊列MQ
<?
           
<?
           

3、

Work模式

(輪循隊列,每個消費者消費的數量是一樣的)(一對多)

4、

Work模式

(能者多勞)(一對多)

msf 生成php馬_PHP實作消息隊列MQ
<?
           
<?
           

5、每個消息隻有一個消費者

6、發送者和接受者沒有時間依賴

7、接受者确認消息接受和處理成功

msf 生成php馬_PHP實作消息隊列MQ
b)Publish/Subscribe(Pub/Sub)釋出訂閱模式

    1、包含三個角色:主題(Topic),釋出者(Publisher),訂閱者(Subscriber)

    2、一個生産者,多個消息者;用戶端隻有訂閱後才能收到消息;持久化和非持久化

    3、每個消費者都有自己的隊列

    4、生産者沒有直接把消息發送到隊列,而是發送到交換機 轉發器exchange

    5、每個隊列都要綁定到交換機上

    6、生産者發送的消息經過交換機到達隊列,就能實作一個消息被多個消費者消費

7、Exchange(交換機 轉發器)

      1、一方面是接受生産者的消息,另一方面是向隊列推送消息

      2、匿名轉發

      3、

Fanout

(

訂閱模式

;不處理路由鍵,廣播)

msf 生成php馬_PHP實作消息隊列MQ
<?
           
<?
           
msf 生成php馬_PHP實作消息隊列MQ

4、

Direct

(

路由模式

;處理路由鍵,釋出與訂閱,完全比對)

msf 生成php馬_PHP實作消息隊列MQ

多個綁定(Multiple bindings)

msf 生成php馬_PHP實作消息隊列MQ

整合

msf 生成php馬_PHP實作消息隊列MQ
<?
           
以上内容希望幫助到大家,

很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那裡入手去提升,對此我整理了一些資料,包括但不限于:分布式架構、高可擴充、高性能、高并發、伺服器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點進階進階幹貨需要的可以免費分享給大家

,需要

PHP進階架構師>>>視訊、面試文檔免費擷取​shimo.im

msf 生成php馬_PHP實作消息隊列MQ
然後繼續看
<?
           

  5、

Topic

Topic模式

,規則比對)

  1、将路由鍵和某模式比對

2、"#"比對零個或者多個

3、“*”比對任意一個

msf 生成php馬_PHP實作消息隊列MQ
<?
           
<?
           
msf 生成php馬_PHP實作消息隊列MQ

3、使用RabbitMQ實作松耦合設計

msf 生成php馬_PHP實作消息隊列MQ
4、RabbitMQ消息處理

  a)RabbitMQ的消息持久化處理

    1、消息的可靠性是RabbitMQ的一部分,那麼RabbitMQ是如何保證消息可靠性的呢---消息持久化

    2、autoDelete

      @Queue:當所有消費用戶端連結斷開後,是否自動删除隊列隊列;true:删除,false:不删除

      @Exchange:當所有綁定隊列都不在使用時,是否自動删除交換機;true:删除 false:不删除

    3、消息确認ACK機制

      ACK機制是消費者從RabbitMQ收到消息并處理完成後,回報給RabbitMQ,RabbitMQ收到回報才将此消息從隊列中删除

5、Rabbitmq的消息确認機制(事務+confirm)

  a)在rabbitmq中,可以通過持久化資料,解決rabbitmq伺服器異常的資料丢失問題

  b)問題:生産者将消息發送出去之後,消息到底有沒有達到rabbitmq伺服器,預設是不知道的

    解決(兩種方式):

      1、AMQP實作事務機制

      2、Confirm

  c)事務機制(txSelect,txCommit,txRollback)

    1、

txSelect

:使用者将目前channel設定成transation模式

    2、

txCommit

:用于送出事務

    3、

txRollback

:復原事務

以上内容希望幫助到大家,

很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那裡入手去提升,對此我整理了一些資料,包括但不限于:分布式架構、高可擴充、高性能、高并發、伺服器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點進階進階幹貨需要的可以免費分享給大家

,需要

PHP進階架構師>>>視訊、面試文檔免費擷取​shimo.im

msf 生成php馬_PHP實作消息隊列MQ
或 者關注咱們下面的知乎專欄

PHP架構師圈子​zhuanlan.zhihu.com

msf 生成php馬_PHP實作消息隊列MQ

繼續閱讀