3

我在 java 中构建了一个服务器应用程序,客户端可以在其中连接 . 我已经实现了一个心跳系统,客户端每隔 x 秒发送一条小消息。在服务器端,我将客户端发送消息的时间保存在 HashMap 中,如果我收到来自客户端的任何消息,我会为每个客户端使用 TimerTask 每隔 x 秒检查一次。

少量客户端一切正常,但客户端数量增加(2k+)后,内存量非常大,加上Times必须处理大量TimerTask,程序开始占用大量CPU。

有没有更好的方法来实现这一点?我考虑过使用数据库并选择在一定时间内没有发送任何更新的客户端。你认为这会更好,还是更好的方法。

4

1 回答 1

3

一些随机建议:

  • 每个客户端只有一个计时器,而不是每个客户端只有一个全局计时器,它经常检查接收到的心跳图(比如每秒 10 次)。遍历该地图并找到死客户。记住共享数据结构的线程安全!

  • 如果要使用数据库,请使用轻量级内存数据库,例如。但听起来还是有点矫枉过正。

  • 使用缓存或其他一些过期地图,并在每次驱逐某些东西时得到通知。这样,当客户端发送心跳时,您基本上可以在映射中放置一些内容,并且如果在给定时间内该条目没有发生任何事情,则映射实现将删除它,调用某种监听器。

  • 使用基于角色的系统,如 Akka(具有 Java API)。您可以在服务器端设置一个参与者来处理一个客户端。它比一个线程/计时器更有效。

  • 使用不同的数据结构,例如队列。每次收到心跳时,您都会从队列中删除客户端并将其放回最后。现在定期只检查队列的头部,它应该始终包含具有最早心跳的客户端。

于 2012-11-17T18:56:35.817 回答