powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring websocket user notifications
36 сообщений из 36, показаны все 2 страниц
Spring websocket user notifications
    #38953279
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброе утро !

Возникло два вопроса , и две задачки с которыми я только начал разбираться, поэтому нужна помощь и совет :)

1) у нас есть 100_000 онлайн пользователей - которых нужно оповестить - передать им сообщение . Пользователи ничего не отправляют ,им нужно только получать данные в браузере .

2) Хочется делать это через WS , точнее через wss как я понимаю это гарантия того что данный обмен пройдет через любой прокси .

Теперь задача :

Есть два типа сообщений :
первое - это {"status":"ok" , "message":"text"} его приоритет 1
....
второе - это {blob ~10kb} его приоритет 10


раз в 1 секунду отправлять всем пользователям первое сообщение .
Как реализовать ?

простой цикл по всем пользователям которые приконектилсь ?
Допустим что for по 100_000 быстро .... но можно как то уровнять всех пользователей ?

как распараллелить или форнуть такой цикл ?

Второе

нужно как то организовать очередь в которую другой процесс будет класть эти самые сообщения,
при этом если в очередь попало сообщение с приоритетом выше чем сейчас отсылается - нужно перестать рассылать это сообщение .

И начать рассылать сообщение с большим приоритетом ... опять же таки с форком - на всех .... чтобы все пользователи получали сообщения одновременно ...

Идеи ...

1) создать некую очередь с приоритетом,(какую коллекцию выбрать?)
2) создать ExecutorService - потоков на 500 чтобы распараллелить for на 100_000 для быстрой отправки ....
3) как то протестировать все это,чтобы убедиться что ExecutorService и форк будет быстрее это делать,
чем простой цикл от 1 до 100_000 ?
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953306
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если у вас 100К пользователей, то начните с того что у вас это всё должно крутится в кластере и прикиньте сколько клиентов сможет обслуживать одна нода. 100К на ноду звучит маловероятно.
И когда будет примерно понятно сколько держит одна нода, тогда и можно задуматься, действительно ли есть смысл форкать нотификацию, ведь это займет больше CPU ресурсов, отнимая их у других задач пользователей, либо достаточно одного цикла в потоке.


Atum1Допустим что for по 100_000 быстро .... но можно как то уровнять всех пользователей ?
Да - UDP

Atum1как распараллелить или форнуть такой цикл ?
Java 7 ForkJoin ?

Atum11) создать некую очередь с приоритетом,(какую коллекцию выбрать?)
java.util.PriorityQueue ? Только я бы ещё подумал над тем не взять ли полноценную MQ? Нужно ли персистить очередь, например?

Atum12) создать ExecutorService - потоков на 500 чтобы распараллелить for на 100_000 для быстрой отправки ....

А сколько ядер будет у сервера?

Atum13) как то протестировать все это,чтобы убедиться что ExecutorService и форк будет быстрее это делать,
чем простой цикл от 1 до 100_000 ?
На выделеном сервере. Можно в облаке десяток машин поднять, например, в качестве клиентов.
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953391
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, спасибо :)

с самого малого - как в примере изменить логику - чтобы отправка шла от сервера в клиентов - и к примеру каждую секунду возвращала время всем клиентам кто зашел на страницу ?

http://spring-projects.ru/guides/messaging-stomp-websocket/
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953508
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,
посмотри как вариант https://github.com/TooTallNate/Java-WebSocket
но рассылать каждую секунду время - это не правильно - на каждой машине есть свои часы и довольно стабильные , достаточно один раз при соединении послать время и на каждом клиенте при получении времени выводит его с учётом разницы
при 100к клиентах ты не сможещь гарантировать точность отправки в 1 сек.
даи напрягать сервер такой бессмысленной нагрузкой не верно
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953535
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,
спасибо !

по поводу PriorityQueue

что то я сломал видимо :

просто поменял порядок- и все - [9, 8, 6, 7, 3, 2, 5, 1, 4] как такое может быть???

Код: java
1.
2.
3.
4.
5.
6.
testPriorityQueue
[10, 9, 6, 7, 8, 2, 5, 1, 4, 3]
poll : 10
[9, 8, 6, 7, 3, 2, 5, 1, 4]
peek : 9
[9, 8, 6, 7, 3, 2, 5, 1, 4]





Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    @Test
    public void testPriorityQueue() {
        System.out.println("testPriorityQueue");
         List<Integer> list =  IntStream.rangeClosed(1, 10).boxed().collect(Collectors.toList());
        
         
         PriorityBlockingQueue<Integer> integerPriorityQueue = new PriorityBlockingQueue<>(list.size(), ( i1,  i2) -> i2.compareTo(i1) );
         integerPriorityQueue.addAll(list);
         
        
        System.out.println(integerPriorityQueue);
        System.out.println("poll : "+integerPriorityQueue.poll());//Удаление
        System.out.println("peek : "+integerPriorityQueue.peek());//Получение 
        System.out.println(integerPriorityQueue);
    }
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953574
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяно рассылать каждую секунду время - это не правильно - на каждой машине есть свои часы и довольно стабильные , достаточно один раз при соединении послать время и на каждом клиенте при получении времени выводит его с учётом разницы
при 100к клиентах ты не сможещь гарантировать точность отправки в 1 сек.
даи напрягать сервер такой бессмысленной нагрузкой не верно

