優點:
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、
簡單模式(一對一)

<?
<?
3、
Work模式(輪循隊列,每個消費者消費的數量是一樣的)(一對多)
4、
Work模式(能者多勞)(一對多)
<?
<?
5、每個消息隻有一個消費者
6、發送者和接受者沒有時間依賴
7、接受者确認消息接受和處理成功
1、包含三個角色:主題(Topic),釋出者(Publisher),訂閱者(Subscriber)
2、一個生産者,多個消息者;用戶端隻有訂閱後才能收到消息;持久化和非持久化
3、每個消費者都有自己的隊列
4、生産者沒有直接把消息發送到隊列,而是發送到交換機 轉發器exchange
5、每個隊列都要綁定到交換機上
6、生産者發送的消息經過交換機到達隊列,就能實作一個消息被多個消費者消費
7、Exchange(交換機 轉發器)1、一方面是接受生産者的消息,另一方面是向隊列推送消息
2、匿名轉發
3、
Fanout(
訂閱模式;不處理路由鍵,廣播)
<?
<?
4、
Direct(
路由模式;處理路由鍵,釋出與訂閱,完全比對)
多個綁定(Multiple bindings)
整合
<?
以上内容希望幫助到大家, 很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那裡入手去提升,對此我整理了一些資料,包括但不限于:分布式架構、高可擴充、高性能、高并發、伺服器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點進階進階幹貨需要的可以免費分享給大家
,需要PHP進階架構師>>>視訊、面試文檔免費擷取shimo.im
<?
5、
Topic(
Topic模式,規則比對)
1、将路由鍵和某模式比對
2、"#"比對零個或者多個
3、“*”比對任意一個
<?
<?
3、使用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
PHP架構師圈子zhuanlan.zhihu.com