使用node.js作为tcp服务器,我将管理相对大量的GPS设备(~3000设备),并且第一步只是将输入数据存储在数据库中,但即使在这个阶段,我也想到一些性能困扰我的问题,我想在他们咬我之前抓住他们。
1 - 使用 java 或 ruby 等语言查看已编写的类似服务器,我看到如下代码:
的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 :(得分:3)
在您列出的选项中选择我会说NodeJS实际上是一个更好的用例选项,因为它不会像其他两个选项一样使用每个连接一个线程。线程通常是给定机器上的有限资源。 Java和Ruby确实有“服务”服务器,如果你想进行苹果与苹果的比较,这些值得关注。
如果您需要有关连接池的建议,我认为您需要详细说明您打算使用的数据库。但是,如果设置成本高昂,重用连接将是一件好事。设置配置池的最小和最大大小可能是个好主意。最终使用的正确尺寸是测试问题。
我认为在这个系统中缓存的好处是最小的,因为你主要是写数据。如果数据有价值,您将需要将其写入磁盘而不是内存。另一方面,如果您的客户正在阅读所收集的数据,或者像Redis那样缓存他们的读数可能是个好主意。
答案 1 :(得分:3)
我确定你知道,但这听起来像是你试图在这里过早地优化你的应用程序。
1-节点是事件驱动的,非阻塞使其成为保持大量开放套接字连接的理想选择,无需为每个连接分叉。与往常一样,请确保您的应用程序已正确聚类。我能够在便宜的笔记本电脑上容纳~100k开放的TCP套接字。如果您需要支持的设备数量不断增长,请相应地进行扩展。
2-我看到你打算使用postgres。游泳池总是一件好事。
3-缓存对“热”数据很有用。被大量查询的东西,因此在内存或redis内部存储(内存中)使得这些数据查找速度更快,并消除了系统的压力。在您的情况下,如果您只需要获取某些数据块,用于分析或更多因果用途,我建议使用spark或solr而不是普通的缓存层。它也会更便宜,更容易维护。