Частичные сообщения с SockJS в Spring -Websockets 4.2
Я использую Spring -Websockets 4.2 с SockJS.
Поскольку сообщения, полученные клиентами, могут быть довольно большими, я хотел бы использовать частичные сообщения. Мой подкласс TextWebSocketHandler переопределяет supportPartialMessages, чтобы вернуть true. Однако, поскольку SockJsWebSocketHandler, созданный с помощью Spring, не поддерживает частичные сообщения, я все равно получаю сообщение об ошибке code=1009, reason=The decoded text message was too big for the output buffer and the endpoint does not support partial messages
.
В качестве обходного пути я увеличил размер буфера до 1 МБ, как описано здесь, но поскольку мне приходится поддерживать довольно большое количество клиентов (~ 2000 в то же время), для этого требуется слишком много памяти.
Есть ли способ использовать частичные сообщения с SockJS?
Ответы
Ответ 1
Глядя на то, что вы пытаетесь сделать, вы по существу буферизуете 2 ГБ (предположительно 1 МБ) в ОЗУ только для своих параллельных сообщений. Вам необходимо изменить инфраструктуру, масштабировать вертикально или сжать потоки сообщений. Если сжатие сообщений или масштабирование по вертикали не может быть и речи, я думаю, что лучший подход заключается в следующем:
1) Либо используйте внутреннюю балансировку нагрузки с липкими сеансами, чтобы разделить количество одновременных пользователей между разными экземплярами сервера. Или...
2) Реализуйте правильную очередь очереди сообщений с реактивной потоковой передачей, которую может извлечь ваш единственный сервер.
Ваша архитектура приложения выглядит не очень хорошо.