Геокодирование Google "на лету" с использованием очереди laravel
У меня около 100 устройств GPS, периодически отправляющих координаты каждые 10 секунд. Мой клиент хочет обратное геокодирование в реальном времени, чтобы увидеть его транспортные средства вместе с местоположением на табличном виде. Я установил очередь для сохранения всех этих пакетов в db до того, где я добавил геокодирование script, как показано ниже
-
Получение IP-сообщения TCP с помощью 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,
)
)));
}
-
Запуск очереди
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 параллельных устройств, если я включу это геокодирование в очередь, есть ли для этого лучший подход?
Ответы
Ответ 1
Мы разработали нечто похожее, первоначально с картами google api, но я отошел, потому что это было не так точно в моем местоположении (Бразилия).
Для карт Google, если вы не заметили каких-либо проблем с точностью, вы можете запустить очередь и обработать данные, но с ограниченной суммой в день (обратите внимание на ограничение 2500 запросов, на которые я верю) для бесплатного обслуживания или покупки необходимых запросов.
Если вам нужны в режиме реального времени все устройства, вам нужно будет заплатить за большой объем на картах google, и я буду использовать для него службу очередей. Мы используем RabbitMQ Queue для получения координат, а затем у нас есть маленькие клиенты/работники, которые получают элементы из очереди и обрабатывают их (есть другие задействованные API).
Я не верю, что ваш клиент будет весь день впереди этого экрана, так что, возможно, вы можете:
- Всегда сохранять координаты
- Запускать вызовы API только тогда, когда он/она/кто-то находится на этой странице
- Используйте систему приоритета для координат GPS в просматриваемой области экрана (просматриваемые границы карты на фронте)
- Выполнять низкоприоритетные координаты в окне лучших усилий (на основе доступности API, ограничения использования и т.д.), возможно, даже для вторичного API для неприоритетных
Кстати, мы используем HereMaps, он выплачивается, но вы можете создать демонстрационную/тестовую учетную запись в течение 3 месяцев.
Ответ 2
Я думаю, что обратная геокодировка каждой координаты довольно неэффективна. Я предпочел бы сгруппировать некоторые координаты в некоторых пакетах и использовать что-то вроде thephpleague/geotools
пакетный api, чтобы отменить геокодирование этих данных, если они запрашиваются.
И я бы не полагался только на карты Google. Я считаю, что хороший совет - иметь резервную копию, потому что карты Google не знают каждого адреса, и вы можете легко выйти из ограничения скорости (с таким количеством данных). Посмотрите на пакет [ geocoder-php/Geocoder
], который поддерживает многие службы геокодирования.
Mabye примечание к сайту: я один из тех, кто поддерживает этот проект.