Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何与1000';Java中socket的同步性?_Java_Sockets - Fatal编程技术网

如何与1000';Java中socket的同步性?

如何与1000';Java中socket的同步性?,java,sockets,Java,Sockets,这是问题描述 我们有数千台设备(约4k-5k),通过这些设备,我们必须每2分钟或30秒连续读取数据。每个设备都有其唯一的IP。 这些数据将被收集并存储在数据库中。这些设备位于全国100多个地点。 数据不会全天候读取,但至少会持续12小时 有一个web应用程序会在某个时候请求显示通过这些设备收集的数据。 我们将知道从哪个设备请求数据 这就是我们认为可以用Java实现的方法 解决方案A: 在每个位置,指定一台机器作为服务器,从x个设备读取数据。此数据将每1小时推送到中央服务器。 在这个指定的机器上,

这是问题描述 我们有数千台设备(约4k-5k),通过这些设备,我们必须每2分钟或30秒连续读取数据。每个设备都有其唯一的IP。 这些数据将被收集并存储在数据库中。这些设备位于全国100多个地点。 数据不会全天候读取,但至少会持续12小时

有一个web应用程序会在某个时候请求显示通过这些设备收集的数据。 我们将知道从哪个设备请求数据

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

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

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

解决方案B

我们有8-10台中央服务器,每台服务器从一堆机器上读取数据。数据排队并按到达的顺序拾取

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

客户端如何获取数据

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

你认为什么应该做得更好

有其他设计/解决方案吗


我们应该考虑使用Unix/Perl在服务器上编程吗。我们不想用C++来解决其他的问题。

尝试.< /p> < p>您没有提到让客户端与服务器交谈,而不是相反。这是一种选择吗?您也没有提到传输的数据量


您提到的数字对于Java服务器(具有适当的连接池等)来说并不是不合理的。尝试原型化一些解决方案,只是为了测试通信和线程/连接池。请查看框架,例如。

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

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

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

如果可能的话,我认为您的客户机应该发送JMS消息或某种队列,然后处理队列以存储在数据库中。有一个ActiveMQ可以很好地解决这个问题。如果您喜欢基于云的部署,那么与主数据库通信的java服务器也可以使用SQS(来自amazon)。如果您保持连接,您应该能够在每个连接的20微秒内轮询每个连接。这意味着您可以在不到100毫秒的时间内轮询每个连接,只需取消一个非阻塞线程。(也许这是最不有效的方法)

使用选择器是一种更好的方法,因为它提供了一组就绪连接


如果每次都创建一个新连接,这将非常昂贵,但可能需要20毫秒(更长的时间取决于网络的延迟)。要在30秒内汇集5000个连接,您需要随时保持3-4个连接处于活动状态。(大部分时间将用于建立和破坏连接)您可以用一个线程完成所有这些,但使用一个小线程池可能更简单。

每2.5分钟或30秒收集多少数据?另外,看看Java NIO——现在Java的连接数并不难。仅供参考——持续!=每2.5分钟或30秒一次…;)客户机是基于java的系统还是随机的“哑”硬件?它们是与物理机器对话并提取数据的硬件。我们必须从这些硬件中获取这段数据。它们是否具有更高级别的语言编程能力?5000/30*0.5~=100个并发连接。是的,那是正确的号码。所有这些设备都在VPN内。感谢您提出这些问题。谈到时间限制,我们需要创建线程、打开连接、读取数据、关闭连接,然后线程完成。让线程保持30秒的活动时间是没有意义的。你不需要1000个线程,但是如果你有一个包含1000个任务的线程池(请参阅Executor),那么你会让线程一直保持活动状态,因为你会一直轮询一个或另一个设备。有时,创建和销毁线程的成本大于保留线程的成本。类似地,如果您可以保持连接打开,则可以大大减少服务器和客户端的开销。客户端将与服务器通信,服务器将从套接字收集的数据库中提取数据。我们将研究ApacheMina。这看起来对我们正在尝试做的事情来说是相当沉重的。