[英]Is there limit in websockets?
我是 websockets 的新手,當 function 完成生成考試時,我嘗試使用 websockets 向用戶推送通知。
它是如何工作的:
/user/queue/finished-generating-something
並顯示按鈕“Generate exam”。我不知道這是否是正確的方法,但有人說如果考試生成完成就 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.