Это как самый простой тест - который пришел в голову - чтобы видеть лаг ...

а так конечно - при коннекте я буду отправлять серверное время и раз 10 секунд буду его синхронизировать с серверным .
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953735
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автора так конечно - при коннекте я буду отправлять серверное время и раз 10 секунд буду его синхронизировать с серверным .
ты думаешь , что за десять сек изменится стабильность часов?
достаточно 1 раз при коннекте и всё, или один раз в сутки, если подключение клиентов постояное.
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953744
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
при 100к клиентаху тебя не получится отправлять время на любого клиента с с переодичностью 10 сек. этот период будет иметь большую погрешность чем уход часов клиента за 10 сек. и поэтому у тебя время на клиенте будет скакать.
если тебя важно фиксировать время прихода сообщения клиенту- ты можешь к сообщению добавлять время сервера (т.е. всремя отправки сообщения) а на клиенте и корректировать или ещё как использовать.
стабильность времени на клиенте и сервере одинаковое. может отличаться только абсолютная величина , а она будет постоянна если клиент не переведёт время
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953827
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,
у него время чисто как тест вместо сообщения. Чтобы не слать Привет Мир! ))
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953834
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1это гарантия того что данный обмен пройдет через любой прокси .
порт должны будут открыть админы, т.к. протокол работает не на обычном порту.
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953841
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123вадя,
у него время чисто как тест вместо сообщения. Чтобы не слать Привет Мир! ))
вообще интересно если б проект Flightradar24 перевели на ws какой бы стала нагрузка на него?
потому как по https://ru.wikipedia.org/wiki/Flightradar24 ajax не справляется
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953867
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяajax не справляется
AJAX это чисто клиент. Поэтому фраза не справляется сервер не катит.
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953875
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,
UPS я понял твою фразу. По ссылке написано))
IMHO самое неудобное - порты для WS.
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953878
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,
зашёл на сайт. Там же ГУГЛ - API.
Это конечно, тяжеловесно и не чистое WS\AJAX.
У меня на сайте такое же от Оракла
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953918
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AJAX я думаю для меня не катит ...
а вот пример с stomp + MessageBroker
http://spring-projects.ru/guides/messaging-stomp-websocket/

понравился ,

прочитал про проект

http://habrahabr.ru/post/187822/

вроде в пером приближении подходит ...

главное набросать макетик ...
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953934
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123вадя,
IMHO самое неудобное - порты для WS.
расскрой смысл написанного...
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953936
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяPetro123вадя,
IMHO самое неудобное - порты для WS.
расскрой смысл написанного...
17614123
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953939
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Atum1это гарантия того что данный обмен пройдет через любой прокси .
порт должны будут открыть админы, т.к. протокол работает не на обычном порту.
Где почитать? Википедия пишет что по 80му.
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953946
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczвадяпропущено...

расскрой смысл написанного...
17614123

да, с этим соглашусь. тут надо оценить затраты и преимущества. в общем открыть один порт не является большой дырой в безопасности.
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953952
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,

думал так можно отправить время ... но что то Scheduled не вызывается ? в чем проблема?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
@Controller
public class WsController {

    @Autowired
    private  MessageSendingOperations<String> messagingTemplate;
    
    @Scheduled(fixedDelay = 1000)
    public void sendQuotes() {
           System.out.println("sendQuotes");
            String destination = "/topic/greetings";
            this.messagingTemplate.convertAndSend(destination, Calendar.getInstance().getTime().toString());
        
    }
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953954
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,
а можно все завернуть в wss по 443 ?

или 8080, 8081 ?
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953961
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1вадя,
а можно все завернуть в wss по 443 ?

или 8080, 8081 ?

можно исползовать любой порт, лишь бы он не входил в конфликт с уже имеющимися обработчиками портов
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953962
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczГде почитать? Википедия пишет что по 80му.
наверно ты прав. У меня разрыв мозга по данному вопросу. Имею двоякую инфу)).
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953964
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяможно исползовать любой порт, лишь бы он не входил в конфликт с уже имеющимися обработчиками портов
тут надо подробнее.
Т.к. админы часто всё закрывают кроме 80 (FTP\качалки торрент и т.д.)
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953965
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1вадя,

