2017-02-24 70 views
6

使用node.js作爲tcp服務器,我將管理相對大量的GPS設備(〜3000設備),並將第一步存儲到數據庫中,即使在這個階段,我設想一些困擾我的表現問題,我想在他們咬我之前抓住他們。Node.js GPS設備跟蹤性能注意事項

1 - 考慮使用的語言,如的Java紅寶石書面相似服務器我看到如下一段代碼:

的Java

Thread serverThread = new Thread(() -> { 
    System.out.println("Listening to server port 9000"); 
    while (true) { 
    try { 
     Socket socket = serverSocket.accept(); 
    ... 

紅寶石

require 'socket' 
    server = TCPServer.new ("127.0.0.1",8080) 
    loop do 
    Thread.start(server.accept) do |client| 
    ... 

看起來他們給每個連接到tcp服務器的設備(套接字)提供單獨的線程?由於node.js是單線程的並且是異步操作的,我應該關注傳入連接還是類似以下簡單方法會滿足大量同時連接?

net.createServer(function(device) { 
    device.on('data', function(data) { 
    // parse data 
    // store in database 
    }); 
}); 

2 - 我應該使用連接池來限制數據庫連接嗎?由於數據庫也從另一端查詢GIS和監視,池大小應該是多少?

3 - 我如何在這樣的系統中獲得緩存(例如使用redis)?

如果有人對這個想法有所瞭解,那該多好。我還樂意聽取您在實施此類系統時可能會遇到或意識到的其他表現問題。謝謝。

+0

完整的問題,但爲什麼使用套接字而不是週期性的http請求? – Festo

+0

@Festo,我只是可以在TCP層與GPS設備進行通信,在這一層,我明確應該使用套接字與設備進行通信,在http服務器中,我可以使用定期請求,但由於數據是實時的,我還會使用套接字。 – dNitro

回答

3
  1. 您列出我要說其實的NodeJS是爲您的使用情況下是更好的選擇,因爲它不使用每個連接一個線程像其他兩個選項的選項中選擇。線程通常是給定機器上的有限資源。 JavaRuby確實有'evented'服務器,如果你想讓蘋果進行蘋果比較,這些值得關注。

  2. 我想你應該多說一下你打算使用的數據庫,如果你需要關於連接池的建議。但是,如果連接成本昂貴,重新使用連接將是一件好事。設施配置池的最小和最大尺寸可能是一個好主意。最終,使用正確的尺寸是一個測試問題。

  3. 我認爲緩存在這個系統中的好處是最小的,因爲你主要是寫數據。如果數據很有價值,你會想將它寫入磁盤而不是內存。另一方面,如果你有客戶正在閱讀收集的數據,可能緩存他們的讀取像Redis的東西可能是一個好主意。

+0

謝謝你的回答,我真的需要對這個選擇有一定的信心,你的回答給了我,所以我認爲我可以完成第一階段。 Java和Ruby的服務器都是不錯的蘋果,但我會用node.js,因爲我更喜歡它。其實我打算使用postgres作爲數據庫因爲我需要在下一個階段使用GIS。我的意思是使用Redis作爲緩存層,所以當我們決定如何查詢數據庫以及哪些數據應該在手邊時,我認爲我應該使用http服務器來實現它。 – dNitro

3

我相信你知道,但這聽起來像是你試圖過早地優化你的應用程序。 1-節點處於事件驅動和非阻塞狀態,使其成爲保存大量開放式套接字連接的完美候選者,無需爲每個連接分派數據。一如既往,請確保您的應用程序已正確集羣。我能夠在便宜的便攜式筆記本電腦上容納約100k個開放的TCP插座。如果您需要支持的設備數量超過此數量,則只需進行相應的擴展。

2-我看到你打算使用postgres。池總是一件好事。

3-高速緩存對於「熱」數據很有用。被查詢的東西很多,因此將其存入內存或Redis(內存中)可以加快這些數據查找速度,消除系統壓力。就你而言,如果你只需要獲得某些數據塊,分析或更多的因果用途,我會推薦sparksolr而不是普通的緩存層。它也將變得更便宜和更容易維護。

+0

整潔點。我用ElasticSearch獲得了一些經驗,但似乎像spark或solr這樣的工具在這個領域更加成熟;所以會關注他們。我認爲「過早優化」是我在第一時間之後的表達,但無法找到它。我非常感謝你與我分享你的經驗。非常感謝。 – dNitro