背景
- 搭建一个电商数据中台,统一管理各个平台的商品,订单等基本数据。
需求
- 日后可能会有很多订单。上传的商品也可能会一次性上传很多个。
方案
- 使用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;
});
}
}
-
定义规划平台接口
-
集成几口,各自实现各个功能接口代码
-
记录好任务执行结果,如果原纪录的全部平台都已经成功执行,则标记改广播任务已完成。
网友评论