gpt4 book ai didi

java - 如何监控内存使用情况并构建可扩展的 java web 服务器?

转载 作者:太空宇宙 更新时间:2023-11-04 10:52:18 26 4
gpt4 key购买 nike

我们正在使用 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 实际启动之前进行连接。)只需告诉“嘿,这里是新节点,给我一些要做的事情”。在内部,我不知道将流量从一个节点重定向到另一个节点会有多远,但我希望这个想法。如果您想要更准确的连接(更少的崩溃),不要只查看内存使用情况,还要查看网络使用情况以及是否有 TCP包丢失或者websocket突然关闭,服务器应该立即告诉主节点创建一个新的实例。

关于java - 如何监控内存使用情况并构建可扩展的 java web 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47671727/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com