背景
- 搭建一個電商資料中臺,統一管理各個平臺的商品,訂單等基本資料。
需求
- 日後可能會有很多訂單。上傳的商品也可能會一次性上傳很多個。
方案
- 使用redis釋出訂閱模式,讓上傳商品,下載訂單非同步執行
- 記錄釋出的任務,以及任務的執行情況,避免某一平臺上傳失敗時,發生漏上傳的錯誤,或者是未接收到訂閱訊息,任務執行失敗。
- 對未執行的任務,或者執行失敗的任務,進行重發任務。
具體實現
- 釋出訊息
訊息體可以根據自己業務具體定義
/**
* 推送廣播
*
* @param array $message = [
* 'event' => 'upload_goods',
* 'data' => [],
* 'broadcast_id' => '1',
* ]
*
* @time : 2020/9/11
*/
public function publish(array $message)
{
$log = $this->createLog($message['event'], $message['pid']);
$message['broadcast_id'] = $log->id;
$this->message = $message;
//傳送廣播訊息
$this->sendMessage();
}
/**
* 傳送訊息
*
* @time : 2020/9/11
*/
protected function sendMessage()
{
Redis::publish('test', json_encode($this->message, JSON_UNESCAPED_UNICODE));
}
- 接受訊息
新建命令
class Subscriber extends Command
{
protected $signature = 'redis:sub';
protected $description = '訊息訂閱監聽器,需要開啟常駐程式 以及 用程式守護工具進行守護';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* 邏輯處理
* @return mixed
*/
public function handle()
{
ini_set("default_socket_timeout", -1);
Redis::psubscribe(['*'], function ($message, $channel) {
echo $message;
});
}
}
定義規劃平臺介面
整合幾口,各自實現各個功能介面程式碼
記錄好任務執行結果,如果原紀錄的全部平臺都已經成功執行,則標記改廣播任務已完成。
歡迎各位大佬提意見。謝謝各位大佬
本作品採用《CC 協議》,轉載必須註明作者和本文連結