2015-10-27 11 views
13

Używam Spring-Websockets 4.2 z SockJS.Częściowe wiadomości z SockJS w Spring-Websockets 4.2

Ponieważ wiadomości odbierane przez klientów mogą być dość duże, chciałbym użyć częściowych wiadomości. Moja podklasa TextWebSocketHandler zastępuje standardPartialMessages, aby zwracać wartość true. Ponieważ jednak SockJsWebSocketHandler utworzony przez Spring nie obsługuje częściowych wiadomości, nadal pojawia się błąd code=1009, reason=The decoded text message was too big for the output buffer and the endpoint does not support partial messages.

W celu obejścia tego problemu zwiększyłem rozmiar bufora do 1 MB zgodnie z opisem here, ale ponieważ muszę obsługiwać dość dużą liczbę klientów (~ 2000 w tym samym czasie), wymaga to zbyt dużo pamięci.

Czy istnieje sposób na wykorzystanie częściowych wiadomości z SockJS?

+0

Czy byłeś w stanie rozwiązać ten problem. Mam także do czynienia z tym samym problemem i nie mogłem znaleźć rozwiązania? Również liczby wymienione w 'container.setMaxTextMessageBufferSize (16384)', jest to w bitach, bajtach kbs lub co? – BiJ

+0

Nie, niestety nie. Sami zakończyliśmy wdrażanie częściowego przesyłania wiadomości, dzieląc się na nadawcę i ponownie składając w odbiorniku. Zestaw setMaxTextMessageBufferSize znajduje się w bajtach AFAIK. – Jan

+0

Czy możesz użyć lepkiego równoważnika obciążenia podobnego do sesji, aby podzielić wiadomości? Wygląda na to, że musisz zaimplementować strumień reaktywny lub użyć odpowiedniej wielkości kolejki komunikatów poza zwykłymi gniazdami do obsługi wiadomości. –

Odpowiedz

0

Patrząc na to, co próbujesz zrobić, zasadniczo buforujesz 2 GB (przy założeniu 1 MB) w pamięci RAM tylko dla twoich współbieżnych wiadomości. Musisz zmienić infrastrukturę, skalować w pionie lub kompresować strumienie wiadomości. Jeśli kompresowanie komunikatów lub skalowanie w pionie nie wchodzi w grę, uważam, że najlepszym podejściem jest:

1) Użyj wewnętrznego równoważenia obciążenia za pomocą lepkich sesji, aby podzielić liczbę równoczesnych użytkowników między różne instancje serwera. Lub ...

2) Zaimplementuj odpowiednią kolejkę komunikatów skalowania za pomocą strumienia reaktywnego, z którego może pobierać pojedynczy serwer.

Twoja architektura aplikacji nie wygląda dobrze.