客户端自定义定时任务,量多的时候怎么办?有什么方法解决大量定时任务?
不知道你现在有多少个
几万个定时任务,还是用户自定义的
你项目目前有几万个定时任务?
是啊
怎么处理?
因为每个用户都可以发起定时任务
那推荐你使用专业的定时任务 https://github.com/ouqiang/gocron
用户还要可以取消任务,我 人都傻了
什么类型的任务?里面会不会有长时间阻塞的,如果没有的话,只是类似于闹钟的话,完全可以用一个定时器来解决,不需要每个任务一个定时器.
就是类似闹钟这种,请问一个定时器的逻辑是什么?扫表吗?
不用扫表,在onWorkerStart 一次性获取全部,然后用自增id作为数组键保存,然后开启个text 协议监听,类似于这样
/** * @param TcpConnection $connection * @param $buffer * @return void * 开启text协议监听 */ public function onMessage(TcpConnection $connection, $buffer) { $data = json_decode($buffer, true); $id = $data['id'] ?? ''; $item = $data['item'] ?? []; $route_type = $data['route_type'] ?? ''; if ($route_type === 'addTask'){ $this->addTask($id,$item); }else if ($route_type === 'removeTask'){ $this->removeTask($id); } $connection->send(true ? 'ok' : 'fail'); $connection->close(); } /** * @param $id int 数据库自增id * @param $item array 任务内容 * @return void * 添加任务 */ private function addTask($id,$item){ $this->task_list[$id] = $item; } /** * @param $id int 数据库自增id * @return void * 删除任务 */ private function removeTask($id){ if (isset($this->task_list[$id])){ unset($this->task_list[$id]); } } 然后添加任务,或者删除任务的时候,用这个连接text端口添加或者删除任务就行了. /** * @param array $data * @return bool * 发送text协议 */ function sendTextSocket( $data = []) { $address = '127.0.0.1:5678'; // 建立socket连接到内部推送端口 $client = stream_socket_client('tcp://' . $address , $errno, $errmsg, 1); // 发送数据,注意5678端口是Text协议的端口,Text协议需要在数据末尾加上换行符 fwrite($client, json_encode($data) . "\n"); // 读取推送结果 $res = fread($client, 8192); }
谢谢
几万个定时任务,还是用户自定义的
你项目目前有几万个定时任务?
是啊
怎么处理?
因为每个用户都可以发起定时任务
那推荐你使用专业的定时任务 https://github.com/ouqiang/gocron
用户还要可以取消任务,我 人都傻了
什么类型的任务?里面会不会有长时间阻塞的,如果没有的话,只是类似于闹钟的话,完全可以用一个定时器来解决,不需要每个任务一个定时器.
就是类似闹钟这种,请问一个定时器的逻辑是什么?扫表吗?
不用扫表,在onWorkerStart 一次性获取全部,然后用自增id作为数组键保存,然后开启个text 协议监听,类似于这样
谢谢