如何监视内存使用情况并构建可扩展的Java Web服务器



我们正在用Java编写Web应用程序,该应用程序用作由WebSocket驱动的聊天室服务器。我们正确设计服务器结构,以便可以运行多个相同的服务器实例以支持大规模的连接和通信。问题是我们无法动态扩展服务器群集。理想情况下,任何从属节点都应监视其内存使用情况,并在无法接受更多连接时通知专用的主节点。现在,当过多的连接迅速到达时,Web应用程序只是崩溃了。是否有任何解决方案(或想法)可以改善情况?

在Java中,它很容易检查有关当前群集的一些信息。

MemoryUsage heapMemoryUsage = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage();
heapMemoryUsage.getUsed();

如果要检查该集群的JVM运行时总内存,这是有关如何做的示例。

public class TestMemory {
    public static void main(String [] args) {
        int mb = 1024*1024;
        //Getting the runtime reference from system
        Runtime runtime = Runtime.getRuntime();
        System.out.println("##### Heap utilization statistics [MB] #####");
        //Print used memory
        System.out.println("Used Memory:" 
            + (runtime.totalMemory() - runtime.freeMemory()) / mb);
        //Print free memory
        System.out.println("Free Memory:" 
            + runtime.freeMemory() / mb);
        //Print total available memory
        System.out.println("Total Memory:" + runtime.totalMemory() / mb);
        //Print Maximum available memory
        System.out.println("Max Memory:" + runtime.maxMemory() / mb);
    }
}

所以,现在任何孩子的节点都知道他们在限制上。如果您有开放的Websocket共同点,则应该在所有子节点上都有一个ping并检查它们状态,如果它们大量加载,则可以动态地进行新的节点实例化,例如,使用Docker使事情变得更加容易。(只需在基于云的服务器上部署一个新的Docker容器,请连接到主节点(您可以使用Node.js最终通过Websocket连接到主节点,因此您甚至可以在JVM实际打开之前连接。)"嘿,新节点在这里,gimme做一些事情要做"。在内部,我不知道将流量从一个节点重定向到另一个节点有多远,但是我希望这个想法。如果您想要更准确的连接(更少的崩溃),那就不仅查看内存使用情况,但是网络用法以及丢失了任何TCP软件包或突然关闭WebSocket,服务器应立即告诉主节点以创建其新实例。

尝试使用诸如Jprofiler或Intellij之类的工具注意您的应用程序在过载的情况下的行为,这也可以帮助您注意,如果您ave ave aver ave a aver a aver a aver a dover a a a a a a aver a dove a invo and a a a a aver a dover a awe awe of docles of dockage更多的。如上所述的工具可以检查您的Web服务器或JVM上的负载,但是您的应用程序已部署以确定是否需要扩展硬件或仅仅是应用程序校正就足够了。

超载应用程序的工具是Jmeter,可以帮助您长时间进行压力测试。

相关内容

最新更新