簡體   English   中英

websockets 有限制嗎?

[英]Is there limit in websockets?

我是 websockets 的新手,當 function 完成生成考試時,我嘗試使用 websockets 向用戶推送通知。
它是如何工作的:

  1. 用戶按下按鈕選擇考試科目。
  2. 前端發送隨機生成的用戶名(uuid)並使用用戶名連接到 websocket 服務器
  3. 成功連接后,訂閱/user/queue/finished-generating-something並顯示按鈕“Generate exam”。
  4. 用戶在選擇科目后,按下生成考試並向“/generate-exam”發出請求,在請求正文中發送上面生成的用戶名
  5. 完成生成考試后,將顯示通知,並轉到下一頁

我不知道這是否是正確的方法,但有人說如果考試生成完成就 ping 對客戶不利。

這段代碼在我的本地服務器上工作,也在生產服務器上工作,但是當大約 5000 個用戶連接到 websocket 時,它停止發送消息(訂閱頻道和發送消息有效,並且在后端看到日志)

這是我的后端代碼(Spring):

網絡套接字配置:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws")
                .setAllowedOrigins("*")
                .withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.setApplicationDestinationPrefixes("/app");
        registry.enableSimpleBroker("/topic", "/user/queue/finished-generating-exam",
                "/user/queue/finished-checking-exam");
        registry.setUserDestinationPrefix("/user");
    }

//  used to add username for each connection
    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.interceptors(new ChannelInterceptor() {
            @Override
            public Message<?> preSend(Message<?> message, MessageChannel channel) {
                StompHeaderAccessor accessor =
                        MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
                if (StompCommand.CONNECT.equals(accessor.getCommand())) {
                    List<String> authorization = accessor.getNativeHeader("username");
                    accessor.setUser(new StompPrincipal(authorization.get(0)));
                }

                return message;
            }
        });
    }
}

考試服務

    @Async
    public ExamResponse<?> generateExam(String username) {

        //Generating exam

        webSocketService.sendFinishGenerationExam(username, "created");
    }

WebSocket服務

@Slf4j
@Service
public class WebSocketService {

    @Autowired
    private SimpMessagingTemplate simpMessagingTemplate;

    public void sendFinishGenerationExam(String username, String message) {
        simpMessagingTemplate.convertAndSendToUser(username,
                "/user/queue/finished-generating-exam", message);
        log.info("socket message sent " + message);
    }

    public void sendCheckingOfExamFinished(String username, String message) {
        simpMessagingTemplate.convertAndSendToUser(username,
                "/user/queue/finished-checking-exam", message);
        log.info("socket message sent " + message);
    }
}

對於前端(React):

import SockJS from "sockjs-client";
import { Client } from "@stomp/stompjs";
//some code
const client = new Client({
        webSocketFactory: function () {
          return new SockJS(
            REACT_APP_WEBSOCKET_URL
          );
        },
        connectHeaders: {
          username: username,
        },
        reconnectDelay: 5000,
        debug: function (str) {
          console.log(str);
        },
      });

      client.onConnect = function (frame) {

        let sessionId = getSessionIdFromUrl(client.webSocket._transport.url);

        client.subscribe(
          "/user/queue/finished-generating-exam" + "-user" + sessionId,
          onMessageReceived
        );
      };

      client.activate();
// some code

總是有限制的。 嘗試在本地創建 http(s) 服務,然后打開 5k 連接。 它可能會失敗。

由於這些限制,我在 websockets 上度過了一段不愉快的時光,很難說出你的服務器能夠處理多少連接,而這些連接的“重量”取決於你的應用程序和你擁有的資源。

您將至少達到文件描述符限制。 您將達到 CPU 和 RAM 限制。 您將達到您的網絡限制。 go 設備之間的任何連接都可能出錯。

如果 limit 始終為 5k,這聽起來像是人為設置的限制。 如果連接開始隨機下降,則很難判斷。

由於我現在需要 websocket 時對 websockets 的所有頭痛,我什至不嘗試運行經典 VM,但最好使用一些雲服務,如 AWS ApiGateway Websocket API。如果你運行一些業余項目,當然,socket.io 會做得很好或任何其他選擇。 然而,一旦您開始達到這樣的限制,它就很容易成為一個相當大的挑戰,至少從我在 ws 和 wss 上運行至少 5 個不同應用程序的個人經驗來看是這樣。

從文件描述符限制調試開始,更多信息在這里:

https://unix.stackexchange.com/questions/84227/limits-on-the-number-of-file-descriptors

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM