2015-07-21 3 views
0

Actuellement, je travaille sur un projet comme Uber. Cela signifie qu'il y a deux applications: une pour le pilote et une pour le client.Problème de performances pour obtenir l'emplacement le plus proche dans l'application en temps réel

Le problème est le suivant: le pilote doit mettre à jour son emplacement par seconde. Et le client tire tous les pilotes les plus proches par 2 secondes pour le temps réel. Cela provoque de mauvaises performances dans la requête de base de données. J'utilise le cube & extension de earthdistance de PostgreSQL pour caculer le plus proche.

Quelqu'un pourrait-il me montrer quelle est la meilleure façon de résoudre ce problème? Merci beaucoup!

+1

Si vous parlez de voitures et des passagers dont vous avez besoin d'une meilleure solution que les emplacements juste comparaison. Avec l'extension PostGIS, vous pouvez charger un fichier de formes de données routières, puis effectuer une analyse de réseau. Pas beaucoup d'aide si le taxi le plus proche est de l'autre côté de la rivière ou de l'autoroute. – Patrick

+0

Beaucoup, beaucoup, beaucoup de RAM. Vous allez vouloir adapter au moins vos index en RAM. Beaucoup de processeurs et de nombreux disques rapides. Aussi tables 'UNLOGGED' pour les données en temps réel. Vous allez le perdre complètement dans un crash, mais comme seules les valeurs récentes sont intéressantes, cela n'a probablement pas d'importance. –

Répondre

0

Vous pouvez utiliser deepstream.io pour la soumission de données en temps réel, par ex. d'applications

public void onLocationChanged(Location location) { 
    // get the record 
    Record record = client.record.getRecord("driver/14"); 
    // any kind of data path works 
    record.set("position.x", location.getLongitude()); 
    //as well as any kind of serializable datatype 
    record.set("position.y", location.getLatitude()); 
} 

activer

// get the record 
var driver = client.record.getRecord('driver/14'); 

// subscribe to any changes within position 
driver.subscribe('position', function(position){ 
    updateMarker(position.x, position.y); 
}); 

combiné avec, par exemple RethinkDBs geospacial queries qui s'intègre avec cette opération peut être une solution évolutive.

Here's an example repo cette démonstration