我创建了一个代表用户会话的类,该用户会话每25秒向另一个服务发送一次ping。为此,我在该类中使用了ScheduledExecutorService
和ScheduledFuture
。
public class UserSession {
private ScheduledExecutorService scheduledExecutorService;
private ScheduledFuture<?> keepAliveTask;
public UserSession() {
this.scheduledExecutorService = Executors.newScheduledThreadPool(1);
this.keepAliveTask = scheduledExecutorService.scheduleAtFixedRate(() -> {
this.sendPing();
}, 25L, 25L, TimeUnit.SECONDS);
}
.....
.....
}
现在的问题是,大约会有4000-5000个用户会话,因此会有40005000个UserSession
对象,每个对象都有自己的ScheduledExecutorService
和单线程。因此,如果我正确理解这一点,将有大约4000-5000个线程,每个线程负责发送各自会话的ping。
那么,JVM会处理那么多线程或ScheduledExecutorService
吗?我知道这取决于CPU,但这是个好主意吗?或者还有更好的选择吗?
JVM将线程委托给底层操作系统。
因此,如果操作系统和硬件(主要是处理器及其核心(能够在一个进程中支持那么多线程,那么您的问题就更令人担忧了。
这是个好主意吗?或者还有更好的选择吗?
我不知道你项目的界限。实现目标的其他想法:
- Quartz和消息队列应用程序,例如ActiveMQ、RabbitMQ,甚至Apache Kafka
- 像Akka这样的演员模型系统,包含演员和调度器