生产环境中可能出现一些问题
-
Bug,尽管我们尽力避免,但它们仍然存在!我们始终努力修复它们,但这正是软件开发中的唯一常数。
-
IO 错误,磁盘和硬件可能会损坏
-
内存问题,CPU 可能会因其他进程而变得疯狂
对于这种情况,我们在代理服务器中添加了保护机制,以便在出现问题时自动关闭。
这是一个我希望你永远用不到的功能,把它看作是一种保障措施
我们测量以下地方的响应时间:
-
队列传递(添加到队列中)
-
日志存储
-
分页操作
如果响应时间超过配置的超时时间,则代理服务器被认为不稳定,将采取措施关闭代理服务器或停止虚拟机。
你可以使用以下 broker.xml 配置选项来配置临界分析的执行方式。
名称 | 描述 |
---|---|
critical-analyzer |
启用或禁用临界分析(默认值为 true) |
critical-analyzer-timeout |
用于执行临界分析的超时时间(默认值为 120000 毫秒) |
critical-analyzer-check-period |
用于检查响应时间的间隔(默认值为 critical-analyzer-timeout 的一半) |
critical-analyzer-policy |
服务器在发生故障时应该记录日志、停止还是关闭(默认值为 |
critical-analyzer-policy 的默认值为 LOG
,但生成的 broker.xml 会将其设置为 HALT
。这是因为如果将 ActiveMQ Artemis 嵌入到应用程序服务器或多租户环境中,我们就无法停止虚拟机。
发行版中的代理服务器将设置为 HALT
,但如果你以其他方式使用它,则默认值为 LOG
。
1. 预期结果
-
你将看到一些日志
如果你将 critical-analyzer-policy 设置为 HALT
[Artemis Critical Analyzer] 18:10:00,831 ERROR [org.apache.activemq.artemis.core.server] AMQ224079: The process for the virtual machine will be killed, as component org.apache.activemq.artemis.tests.integration.critical.CriticalSimpleTest$2@5af97850 is not responsive
如果你将 critical-analyzer-policy 设置为 SHUTDOWN
[Artemis Critical Analyzer] 18:07:53,475 ERROR [org.apache.activemq.artemis.core.server] AMQ224080: The server process will now be stopped, as component org.apache.activemq.artemis.tests.integration.critical.CriticalSimpleTest$2@5af97850 is not responsive
如果你将 critical-analyzer-policy 设置为 LOG
[Artemis Critical Analyzer] 18:11:52,145 WARN [org.apache.activemq.artemis.core.server] AMQ224081: The component org.apache.activemq.artemis.tests.integration.critical.CriticalSimpleTest$2@5af97850 is not responsive
你将看到服务器的简单线程转储
[Artemis Critical Analyzer] 18:10:00,836 WARN [org.apache.activemq.artemis.core.server] AMQ222199: Thread dump: AMQ119001: Generating thread dump ******************************************************************************* =============================================================================== AMQ119002: Thread Thread[Thread-1 (ActiveMQ-scheduled-threads),5,main] name = Thread-1 (ActiveMQ-scheduled-threads) id = 19 group = java.lang.ThreadGroup[name=main,maxpri=10] sun.misc.Unsafe.park(Native Method) java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1088) java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809) java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) java.lang.Thread.run(Thread.java:745) =============================================================================== ..... blablablablaba .......... =============================================================================== AMQ119003: End Thread dump *******************************************************************************
-
如果配置为
HALT
,服务器将被停止 -
如果使用
SHUTDOWN
,系统将被停止。**注意:**如果系统运行不正常,则无法保证停止操作能成功。