gpt4 book ai didi

Java并发/网络方法

转载 作者:行者123 更新时间:2023-11-30 04:46:41 25 4
gpt4 key购买 nike

我正在开发一个独立的java应用程序,它通过网络从大约1000个测量设备收集数据并将数据保存到数据库中。由于设备输出和/或网络速度较慢,每个设备的数据收集可能需要几分钟的时间。数据收集必须在某个时间窗口内进行,因此我需要并行工作。

我的方法是为每个测量设备创建一个线程,将数据放入队列中,并在队列的另一端让一个或多个其他线程转换并保存数据。

这是一个可行的方法吗?现代机器能够处理那么多线程和网络连接吗?它的可扩展性如何?什么时候我需要在多台机器上工作?

如果您能给我推荐的并发类(即什么样的队列、ThreadPoolExecutor 等 - 我还没有使用过 java.util.concurrent ,书在邮件中),我也将不胜感激。

有没有更好的方法?

更新:

感谢您迄今为止的回答,以下是一些人请求的更多信息。

我从设备接收的数据是小于 1kb 的文件形式。我有可能在一次传输过程中收到大约 25.000 个文件,尽管通常要少得多。

数据转换不占用 CPU 资源,基本上是解析文件并将其转换为 java 数据类型(文件包含 c 数据类型,如 unsigned char 和 unix 时间戳),再加上 CRC 计算。我创建了一个对象,其中包含一个文件的内容,我使用 JPA 将其保存到数据库(我想在这种情况下我也可以使用普通的 JDBC)。测量文件中没有顺序,因为它们包含设备序列号和时间戳。

稍后,当满足某些条件时,我将不得不添加某种警报,但这不应该是 CPU 密集型的。

从到目前为止的答案来看,我收集了网络连接和线程数量应该不是问题。

我唯一想知道的是队列的方法。另一种方法是让数据收集线程也调用 DAO 方法来保存文件。我想无论如何我都必须使 DAO 线程安全,但我认为一些线程也可以完成这项工作,因为大部分时间都花在传输网络数据上。

我还将研究异步 I/O 和一些提供它的框架。

再次感谢,我稍后会选择一个答案,也许我会得到更多的意见:)

最佳答案

使用默认设置,假设您在 64 位 Linux、Oracle jdk 上运行,您最终将使用大约 1Gb 的内存用于线程堆栈(在此类平台上,默认线程堆栈大小为 1Mb)。我认为对于 OpenJDK 来说也是一样的。不计算 os 分配的缓冲区。 。 .

如果这对您的要求来说太多,您可能需要看看 http://netty.io 。该框架在底层使用java nio(可以配置为使用bio,顺便说一句)。这样,您只需要少量线程来执行实际的 io(对给定的 tcp 连接执行读/写操作)。然后,您的业务逻辑(更新数据库,计算一些测量值)应该被卸载到一个单独的线程池中。 Netty 也包含对此的支持。

如果您想每个连接使用 1 个线程(每个测量设备?),那么让另一组线程执行实际业务工作可能没有任何好处。我假设每个设备有一个线程,因为您说设备可能很慢和/或网络可能很慢。如果您使用多个线程,则这两个瓶颈(网络和设备)都不会被消除(可以预期相反的情况)。

一般并发类:java.util.concurrent.* 是的,都竖起大拇指

关于Java并发/网络方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10831125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com