监控
当你使用 @EnableWebSocketMessageBroker
或 <websocket:message-broker>
时,关键的基础设施组件会自动收集统计信息和计数器,这些信息提供了对应用程序内部状态的重要洞察。该配置还声明了一个类型为 WebSocketMessageBrokerStats
的 bean,它将所有可用信息集中在一个地方,并默认每 30 分钟以 INFO
级别记录一次。这个 bean 可以通过 Spring 的 MBeanExporter
导出到 JMX,以便在运行时查看(例如,通过 JDK 的 jconsole
)。以下列表总结了可用的信息:
客户端 WebSocket 会话
当前
指示当前有多少个客户端会话,并进一步按 WebSocket 与 HTTP 流媒体和轮询 SockJS 会话进行细分。
总计
指示已建立的总会话数。
异常关闭
连接失败
会话已建立,但在 60 秒内未收到任何消息后关闭。这通常是代理或网络问题的指示。
发送限制已超出
会话在超过配置的发送超时或发送缓冲区限制后关闭,这可能发生在慢客户端身上(请参见上一节)。
传输错误
会话在传输错误后关闭,例如无法读取或写入 WebSocket 连接或 HTTP 请求或响应。
STOMP 帧
处理的 CONNECT、CONNECTED 和 DISCONNECT 帧的总数,指示在 STOMP 层上有多少客户端连接。请注意,当会话异常关闭或客户端在未发送 DISCONNECT 帧的情况下关闭时,DISCONNECT 计数可能会较低。
STOMP Broker Relay
TCP 连接
指示为客户端 WebSocket 会话与代理建立的 TCP 连接数量。这应该等于客户端 WebSocket 会话的数量 + 1 个额外的共享“系统”连接,用于从应用程序内部发送消息。
STOMP 帧
转发给代理或从代理接收的 CONNECT、CONNECTED 和 DISCONNECT 帧的总数。请注意,无论客户端 WebSocket 会话是如何关闭的,都会向代理发送 DISCONNECT 帧。因此,较低的 DISCONNECT 帧计数表明代理正在主动关闭连接(可能是因为心跳未及时到达、无效的输入帧或其他问题)。
客户入站渠道
来自支持 clientInboundChannel
的线程池的统计信息,提供了对传入消息处理健康状况的洞察。这里排队的任务表明应用程序可能处理消息的速度过慢。如果存在 I/O 绑定任务(例如,缓慢的数据库查询、对第三方 REST API 的 HTTP 请求等),考虑增加线程池的大小。
客户外部渠道
来自支持 clientOutboundChannel
的线程池的统计信息,提供了有关向客户端广播消息健康状况的洞察。这里排队的任务表明客户端消费消息的速度太慢。解决此问题的一种方法是增加线程池的大小,以适应预期的并发慢客户端数量。另一种选择是减少发送超时和发送缓冲区大小限制(见前一节)。
SockJS 任务调度器
SockJS 任务调度器的线程池统计信息,用于发送心跳。请注意,当在 STOMP 层面上协商心跳时,SockJS 心跳被禁用。