1. 程式人生 > >redis的佇列訊息實現應用解耦

redis的佇列訊息實現應用解耦

過度耦合的缺點:php應用中,過度的耦合使得系統拓展性變弱,聯動性錯誤。

今天我給大家介紹的是利用redis的佇列訊息實現模組間的解耦。

應用場景:使用者在採購模組下單買了一批貨物回來,簽收時要在倉庫模組新增相應的庫存,普通的做法就是在簽收完成的時候通過介面給倉庫模組推送資料執行入庫操作。但是這麼做如果倉庫模組傳送錯誤,沒有入庫成功就會導致採購模組簽收失敗,這就是耦合給系統帶來的缺點。

解決方案:運用php+redis佇列訊息的技術,當用戶簽收成功的時候,把資料放入佇列中,入列成功採購模組則返回簽收成功的提示給使用者,後續的操作都不需要採購模組操心,然後倉庫系統可以通過redis的訂閱釋出模式來進行監聽,當有資料入列,則倉庫系統就執行入庫邏輯程式碼的

執行。

關鍵點:

1、如果redis伺服器掛掉了怎麼辦啊?

在採購模組的簽收邏輯程式碼中做判斷,如果入列成功則返回簽收完成,如果入列失敗這執行傳統方法,通過介面入庫的方法。如果redis也掛了,倉庫模組也掛了怎麼辦啊,那你就收拾包袱回家吧。

2、如何實現傳統方式那樣實時入庫啊?

採用redis的訂閱釋出模式就可以解決。訂閱的程式碼放在倉庫模組,釋出的程式碼放在採購模組。

訂閱程式碼sub.php

<?php
$redis = new Redis();
$redis->connect('localhost', 6379);
$redis->subscribe(['ruku'], function
($redis, $chan, $msg) {//訂閱入庫頻道   if($msg==2500){   //如果監聽到有釋出資訊則從佇列中拿取資訊進行入庫操作    。。。。。。。 }   });

釋出程式碼pub.php

<?php
$redis = new Redis();
$redis->connect('localhost', 6379);
$order = ['id' => 1, 'name' => '小米6', 'price' => 2499, 'created_at' => '2017-07-14'];$redis->lpush('order',$order);
$redis->publish("ruku", 2500);