สำหรับเว็บไซต์ที่มี traffic ค่อนข้างสูง และมีการ query data ที่(อาจ)ใช้เวลานาน user คงไม่รอให้หน้าเว็บโหลดนานเป็นหลักนาทีๆ เพื่อให้ได้ผลลัพธ์ออกมา ดังนั้น query ที่นานเกินเวลาที่ user จะยอมรับได้ เราควรกำจัดมันทิ้งเสีย
หากไม่ตัด query ทิ้ง ก็จะทำให้เป็น load ที่ฝั่ง server สะสม มีผลทั้ง I/O, memory และ CPU time และอาจทำให้ server ไม่ตอบสนองได้หากสะสมเกินค่า config ที่ตั้งไว้ หรือเกิน capacity ที่ resource เครื่องจะรับได้
เราสามารถใช้เทคนิคง่ายๆ ในการกำหนดเวลาสูงสุดที่จะให้ query รันได้ ซึ่งหากเกินค่านี้ ตัว client จะส่ง exception ออกมาและตัดการทำงานให้โดยอัตโนมัติ คือการใช้ cursor.maxTimeMS() เช่น
db.traffic.find({"location.country": "CN"}).maxTimeMS(5000)
กรณีนี้ หาก query ทำงานไม่เสร็จภายในเวลา 5 วินาที ก็จะได้ exception กลับออกมาประมาณนี้
Error: error: {
"operationTime" : Timestamp(1567912754, 5),
"ok" : 0,
"errmsg" : "Executor error during find command :: caused by :: operation exceeded time limit",
"code" : 50,
"codeName" : "MaxTimeMSExpired"
}
การทำ aggregation ก็สามารถระบุ maxTimeMS ได้เช่นกัน โดยระบุไว้ใน options
db.traffic.aggregate([ {$match: { "location.country": "CN" }} , {$limit: 50} ], { maxTimeMS: 5000 })
ตัวอย่างการใส่ options ใน PHP (Yii2 framework)
$collection = Yii::$app->mongodb->getCollection('traffic'); try { $result = $collection->aggregate([ ['$match' => [ 'location.country' => 'CN' ]],['$limit' => 50]
],
['maxTimeMS' => 5000]);
} catch (\yii\mongodb\Exception $ex) { echo "Time out exceed"; }