Node.js GPS设备跟踪性能考虑因素

dNi*_*tro 7 performance gps node.js

使用node.js作为tcp服务器,我将管理相对大量的GPS设备(~3000设备),并且第一步只是将输入数据存储在数据库中,但即使在这个阶段,我也想到了一些令人烦恼的性能问题我和我想在他们咬我之前抓住他们.

1 - 使用javaruby等语言查看编写类似的服务器我看到如下代码:

java的

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

红宝石

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

这似乎他们给每个连接到tcp服务器的设备(套接字)提供了单独的线程?由于node.js是单线程的并且是异步的,我应该关注传入的连接还是类似以下简单的方法会满足大量的同时连接?

net.createServer(function(device) {
  device.on('data', function(data) {
    // parse data
    // store in database
  });
});
Run Code Online (Sandbox Code Playgroud)

2 - 我应该使用连接池限制数据库连接吗?由于数据库还从另一侧查询GIS和监控,因此池大小应该是多少?

3 - 我如何在这样的系统中受益于缓存(例如使用redis)?

如果有人对这个想法有所了解,那应该会很棒.我也愿意听到您在实施此类系统时可能遇到或意识到的任何其他性能想法.谢谢.

Fra*_*son 3

  1. 在您列出的选项中进行选择我想说 NodeJS 实际上是适合您的用例的更好选择,因为它不像其他两个选项那样每个连接使用一个线程。线程通常是给定机器上的有限资源。JavaRuby确实有“事件”服务器,如果您想进行同类比较,这些服务器值得一看。

  2. 我认为如果您需要有关连接池的建议,您需要更多地了解您打算使用的数据库。然而,如果连接的设置成本很高,那么重用连接将是一件好事。拥有配置池的最小和最大大小的工具可能是个好主意。最终使用的正确尺寸取决于测试。

  3. 我认为在这个系统中缓存的好处很小,因为您主要是在写入数据。如果数据很有价值,您将希望将其写入磁盘而不是内存。另一方面,如果您的客户端正在读取收集到的数据,那么将其读取的内容缓存在 Redis 等内容中可能是一个好主意。