Browse Source

并发控制;临时通过npm start来跑线上任务

Michael Wang 6 năm trước cách đây
mục cha
commit
7cf1533d49
5 tập tin đã thay đổi với 93 bổ sung40 xóa
  1. 6 6
      .env.local
  2. 18 9
      faceSetMySql.js
  3. 5 3
      src/main.js
  4. 41 20
      src/views/index.vue
  5. 23 2
      vue.config.js

+ 6 - 6
.env.local

@@ -1,12 +1,12 @@
-VUE_APP_ECS_CORE=https://ecs-dev.qmth.com.cn:8878
-VUE_APP_DOMAIN=ecs-dev.qmth.com.cn
-VUE_APP_FACEPP_API_KEY=kEz_MSSjkNuHL3fHhCvv62fXkAo-vobE 
-VUE_APP_FACEPP_API_SECRET=aQMioMGUDShMnQmfM1_H_kPTP2pJva6J
+VUE_APP_ECS_CORE=https://ecs.qmth.com.cn:8878 
+VUE_APP_DOMAIN=ecs.qmth.com.cn
+VUE_APP_FACEPP_API_KEY=VOlRKNlCSAYIOcSLDKOaZukkqpmi-Pwo 
+VUE_APP_FACEPP_API_SECRET=bzMjy-JfwtVUxVDMzagFh7ggbQBC71f1
 VUE_APP_UPYUN_OPERATOR=examcloud
 VUE_APP_UPYUN_PASSWORD=examcloud123456
 VUE_APP_UPYUN_SERVER=v0.api.upyun.com
-VUE_APP_UPYUN_BUCKET=exam-cloud-test
-VUE_APP_UPYUN_BUCKETURL=/exam-cloud-test/student_base_photo/
+VUE_APP_UPYUN_BUCKET=exam-cloud
+VUE_APP_UPYUN_BUCKETURL=/exam-cloud/student_base_photo/
 
 VUE_APP_MYSQL_HOST=192.168.10.30
 VUE_APP_MYSQL_USER_NAME=root

+ 18 - 9
faceSetMySql.js

@@ -1,18 +1,27 @@
 const mysql = require("mysql");
