当前位置: 首页 > 知识库问答 >
问题:

Websoc上的Spring Stomp:消息/缓冲区/缓存/流限制

冯嘉珍
2023-03-14

无法理解我用于开发涉及图像/视频的聊天应用程序的stomp over websocket配置中的不同参数:

我注意到网页中的SockJ发送的消息帧大小为16K。我还测试了消息大小限制是什么决定了我可以传输的消息的最大大小。

你能让我知道什么是:

>

  • 流字节限制

    发送缓冲区大小限制

    http消息缓存大小

    什么是部分消息以及如何使用它们,它们在这里有用吗?

    此外,我计划将图像/视频的最大大小设置为2GB,预计在发布时会同时有大约100名用户。

    你能告诉我们我应该保留什么尺寸吗?为什么?默认值是什么?以及它们中的每一个会如何影响我的聊天应用程序的性能?

    @Configuration
    @EnableWebSocketMessageBroker
    public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
    
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/stomp").withSockJS()
                .setStreamBytesLimit(15 * 1024)
                .setHttpMessageCacheSize(15 * 1024);
    }
    
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/queue/", "/topic/", "/exchange/");
        registry.setApplicationDestinationPrefixes("/app");
    }
    
    @Override
    public void configureWebSocketTransport(WebSocketTransportRegistration registration) {
        registration.setSendTimeLimit(15 * 1000)
                .setSendBufferSizeLimit(1 * 1024)
                // max message size 2GB (2048 bytes) : default is 64KB
                .setMessageSizeLimit(2 * 1024 * 1024);
    }
    

    }

  • 共有1个答案

    公冶阳德
    2023-03-14

    用我的发现和实施回答问题:

    在以下配置中:

    @Override
    public void configureWebSocketTransport(WebSocketTransportRegistration registration) {
        registration.setSendTimeLimit(60 * 1000)
                .setSendBufferSizeLimit(200 * 1024 * 1024)
                .setMessageSizeLimit(200 * 1024 * 1024);
    }
    

    >

    /**
     * Streaming transports save responses on the client side and don't free
     * memory used by delivered messages. Such transports need to recycle the
     * connection once in a while. This property sets a minimum number of bytes
     * that can be send over a single HTTP streaming request before it will be
     * closed. After that client will open a new request. Setting this value to
     * one effectively disables streaming and will make streaming transports to
     * behave like polling transports.
     * <p>The default value is 128K (i.e. 128 * 1024).
     */
    public SockJsServiceRegistration setStreamBytesLimit(int streamBytesLimit) {
        this.streamBytesLimit = streamBytesLimit;
        return this;
    }
    

    发送缓冲区大小限制默认为512KB。如果消息发送缓慢,则会缓冲后续消息,直到达到sendTimeLimit或sendBufferSizeLimit。

    http消息缓存大小:来自源的信息

    /**
     * The number of server-to-client messages that a session can cache while waiting for
     * the next HTTP polling request from the client. All HTTP transports use this
     * property since even streaming transports recycle HTTP requests periodically.
     * <p>The amount of time between HTTP requests should be relatively brief and will not
     * exceed the allows disconnect delay (see
     * {@link #setDisconnectDelay(long)}), 5 seconds by default.
     * <p>The default size is 100.
     */
    public SockJsServiceRegistration setHttpMessageCacheSize(int httpMessageCacheSize) {
        this.httpMessageCacheSize = httpMessageCacheSize;
        return this;
    }
    

    什么是部分消息以及如何使用它们,它们在这里有用吗?仍然不确定如何通过websocket传输大型文件并使用部分消息传递(决定改用HTTP)

    此外,我计划将图像/视频的最大大小设置为2GB,并预计在我发布时同时使用大约100个用户。=

    //set up the server limits using apache file-upload config
    @Bean
    public CommonsMultipartResolver multipartResolver() {
        CommonsMultipartResolver resolver = new CommonsMultipartResolver();
        resolver.setMaxUploadSize(2 * 1024 * 1024 * 1024); // 2 GB limit set for file upload
        resolver.setDefaultEncoding("utf-8");
        return resolver;
        }
    
     类似资料:
    • 我有一个二进制数据缓冲区,我想存储在协议缓冲区中。 在留档(https://developers.google.com/protocol-buffers/docs/proto#scalar)中,它说类型等价于C中的。我无法相信这一点,所以我不得不尝试它,是的,这似乎是这样... 本协议: 给出一个包含以下内容的消息定义: 公共setter/getter API如下所示: 当然,这不是在消息中存储二

    • 纯JavaScript是Unicode友好的,但二进制数据却不是这样。 在处理TCP流或文件系统时,必须处理八位字节流。 Node提供了Buffer类,它提供了存储类似于整数数组的原始数据的实例,但对应于V8堆外部的原始内存分配。 Buffer类是一个全局类,可以在应用程序中访问而无需导入缓冲区模块。 创建缓冲区 节点缓冲区可以以多种方式构建。 Method 1 以下是创建10个八位字节的无启动缓

    • 我发现了一个有趣的协议缓冲区问题。如果您有两条类似的消息,那么可以使用C API或命令行解析其中一条消息,就像解析另一条消息一样。 ParseFromString的有限文档没有提到它不需要使用所有字符串,如果不使用,它也不会失败。 我原以为ParseFromString无法解析类型为a的消息,如果它显示的是类型为B的消息。毕竟消息包含了额外的数据。然而,事实并非如此。示例脚本演示了该问题: 输出为

    • 我正在尝试让JMS消费者致力于ActiveMQ服务器,但是我遇到了一些问题,这些解决方案似乎只会导致更多问题。 我正在使用Spring的DMLC(cacheLeve设置为CACHE\u连接)和CachingConnectionFactory(cachingConsumers设置为true),将Activemq自己的连接工厂包装在部署在Jboss AS中的Webapp中。 据此http://acti

    • 我正在阅读有关流的信息,发现我们可以使用setvbuf()函数来控制流......它写的是在行缓冲模式中,当遇到换行符时流将数据发送到文件中,在无缓冲状态下没有缓冲......所以我写了以下代码...... 所以我认为,因为这些是无缓冲流,所以输入应该在我写入屏幕后立即发送到标准输出。。。但程序在写入每一行后等待我按enter键,然后屏幕上只显示输出(由于fwrite)。。。我的问题是,当这些是无

    • 在DirectX中,您可以有单独的渲染目标和深度缓冲区,因此可以绑定渲染目标和一个深度缓冲区、执行一些渲染、移除深度缓冲区然后使用旧的深度缓冲区作为纹理进行更多渲染。 你会如何在opengl中做到这一点?根据我的理解,您有一个帧缓冲区对象,其中包含颜色缓冲区和可选的深度缓冲区。我不认为我可以同时绑定多个帧缓冲器对象,我是否必须在每次更改时(可能一帧几次)重新创建帧缓冲器对象?普通的 opengl