2014-06-25 20 views
0

我正在開發一個應用程序,用戶將根據他的位置接收基於地理位置的信息。服務器應該能夠處理大量連接的客戶端> 100k。服務地理空間新聞的客戶

現在我想出瞭如何處理用戶位置的4種方法。

  1. 方法 - 無地理空間索引:

    應用服務器不會牽住連接的客戶名單和他們的位置。 只要有信息可用,服務器就會遍歷整個列表並檢查客戶端是否在給定半徑內。

    :非常昂貴

  2. 方法 - 在應用服務器處理地理空間索引:

    應用服務器確實保持了R樹與所有連接的客戶和他們的位置。 所以我一直在尋找JSI Java Spatial Index

    :這是非常昂貴與JSI更新地理空間索引

  3. 方法 - 讓數據庫「的MongoDB」做地理空間索引/計算:

    應用服務器只保存對已連接客戶端(連接)的引用,並將該引用的密鑰連同其位置一起保存到mondoDb中。 當有新信息可用時,服務器可以查詢數據庫以將附近的所有客戶端的密鑰都關閉。

    Pro:我想mongoDb確實比我在應用服務器上做過的地理空間索引的實現要好得多。

    疑問:客戶周圍旅行迫使我經常更新地理空間索引。我可以這樣做還是我遇到性能問題?

  4. 方法 - 自己的「指數」採用2維數組

    今天我想通過使用二維陣列創建一個非常簡單的索引。而外部陣列的經度是內部的緯度。可以說3經度/海拔高度會有足夠的精度。 我可以通過

    來接收給定區域內的用戶列表ArrayList userList = data [91] [35] //91.2548980712891,35.60869979858; //我還需要得到周圍陣列中的用戶90; 35,92; 35 ... //如果我需要更多的精度,我可以使用一個十進制數據[912] [356]

    :我會快速讀寫,而不查詢訪問數據庫

    :半徑在極短。醜陋的黑客?

如果有人能指引我進入「正確的方向」,我將不勝感激。

回答

0

MongoDB用於地理空間索引的索引基於geohash,它基本上將2維空間轉換爲適合B樹索引的一維鍵。雖然這比R-tree索引的效率要低一些,但它的效率將遠高於場景1.我還會爭辯說,使用空間查詢過濾數據庫級別的數據將比創建更高效​​且更易於維護擁有自己的空間索引策略。

使用MongoDB時要注意的主要問題是,不能使用幾何列作爲分片鍵,儘管您可以使用另一個鍵對包含幾何字段的集合進行分片。另外,如果您希望執行任何聚合查詢(這在您的問題中不明確),則幾何字段必須是通過管道的第一個聚合查詢。

還有一個geohaystack索引,它基於小桶並針對基於小區域的搜索進行了優化,請參閱http://docs.mongodb.org/manual/core/geohaystack/,這可能對您的情況有用。

就速度而言,在B-Tree索引上插入和搜索基本上是O(log n),參見Wikipedia B-Tree,而沒有索引時,搜索將是O(n),所以它不會花很長時間之前在性能上的差異在擁有和沒有索引之間是巨大的。

如果您擔心繁重的寫入操作會減慢速度,您可以調整write concern in MongoDB,以便您不必等待大多數副本響應每次寫入(默認值),但需要付出潛在代價不一致的數據,如果你應該失去你的主人。

+0

感謝您的回答,我想geohaystack索引適合我的情況。如果MongoDB文檔沒有回答我的問題,那麼索引的更新會如何影響性能,以及這是否是一個好主意。 – Vincenzo

+0

最終,測試是無可替代的,但即使索引對寫入性能有影響,這也會超過讀取性能。使用MongoDB,您可以調整所謂的寫入問題,即,如果您不等待大多數副本進行響應,寫入將會更快返回,但是如果您失去主要副本,則可能會導致數據可能不一致的代價。 –

+0

@ user3211074。我已經用B-Tree上的一些信息更新了我的答案,並在Mongo中寫下了關注,這可能有助於回答你的問題。 –