|
对于最新稳定版本,请使用Spring Framework 7.0.1! |
性能
性能方面没有灵丹妙药。许多因素 影响它,包括消息的大小和数量,以及应用 方法执行需要阻塞和外部因素的工作 (比如网络速度和其他问题)。本节的目标是提供 对可用配置选项的概述及一些想法 关于如何推理缩放。
在消息应用中,消息通过通道传递以实现异步 这些执行由线程池支持。配置此类应用需要 对渠道和信息流有很好的了解。因此,它 建议复习《信息流》。
显而易见的起点是配置支持的线程池clientInboundChannel以及clientOutboundChannel.默认情况下,两者都适用
配置为可用处理器数量的两倍。
如果注释方法中消息的处理主要依赖CPU,则
线程数量clientInboundChannel应保持在
处理器数量。如果他们做的工作更多是IO限制,需要分块的话
或者等待数据库或其他外部系统,线程池大小
可能需要增加。
|
一个常见的混淆点是配置核心池大小(例如10) 最大池大小(例如20)则线程池有10到20个线程。 事实上,如果容量保持在默认值Integer.MAX_VALUE, 线程池从未超过核心池大小,因为 所有额外的任务都被排队。 参见 的 javadoc |
在clientOutboundChannel其次,它主要就是向WebSocket发送消息
客户。如果客户端在高速网络上,线程数量应该是
保持接近可用处理器数量。如果信号慢还是开着
带宽低,它们消耗更长时间,并对
线程池。因此,增加线程池大小变得必要。
虽然工作量很大clientInboundChannel可以预测——毕竟,这基于应用程序的作——如何配置
“clientOutboundChannel”更难,因为它基于其他因素
对应用的控制。因此,另外两项
属性与发送消息相关:发送时间限制和sendBufferSizeLimit(发送缓冲区大小限制).你可以用这些方法来配置
发送时允许携带数据和缓冲量
给客户的消息。
基本思路是,在任何给定时刻,只能使用单一线程 发给客户。与此同时,所有额外的消息都会被缓冲,而你 可以利用这些属性来决定发送消息的时长 同时,记录并缓冲多少数据。参见javadoc和 XML 模式的文档以提供重要的附加细节。
以下示例展示了一种可能的配置:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureWebSocketTransport(WebSocketTransportRegistration registration) {
registration.setSendTimeLimit(15 * 1000).setSendBufferSizeLimit(512 * 1024);
}
// ...
}
以下示例展示了前例的XML配置等价物:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:websocket="http://www.springframework.org/schema/websocket"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/websocket
https://www.springframework.org/schema/websocket/spring-websocket.xsd">
<websocket:message-broker>
<websocket:transport send-timeout="15000" send-buffer-size="524288" />
<!-- ... -->
</websocket:message-broker>
</beans>
你也可以使用前面展示的WebSocket传输配置来配置
STOMP消息的最大允许大小。理论上,WebSocket
消息大小几乎可以无限。实际上,WebSocket服务器会施加
限制——例如,Tomcat 的 8K 和 Jetty 的 64K 。因此,STOMP客户端
如Stomp-JS/Stompjs还有一些则分裂得更大
STOMP消息位于16K边界,并以多个WebSocket消息形式发送,
这需要服务器缓冲并重新组装。
Spring 的 STOMP-over-WebSocket 支持可以做到这一点,因此应用程序可以配置 STOMP消息的最大大小,无论WebSocket服务器特定消息如何 大小。请记住,WebSocket 消息大小是自动的 如有必要,会调整以确保它们能够携带16K WebSocket消息 最低。
以下示例展示了一种可能的配置:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureWebSocketTransport(WebSocketTransportRegistration registration) {
registration.setMessageSizeLimit(128 * 1024);
}
// ...
}
以下示例展示了前例的XML配置等价物:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:websocket="http://www.springframework.org/schema/websocket"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/websocket
https://www.springframework.org/schema/websocket/spring-websocket.xsd">
<websocket:message-broker>
<websocket:transport message-size="131072" />
<!-- ... -->
</websocket:message-broker>
</beans>
关于扩展性的一个重要点是使用多个应用实例。 目前,你无法通过简单的经纪人做到这一点。 然而,当你使用功能齐全的代理商(如RabbitMQ)时,每个应用程序都会 实例连接到代理,消息从一个应用程序广播 实例可以通过代理向连接的WebSocket客户端广播 通过其他任何应用实例。