我有大约100个GPS设备每10秒周期性发送一次坐标。我的客户希望实时反向地理编码,以便在表格视图中查看他的车辆以及位置。我已成立了一个队列,我已经添加地理编码脚本之前在数据库中的所有这些数据包保存像下面使用laravel队列即时Google地理编码
使用的WebSocket
public function onMessage(ConnectionInterface $conn, $msg) { //get the message // send the dispatch job to save it in db $this->dispatch(new SavePacketsToDb($key_1, json_encode( array( 'company_id' => $key_1, 'vehicle_id' => $company->vehicle_id, 'tracker_id' => $company->tracker_id, 'lat' => $lat, 'lng' => $lng, 'imei' => $imei, 'datetime' => $datetime, ) )));
}
运行接收TCP IP报文队列
public function handle(){ $lat=$obj->lat; $lng=$obj->lng; $url = "https://maps.googleapis.com/maps/api/geocode/json?latlng=" . $lat . "," . $lng . "&key=mykey"; $json = file_get_contents($url); $data = json_decode($json); $status = $data->status; $address = ''; if ($status == "OK") { // echo "from geocode address"; echo $address = $data->results[0]->formatted_address; } else{ $address=NULL; } //save to db }
我只是担心,如果它适用于1000个并发设备,如果我在队列中包含此地理编码,是否有更好的方法呢?
我想你可以通过管理员的配置设置'numprocs = 8'来限制并发进程的数量。不完全确定这是你想要的。 – btl
我看到几种方法可以改善这一点至少,但给你几个指针: 1)你可以检查一个工作是否仍然(等待)在车辆队列中,并摆脱任何未完成的工作当你在队列中放置一个新工作时的车辆 2)你可能不想每次都打一次电话给google api。例如,考虑检查坐标是否仍然相同,因为如果是这种情况,车辆没有移动并且您已经知道位置。 – Leentje
关于第二个想法;当前端需要显示实际位置时,我只会对谷歌进行API调用。 (而刚刚保存的坐标) – Leentje