如何在Java中同时与1000个套接字进行通信?

vsi*_*ngh 5 java sockets

这是问题描述我们有数千台设备(大约4k-5k),我们必须每2分钟或30秒连续读取数据.每个设备都有其独特的IP.将收集此数据,然后将其存储在数据库中.这些设备位于全国各地的100个位置.数据不会24X7读取,但至少12小时.

有一个Web应用程序可以在某个时刻请求显示通过这些设备收集数据的数据.我们知道正在请求设备的数据.

这就是我们认为我们可以用Java实现的方式

解决方案A:在每个位置,指定一台将充当服务器的计算机,并从x个设备读取数据.此数据将每1小时推送到中央服务器.在这个指定的机器上,数据被拉出并存储在本地(平面文件或内存数据库)

在这种情况下,我们将拥有与位置数量一样多的服务器.例如,我们可能最终拥有1500台服务器/机器管理,这成为一场噩梦.

解决方案B:

我们有8-10个中央服务器,每个服务器从一堆机器中读取数据.数据排队并按照它到达的顺序被拾取.

服务器将数据推送到数据库.

客户如何获取数据

在解决方案B中,客户端从数据库获取它,假设数据已被推送到数据库并且仍然没有排队.

您认为应该做得更好?

任何替代设计/解决方案?

我们应该考虑使用Unix/Perl在服务器上进行编程.出于某些其他原因,我们不想使用C++.

mer*_*ike 4

您问题中所述的要求并不意味着 1000 个并发连接,因为您可以轻松地每 30 秒重新建立连接。假设可以在 500 毫秒内处理一个连接,则剩下 5000 / 30 * 0.5 ~= 100 个并发连接。任何像样的操作系统都应该能够处理那么多。由于并发性如此之低,您甚至可以不用使用单个服务器,每个连接都由专用线程工作。

因此,您的设计应该关注您的其他要求。一些想法:

  • 设备是否有防火墙?使用解决方案 A,您将拥有来自每个位置的传出连接,使用解决方案 B,您将拥有传入连接。
  • 您需要什么样的可靠性?例如,如果某个位置的互联网连接中断,您是否需要记录测量结果?这意味着本地服务器缓冲测量结果。