15

我正在创建一个可以监控 100-150 个设备的监控应用程序......现在要设计一个监控应用程序,我有两种方法:-

  1. 为每个设备创建一个线程来监控,每个线程将ping(使用ICMP)到设备以了解设备是否在线。这些线程将在特定时间间隔(例如 60 秒)后无限期地运行以了解其状态。

  2. 创建一个线程池,并为每个设备提交一个任务到线程池。任务是简单地对设备执行 ping 操作。因此,在当前的设计中,任务将比线程池中的线程多。例如,假设有 100 个设备要监控,将有 100 个任务要监控,线程池将有 40 个线程来完成这 100 个任务。当然,运行下一批任务的持续时间将使得完成线程池中的所有待处理任务。

哪种方法会更好?

4

4 回答 4

12

我会创建一个ScheduledExecutorService(例如 via Executors.newScheduledThreadPool)允许您安排重复的 ping。您知道每次 ping 可能需要多长时间吗?如果您只需要每分钟 ping 100 台设备中的每台设备,我希望您可以使用很少的线程——远远少于 40 条。

您可以从相当少量的线程开始 - 但请注意 Mark Peters 在评论中提出的信息 - 使用的实现不会扩展(正如我所期望的那样);它实际上是一个固定的线程池。不过,您应该可以使用少于 40 个...

于 2012-05-21T05:48:41.177 回答
2

为每个设备创建单独的线程不是可扩展的解决方案。试想一下,如果您的解决方案必须使用更多的设备,比如从 100 到 1000;你不能每次都单独产生一个。

创建一个线程池将是一个理想的解决方案。您可以根据需求和资源可用性调整线程池的大小。如果您需要在固定间隔后定期 ping 设备,那么您可以使用计划的执行器服务,该服务在内部负责定期安排任务。但是,是的,使用线程池是显而易见的选择。

于 2012-05-21T05:59:23.417 回答
2

在计算最大线程数时,您应该考虑 ping 超时。给定 5 秒的 ping 超时时间和 60 秒的重复周期,有多少线程需要 ping 100 台设备?

在 60 秒内,每个线程可以执行 12 次设备 ping(60 秒允许 12 次 ping 在 5 秒后超时)。这意味着您至少需要 9 个线程,每个线程每 60 秒执行 12 次 ping。

numberOfThreads = numberOfDevices / (pollingPeriod/pingTimeout) = 100 / (60/5) = 100/12 = 9 个线程

于 2012-05-21T06:00:28.120 回答
1

我建议使用线程池,而不是为每个设备创建一个新线程。线程池适用于许多持续时间短的任务,您的问题非常适合这一点。

于 2012-05-21T05:49:14.363 回答