性能

在性能方面并没有银弹。许多因素会影响性能,包括消息的大小和数量,应用程序方法是否执行需要阻塞的工作,以及外部因素(如网络速度和其他问题)。本节的目标是提供可用配置选项的概述,以及一些关于如何考虑扩展的想法。

在消息传递应用程序中,消息通过由线程池支持的通道进行异步执行。配置这样的应用程序需要对通道和消息流的良好了解。因此,建议查看消息流

显而易见的起点是配置支持clientInboundChannelclientOutboundChannel的线程池。默认情况下,两者都配置为可用处理器数量的两倍。

如果注释方法中消息处理主要是CPU密集型的,则clientInboundChannel的线程数应保持接近处理器数量。如果它们的工作更多地是IO密集型,并且需要在数据库或其他外部系统上阻塞或等待,则可能需要增加线程池大小。

ThreadPoolExecutor有三个重要属性:核心线程池大小、最大线程池大小和用于存储没有可用线程的任务的队列容量。

查看ThreadPoolExecutor的javadoc以了解这些属性的工作原理,并了解各种排队策略。

clientOutboundChannel方面,一切都是关于向WebSocket客户端发送消息。如果客户端在快速网络上,则线程数应保持接近可用处理器数量。如果它们速度慢或带宽低,则需要更长时间来消耗消息并对线程池造成负担。因此,增加线程池大小变得必要。

虽然可以预测clientInboundChannel的工作负载,毕竟它是基于应用程序的操作,但如何配置"clientOutboundChannel"则更难,因为它基于应用程序无法控制的因素。因此,还有两个与发送消息相关的属性:sendTimeLimitsendBufferSizeLimit。您可以使用这些方法来配置发送消息允许花费的时间以及在向客户端发送消息时可以缓冲多少数据。

总体思路是,在任何给定时间,只能使用单个线程来发送给客户端。同时,所有额外的消息都会被缓冲,您可以使用这些属性来决定发送消息允许花费多长时间以及在此期间可以缓冲多少数据。查看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>
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>