背景
- 搭建一个电商数据中台,统一管理各个平台的商品,订单等基本数据。
需求
- 日后可能会有很多订单。上传的商品也可能会一次性上传很多个。
方案
- 使用 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; }); } }
- 定义规划平台接口
- 集成几口,各自实现各个功能接口代码
- 记录好任务执行结果,如果原纪录的全部平台都已经成功执行,则标记改广播任务已完成。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
喜欢就支持以下吧