我正在创建一个可监控100-150台设备的监控应用程序......现在设计一个监控应用程序,我有两种方法: -
为要监控的每个设备创建一个线程,每个线程将ping(使用ICMP)到设备以了解设备是否在线。这些线程将在特定时间间隔(例如60秒)后无限运行以了解其状态。
创建一个线程池,并为每个设备将任务提交给线程池。任务是简单ping到设备。因此,在当前的设计中,任务将超过线程池中的线程。例如,假设有100个要监视的设备,将有100个要监视的任务,并且线程池将有40个线程来完成这100个任务。当然,运行下一组任务的持续时间将足以完成线程池中的所有待处理任务。
哪种方法会更好?
答案 0 :(得分:12)
我创建了一个ScheduledExecutorService
(例如通过Executors.newScheduledThreadPool
),允许您安排重复ping。你知道每次ping可能需要多长时间吗?如果你只需要每分钟ping一次100个设备,我就希望你能用很少的线程逃脱 - 远远少于40个。
您可以使用相当少的线程启动它 - 但要注意Mark Peters在评论中提出的信息 - 使用的实现不扩展(正如我所期望的那样) ;它实际上是一个固定的线程池。不过,你应该可以做到少于40 ...
答案 1 :(得分:2)
为每个设备创建单独的线程不是可扩展的解决方案。试想一下,如果你的解决方案必须使用更多的设备,比如100到1000;你不能每次都独立产卵。
创建线程池将是一个理想的解决方案。您可以根据需求和资源可用性调整线程池的大小。如果您需要在固定的时间间隔后以经常性方式ping设备,那么您可以使用预定的执行程序服务,该服务在内部负责定期安排任务。但是,使用线程池是一种明显的选择。
答案 2 :(得分:2)
在计算最大线程数时,您应该考虑ping超时。 如果ping超时为5秒,并且重复周期为60秒,那么有多少线程需要ping 100个设备?
在60秒内,每个线程可以执行12次设备ping(60秒允许12次ping在5秒后超时)。 这意味着你需要至少9个线程,每60秒执行12次ping。
numberOfThreads = numberOfDevices /(pollingPeriod / pingTimeout)= 100 /(60/5)= 100/12 = 9个帖子
答案 3 :(得分:1)
我建议使用线程池,而不是为每个设备创建一个新线程。线程池适用于很多持续时间较短的任务,您的问题非常适合这一点。