Browse Source

每次循环计算剩余时间,不够抛异常

visuddhinanda 9 tháng trước cách đây
mục cha
commit
bb665424e8
1 tập tin đã thay đổi với 31 bổ sung13 xóa
  1. 31 13
      api-v8/app/Services/AiTranslateService.php

+ 31 - 13
api-v8/app/Services/AiTranslateService.php

@@ -18,7 +18,7 @@ use App\Http\Api\ChannelApi;
 use App\Http\Controllers\AuthController;
 
 use App\Http\Api\MdRender;
-use App\Jobs\ProcessAITranslateJob;
+use App\Exceptions\SectionTimeoutException;
 
 class DatabaseException extends \Exception {}
 
@@ -28,20 +28,22 @@ class AiTranslateService
     private $modelToken = null;
     private $task = null;
     protected $mq;
-    private $apiTimeout = 100;
+    private $apiTimeout = 30;
     private $llmTimeout = 300;
     private $taskTopicId;
-    public function __construct()
-    {
-        $this->mq = app(RabbitMQService::class);
-    }
+    private $stop = false;
+    private $maxProcessTime = 15 * 60; //一个句子的最大处理时间
+    private $mqTimeout = 60;
+
+    public function __construct() {}
 
     /**
      * @param string $messageId
      * @param array $translateData
      */
-    public function processTranslate(string $messageId, array $messages, ProcessAITranslateJob $job): bool
+    public function processTranslate(string $messageId, array $messages): bool
     {
+        $start = time();
 
         if (!is_array($messages) || count($messages) === 0) {
             Log::error('message is not array');
@@ -76,12 +78,14 @@ class AiTranslateService
             null
         );
 
+        $time = [$this->maxProcessTime];
         for ($i = $pointer; $i < count($messages); $i++) {
             // 获取当前内存使用量
             Log::debug("memory usage: " . memory_get_usage(true) / 1024 / 1024 . " MB");
             // 获取峰值内存使用量
             Log::debug("memory peak usage: " . memory_get_peak_usage(true) / 1024 / 1024 . " MB");
-            if ($job->isStop()) {
+
+            if ($this->stop) {
                 Log::info("收到退出信号 pointer={$i}");
                 return false;
             }
@@ -89,7 +93,7 @@ class AiTranslateService
                 //检测到停止标记
                 return false;
             }
-            //$this->mq->publishMessage('heartbeat_queue', ['delivery_mode' => 2]);
+
             RedisClusters::put($pointerKey, $i);
             $message = $messages[$i];
             $taskDiscussionContent = [];
@@ -180,13 +184,22 @@ class AiTranslateService
             } else {
                 Log::error('no task discussion root');
             }
+
+            //计算剩余时间是否足够再做一次
+            $time[] = time() - $start;
+            rsort($time);
+            $remain = $this->mqTimeout - (time() - $start);
+            if ($remain < $time[0]) {
+                throw new SectionTimeoutException;
+            }
         }
         //任务完成 修改任务状态为 done
         if ($i === count($messages)) {
             $this->setTaskStatus($this->task->id, 'done');
+            RedisClusters::forget($pointerKey);
+            Log::info('ai translate task complete');
         }
-        RedisClusters::forget($pointerKey);
-        Log::info('ai translate task complete');
+
         return true;
     }
     private function setTaskStatus($taskId, $status)
@@ -261,7 +274,7 @@ class AiTranslateService
             "temperature" => 0.7,
             "stream" => false
         ];
-        Log::info($this->queue . ' LLM request' . $message->model->url . ' model:' . $param['model']);
+        Log::info($this->queue . ' LLM request ' . $message->model->url . ' model:' . $param['model']);
         Log::debug($this->queue . ' LLM api request', [
             'url' => $message->model->url,
             'data' => json_encode($param),
@@ -625,8 +638,13 @@ class AiTranslateService
             array_push($mqData, $aiMqData);
         }
         if ($send) {
-            $this->mq->publishMessage('ai_translate', $mqData);
+            $mq = app(RabbitMQService::class);
+            $mq->publishMessage('ai_translate', $mqData);
         }
         return $mqData;
     }
+    public function stop()
+    {
+        $this->stop = true;
+    }
 }