我在java中构建了一个服务器应用程序,客户端可以在其中连接。我已经实现了一个心跳系统,客户端每x秒发送一条小信息。 在服务器端,我在HashMap中保存客户端发送消息的时间,如果我从客户端收到任何消息,我会为每个客户端使用TimerTask检查每x秒。
对于少量客户端来说一切正常,但是在客户端数量增加(2k +)之后内存量非常大,加上Times必须处理很多TimerTask并且程序开始吃掉很多CPU。
有没有更好的方法来实现这个?我考虑使用数据库并选择在一定时间内未发送任何更新的客户端。 你认为这会更好,或者是一种更好的方法。
答案 0 :(得分:3)
几个随机的建议:
每个客户端没有一个计时器,只有一个全局计时器可以经常检查接收到的心跳图(比如说每秒10次)。迭代该地图并找到死客户。记住共享数据结构的线程安全性!
如果要使用数据库,请使用轻量级内存数据库,如h2。但听起来仍然有点矫枉过正。
使用缓存或其他一些过期的地图,每次被驱逐时都会收到通知。这样,当客户端发送心跳时,您基本上会在地图中放置一些内容,如果在给定的时间内该条目没有发生任何事情,则地图实现将删除它,调用某种监听器。
使用像Akka这样的基于actor的系统(拥有Java API)。您可以在服务器端有一个处理一个客户端的actor。它比一个线程/计时器更有效。
使用不同的数据结构,例如一个队列。每次收到心跳时,都会从队列中删除客户端并将其放回最后。现在,只定期检查队列的头部,该头部应始终包含具有最早心跳的客户端。