Laravel Redis釋出與訂閱.

妖都水鬼發表於2020-09-11

背景

  • 搭建一個電商資料中臺,統一管理各個平臺的商品,訂單等基本資料。

需求

  • 日後可能會有很多訂單。上傳的商品也可能會一次性上傳很多個。

方案

  • 使用redis釋出訂閱模式,讓上傳商品,下載訂單非同步執行
  • 記錄釋出的任務,以及任務的執行情況,避免某一平臺上傳失敗時,發生漏上傳的錯誤,或者是未接收到訂閱訊息,任務執行失敗。
  • 對未執行的任務,或者執行失敗的任務,進行重發任務。

具體實現

  1. 釋出訊息

訊息體可以根據自己業務具體定義

/**
     * 推送廣播
     *
     * @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));
    }
  1. 接受訊息

新建命令

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;
        });
    }
}
  1. 定義規劃平臺介面

  2. 整合幾口,各自實現各個功能介面程式碼

  3. 記錄好任務執行結果,如果原紀錄的全部平臺都已經成功執行,則標記改廣播任務已完成。

歡迎各位大佬提意見。謝謝各位大佬

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章