Node.js GPS设备跟踪性能注意事项

使用node.js作为tcp服务器,我将要pipe理相对较大数量的GPS设备(〜3000设备),并且将第一步存储传入的数据到数据库中,但即使在这个阶段,我也会设想一些性能问题,我和我想在他们咬我之前抓住他们。

1 – 使用javaruby等语言查看类似的书面服务器我看到如下代码:

java的

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

ruby

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

他们似乎给每个设备(套接字)连接到tcp服务器单独的线程? 由于node.js是单线程的并且是asynchronous的,所以我应该关心传入的连接或者像下面这样简单的方法来满足大量的同时连接吗?

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

2 – 我应该使用连接池来限制数据库连接吗? 由于数据库也从另一端查询GIS和监视,池大小应该是多less?

3 – 如何在这样的系统中获得caching(例如使用redis)?

如果有人对这个想法有所了解,那该多好啊。 我也愿意听到您在实施这些系统时可能会遇到或意识到的任何其他performance想法。 谢谢。

  1. select你已经列出的选项,我会说NodeJS实际上是一个更好的select,因为它不像其他两个选项一样使用每个连接一个线程。 线程通常是给定机器上的有限资源。 Java和Ruby确实有“服务器”,如果你想要一个苹果进行比较,这些值得关注。

  2. 我想你需要多说一下你打算使用的数据库,如果你想要连接池的build议。 但是,如果连接成本高昂,重新使用连接将是一件好事。 设施configuration池的最小和最大尺寸可能是一个好主意。 最终使用正确的尺寸是一个testing问题。

  3. 我认为caching在这个系统中的好处将是最小的,因为你主要是写数据。 如果数据是有价值的,你会想把它写到磁盘而不是内存。 另一方面,如果你有客户正在阅读收集的数据,可能caching他们的读取像Redis可能是一个好主意。

我确定你知道,但是这听起来像是你试图在这里过早地优化你的应用程序。

1-事件驱动和非阻塞的节点使它成为保存大量开放式套接字连接的理想select,不需要为每个连接分派数据。 一如既往,请确保您的应用程序已正确聚集。 我能够在便宜的笔记本电脑上容纳约100k个开放的TCPsockets。 如果您需要支持的设备数量超过此数量,则只需按照相应的比例进行调整即可。

我看到你正在计划使用postgres。 池总是一件好事。

3-caching对于“热”数据是有用的。 被查询的东西很多,因此在内存或内部redis(内存中的存储)中进行查询可以使这些数据更快地查找并消除系统上的压力。 在你的情况下,如果你只是需要获得某些数据块,分析或更多的因果用途,我会build议火花或solr ,而不是一个普通的caching层。 这也会更便宜,更容易维护。