我正在開發一個應用程序,用戶將根據他的位置接收基於地理位置的信息。服務器應該能夠處理大量連接的客戶端> 100k。服務地理空間新聞的客戶
現在我想出瞭如何處理用戶位置的4種方法。
方法 - 無地理空間索引:
應用服務器不會牽住連接的客戶名單和他們的位置。 只要有信息可用,服務器就會遍歷整個列表並檢查客戶端是否在給定半徑內。
惑:非常昂貴
方法 - 在應用服務器處理地理空間索引:
應用服務器確實保持了R樹與所有連接的客戶和他們的位置。 所以我一直在尋找JSI Java Spatial Index
惑:這是非常昂貴與JSI更新地理空間索引
方法 - 讓數據庫「的MongoDB」做地理空間索引/計算:
應用服務器只保存對已連接客戶端(連接)的引用,並將該引用的密鑰連同其位置一起保存到mondoDb中。 當有新信息可用時,服務器可以查詢數據庫以將附近的所有客戶端的密鑰都關閉。
Pro:我想mongoDb確實比我在應用服務器上做過的地理空間索引的實現要好得多。
疑問:客戶周圍旅行迫使我經常更新地理空間索引。我可以這樣做還是我遇到性能問題?
方法 - 自己的「指數」採用2維數組
今天我想通過使用二維陣列創建一個非常簡單的索引。而外部陣列的經度是內部的緯度。可以說3經度/海拔高度會有足夠的精度。 我可以通過
來接收給定區域內的用戶列表ArrayList userList = data [91] [35] //91.2548980712891,35.60869979858; //我還需要得到周圍陣列中的用戶90; 35,92; 35 ... //如果我需要更多的精度,我可以使用一個十進制數據[912] [356]
臨:我會快速讀寫,而不查詢訪問數據庫
惑:半徑在極短。醜陋的黑客?
如果有人能指引我進入「正確的方向」,我將不勝感激。
感謝您的回答,我想geohaystack索引適合我的情況。如果MongoDB文檔沒有回答我的問題,那麼索引的更新會如何影響性能,以及這是否是一個好主意。 – Vincenzo
最終,測試是無可替代的,但即使索引對寫入性能有影響,這也會超過讀取性能。使用MongoDB,您可以調整所謂的寫入問題,即,如果您不等待大多數副本進行響應,寫入將會更快返回,但是如果您失去主要副本,則可能會導致數據可能不一致的代價。 –
@ user3211074。我已經用B-Tree上的一些信息更新了我的答案,並在Mongo中寫下了關注,這可能有助於回答你的問題。 –