如何与1000';Java中socket的同步性?
这是问题描述 我们有数千台设备(约4k-5k),通过这些设备,我们必须每2分钟或30秒连续读取数据。每个设备都有其唯一的IP。 这些数据将被收集并存储在数据库中。这些设备位于全国100多个地点。 数据不会全天候读取,但至少会持续12小时 有一个web应用程序会在某个时候请求显示通过这些设备收集的数据。 我们将知道从哪个设备请求数据 这就是我们认为可以用Java实现的方法 解决方案A: 在每个位置,指定一台机器作为服务器,从x个设备读取数据。此数据将每1小时推送到中央服务器。 在这个指定的机器上,数据被本地提取和存储(平面文件或内存数据库) 在这种情况下,我们将拥有与位置数量相同的服务器。例如,我们最终可能会有1500台服务器/机器进行管理,这将成为一场噩梦 解决方案B: 我们有8-10台中央服务器,每台服务器从一堆机器上读取数据。数据排队并按到达的顺序拾取 服务器将数据推送到数据库 客户端如何获取数据 在解决方案B中,客户机从数据库获取数据,假设数据已被推入数据库,并且仍然没有排队 你认为什么应该做得更好 有其他设计/解决方案吗如何与1000';Java中socket的同步性?,java,sockets,Java,Sockets,这是问题描述 我们有数千台设备(约4k-5k),通过这些设备,我们必须每2分钟或30秒连续读取数据。每个设备都有其唯一的IP。 这些数据将被收集并存储在数据库中。这些设备位于全国100多个地点。 数据不会全天候读取,但至少会持续12小时 有一个web应用程序会在某个时候请求显示通过这些设备收集的数据。 我们将知道从哪个设备请求数据 这就是我们认为可以用Java实现的方法 解决方案A: 在每个位置,指定一台机器作为服务器,从x个设备读取数据。此数据将每1小时推送到中央服务器。 在这个指定的机器上,
我们应该考虑使用Unix/Perl在服务器上编程吗。我们不想用C++来解决其他的问题。 尝试.< /p> < p>您没有提到让客户端与服务器交谈,而不是相反。这是一种选择吗?您也没有提到传输的数据量
您提到的数字对于Java服务器(具有适当的连接池等)来说并不是不合理的。尝试原型化一些解决方案,只是为了测试通信和线程/连接池。请查看框架,例如。您的问题中所述的要求并不意味着1000秒的并发连接,因为您可以轻松地每30秒重新构建一次连接。假设一个连接可以在500毫秒内处理掉,那就剩下5000/30*0.5~=100个并发连接。任何像样的操作系统都应该能够处理这么多。对于这种低并发性,您甚至可以使用一台服务器,每个连接都由一个专用线程处理 因此,您的设计应该关注其他需求。一些想法:
- 这些设备有防火墙吗?使用解决方案A,您将拥有来自每个位置的传出连接,使用解决方案B,您将拥有传入连接李>
- 你需要什么样的可靠性?例如,如果某个位置的internet连接断开,是否需要记录测量值?这意味着需要一个本地服务器缓冲测量值
如果每次都创建一个新连接,这将非常昂贵,但可能需要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。这看起来对我们正在尝试做的事情来说是相当沉重的。