думал так можно отправить время ... но что то Scheduled не вызывается ? в чем проблема?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
@Controller
public class WsController {

    @Autowired
    private  MessageSendingOperations<String> messagingTemplate;
    
    @Scheduled(fixedDelay = 1000)
    public void sendQuotes() {
           System.out.println("sendQuotes");
            String destination = "/topic/greetings";
            this.messagingTemplate.convertAndSend(destination, Calendar.getInstance().getTime().toString());
        
    }


а просто передать сообщение ты можешь?
сам канад работает?
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953972
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123вадяможно исползовать любой порт, лишь бы он не входил в конфликт с уже имеющимися обработчиками портов
тут надо подробнее.
Т.к. админы часто всё закрывают кроме 80 (FTP\качалки торрент и т.д.)

такие вопросы решаются административным путём.
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953976
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяAtum1вадя,

думал так можно отправить время ... но что то Scheduled не вызывается ? в чем проблема?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
@Controller
public class WsController {

    @Autowired
    private  MessageSendingOperations<String> messagingTemplate;
    
    @Scheduled(fixedDelay = 1000)
    public void sendQuotes() {
           System.out.println("sendQuotes");
            String destination = "/topic/greetings";
            this.messagingTemplate.convertAndSend(destination, Calendar.getInstance().getTime().toString());
        
    }


а просто передать сообщение ты можешь?
сам канад работает?

нет сам не могу(((


более того закоментил все аннотации по сокетам и тогда этот код работает :

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
@EnableScheduling
@Component
public class ScheduledTasks {

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    @Scheduled(fixedDelay = 2000)
    public void reportCurrentTime() {
        System.out.println("The time is now " + dateFormat.format(new Date()));
    }
}




как только добавляется брокер - возникает ошибка - из за того что в системе уже есть EnableScheduling

Просто конфликт конфигурации спринга
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953979
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. подружиться они не хотят

работает либо это :

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
@Configuration
@EnableWebSocketMessageBroker
public class StompWebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

	@Override
	public void configureMessageBroker(MessageBrokerRegistry config) {
		config.enableSimpleBroker("/topic");
		config.setApplicationDestinationPrefixes("/app");
	}

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

    @Override
    public void configureWebSocketTransport(WebSocketTransportRegistration registration) {
        registration.setSendTimeLimit(2*1000).setSendBufferSizeLimit(512 * 1024);
    }
        
        

}




Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
@Controller
public class WsController {
   
    
    @MessageMapping("/hello")
    @SendTo("/topic/greetings")
    public Greeting greeting(HelloMessage message) throws Exception {
        return new Greeting("Hello, " + message.getName() + "!");
    }



но тогда не рбоатет

@Scheduled(fixedDelay = 1000)
public void sendQuotes() {
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953980
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще с ws надо быть аккураным, если их использовать для браузеров - посморев код (благо он почти всегда открыт) можно сформировать с любого стороннего устройста подключение и зная протокол сообщения отправлять на сервер всякую ерунду
поэтому надо как то произвожить верификацию подключения. потому как wss спасает только от внешнего прослушивания.
как вариант привязать его к сессии http.
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953992
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадятакие вопросы решаются административным путём.
я про технологии.
Как работает браузер на одном порту в обоих режимах?
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38953997
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

Вроде как шедулер заработал !!! и теперь я отдаю в /topic/greetings время которое обновляю на клиенте.

По поводу безопасности : все под @EnableWebSecurity , вроде если пользователь на авторизовался - то работать не будет ...
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38954001
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,

Теперь нужно нагрузить очередь и распаралелить
и добавить обработку ошибок и переподключений с клиента ...


так же нужно понять сколько сейчас клиентов в сети .....


пойду курить исходники на scala http://ru.lichess.org/ как то же эта штука работает ....
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38954012
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38954022
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123вадятакие вопросы решаются административным путём.
я про технологии.
Как работает браузер на одном порту в обоих режимах?
вопрос интересный
надо будет поробовать как-нибудь на досуге...
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38954230
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок. первый этап - работает . Тайминг по расписанию с задержкой в 1 секунду - время на клиенте обновляется .


Вопрос как теперь протестировать нагрузку??? сколько клиентов потянет такое решение?
...
Рейтинг: 0 / 0
Spring websocket user notifications
    #38954260
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Atum1
Вопрос как теперь протестировать нагрузку??? сколько клиентов потянет такое решение?[/quot]
вопрос очень интерсный, где взять столько клиентов для тестов....
протестируешь, обязательно отпишись.
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring websocket user notifications
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]