+
+// prod
+const VUE_APP_MYSQL_HOST = "rds7b2sll8un5kz99s0io.mysql.rds.aliyuncs.com";
+const VUE_APP_MYSQL_USER_NAME = "exam_cloud";
+const VUE_APP_MYSQL_PASSWORD = "examcloud123!@#";
+const VUE_APP_MYSQL_DATABASE = "exam_cloud";
+
+// test
+// const VUE_APP_MYSQL_HOST = "192.168.10.30";
+// const VUE_APP_MYSQL_USER_NAME = "root";
+// const VUE_APP_MYSQL_PASSWORD = "root";
+// const VUE_APP_MYSQL_DATABASE = "exam_cloud_test";
+
 const connection = mysql.createConnection({
-  // host: process.env.VUE_APP_MYSQL_HOST,
-  // user: process.env.VUE_APP_MYSQL_USER_NAME,
-  // password: process.env.VUE_APP_MYSQL_PASSWORD,
-  // database: process.env.VUE_APP_MYSQL_DATABASE
-  host: "192.168.10.30",
-  user: "root",
-  password: "root",
-  database: "exam_cloud_test"
+  host: VUE_APP_MYSQL_HOST,
+  user: VUE_APP_MYSQL_USER_NAME,
+  password: VUE_APP_MYSQL_PASSWORD,
+  database: VUE_APP_MYSQL_DATABASE
 });
 
 connection.connect(err => {
   if (err) throw err;
-  console.log("Database Connected! " + process.env.VUE_APP_MYSQL_HOST);
+  console.log("Database Connected! " + VUE_APP_MYSQL_HOST);
 });
 
 function queryFaceSet() {

+ 5 - 3
src/main.js

@@ -16,7 +16,7 @@ Vue.use(ElementUI);
 
 const qmInstance = axios.create({});
 let wk_token;
-let requestInProcessTotal = 0;
+window.requestInProcessingTotal = 0;
 qmInstance.interceptors.request.use(
   config => {
     if (config.url.includes("/login") === false) {
@@ -30,7 +30,8 @@ qmInstance.interceptors.request.use(
       wk_token = null;
     }
 
-    console.log("后台并发峰值:" + requestInProcessTotal++);
+    window.requestInProcessingTotal++;
+    // console.log("后台并发峰值:" + window.requestInProcessingTotal);
 
     return config;
   },
@@ -43,10 +44,11 @@ qmInstance.interceptors.request.use(
 //响应拦截
 qmInstance.interceptors.response.use(
   response => {
-    requestInProcessTotal--;
+    window.requestInProcessingTotal--;
     return response;
   },
   error => {
+    window.requestInProcessingTotal--;
     // 这里是返回状态码不为200时候的错误处理
     const status = error.response.status;
     if (status != 200) {

+ 41 - 20
src/views/index.vue

@@ -21,6 +21,10 @@
             失败:
             <span style="color:red;">{{errorNum}}</span>/{{allNum}}
           </span>
+          <span>
+            并发请求:
+            <span style="color:black;">{{reqNum}}</span>
+          </span>
           <span v-show="completeShow" style="color: green;font-weight: bold;">全部处理完成</span>
           <span v-show="!completeShow&&(successNum>0||errorNum>0)" style="color: red;font-weight: bold;">处理中...</span>
         </div>
@@ -68,10 +72,13 @@ function isImageFile(fileName) {
 //读取文件,返回网站路径. 只扫描当前文件夹,不递归扫描
 function readImageFiles(folderPath) {
   const files = fs.readdirSync(folderPath);
-  return files.filter(isImageFile).map(fileName => folderPath + "/" + fileName);
+  return files
+    .filter(isImageFile)
+    .sort()
+    .map(fileName => folderPath + "/" + fileName);
 }
 
-const CONCURRENCY = 2; //同时处理的照片数量; 深夜增加并发
+let CONCURRENCY = 2; //同时处理的照片数量; 深夜增加并发
 
 export default {
   data() {
@@ -81,7 +88,8 @@ export default {
       successNum: 0, //成功数量
       errorNum: 0, //失败数量
       allNum: 0, //总数
-      completeShow: false
+      completeShow: false,
+      reqNum: 0
     };
   },
   methods: {
@@ -104,29 +112,41 @@ export default {
         },
         folderPaths => {
           if (folderPaths) {
-            this.processQueue(folderPaths[0]);
+            this.photoList = readImageFiles(folderPaths[0]);
+            this.allNum = this.photoList.length;
+            this.processQueue();
           }
         }
       );
     },
-    processQueue(folderPath) {
-      this.photoList = readImageFiles(folderPath);
-      this.allNum = this.photoList.length;
-
+    processQueue() {
       let taskQueue = [];
-      for (const studentPhotoPath of this.photoList) {
-        taskQueue.push(this.processStudentPhoto.bind(this, studentPhotoPath));
+      let total = 0;
+      for (
+        let i = this.successNum + this.errorNum;
+        i < this.photoList.length && total < 100;
+        i++, total++
+      ) {
+        taskQueue.push(this.processStudentPhoto.bind(this, this.photoList[i]));
       }
-
+      this.processQueueSingle(taskQueue);
+    },
+    processQueueSingle(taskQueue100) {
       // 并发处理请求,可在控制台查看请求峰值
-      async.parallelLimit(taskQueue, CONCURRENCY, (err, results) => {
+      CONCURRENCY = new Date().getHours() < 6 ? 8 : 5;
+      async.parallelLimit(taskQueue100, CONCURRENCY, (err, results) => {
         if (err) {
           alert(err);
           console.log(err);
         } else {
           console.log(results);
-          console.log("photoList处理完毕");
-          this.completeShow = true;
+          if (this.successNum + this.errorNum < this.allNum) {
+            console.log("处理完100张图片了,3秒后继续...");
+            setTimeout(this.processQueue, 3000);
+          } else {
+            console.log("photoList处理完毕");
+            this.completeShow = true;
+          }
         }
       });
     },
@@ -138,6 +158,7 @@ export default {
         .replace(fileSuffix, ""); //文件名就是身份证号码
       const photoFile = fs.readFileSync(studentPhotoPath);
       const rootOrgId = localStorage.getItem("rootOrgId");
+      this.reqNum = window.requestInProcessingTotal;
 
       //生成新名称
       const upyunPhotoPath = (() => {
@@ -236,12 +257,12 @@ export default {
         this.$http
           .post("/facepp/v3/faceset/addface", formData_addface)
           .then(res => {
-            console.log(
-              `res.data.face_added: ${
-                res.data.face_added
-              }, res.data.face_count: ${res.data.face_count}`
-            );
-            if (res.data.face_count > 8000) {
+            // console.log(
+            //   `res.data.face_added: ${
+            //     res.data.face_added
+            //   }, res.data.face_count: ${res.data.face_count}`
+            // );
+            if (res.data.face_count > 4000) {
               window.DB.updateFaceSet(faceset_token, res.data.face_count).then(
                 () => {
                   this.faceSetToken = undefined;

+ 23 - 2
vue.config.js

@@ -1,6 +1,6 @@
 let proxy = {
   "/api/ecs_core": {
-    target: " http://ecs-dev.qmth.com.cn:8000", //代理跨域转地址,基础信息
+    target: "http://ecs-dev.qmth.com.cn:8000", //代理跨域转地址,基础信息
     changeOrigin: true
   },
   "/facepp/v3": {
@@ -19,9 +19,30 @@ let proxy = {
     changeOrigin: true
   }
 };
+let proxyProd = {
+  "/api/ecs_core": {
+    target: "https://ecs.qmth.com.cn:8878", //代理跨域转地址,基础信息
+    changeOrigin: true
+  },
+  "/facepp/v3": {
+    secure: false,
+    target: "https://api-cn.faceplusplus.com",
+    changeOrigin: true
+  },
+  "/exam-cloud/student_base_photo/": {
+    secure: false,
+    target: "http://v0.api.upyun.com",
+    changeOrigin: true
+  },
+  "/exam-cloud": {
+    secure: false,
+    target: "http://v0.api.upyun.com",
+    changeOrigin: true
+  }
+};
 
 module.exports = {
   devServer: {
-    proxy
+    proxy: proxyProd
   }
 };