Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Как правильно выбрать реализацию  [new]
qi_ip
Member

Откуда:
Сообщений: 577
Приветствую!

Подскажите, как правильно продумать механизм доставки сообщений.

Есть сокет сервер (чат-сервер), к которому подключаются клиенты. 1 клиент - 1 соединение.
При общении - все понятно, один клиент пишет другому - сообщение по Id отправляется.

Есть нюанс. Каждый определенный период времени формируются сообщения, которые нужно разослать только тем пользователям, которые в статусе Online. Причем, необходимо соблюсти обязательный порядок доставки.

То есть, например, за час было сгенерировано 5 сообщений: msg1, msg2, msg3, msg4, msg5.
User1 стал online. Сервер посылает ему msg1, User1 подтвердил получение сообщения, сервер посылает ему msg2 и так далее.

Если в какой-то момент, User1 не подтвердил доставку msg2, то через 5 секунд, ему повторно отсылается msg2 и так до тех пор, пока User1 не подтвердит что получил msg2.

Один из вариантов, перед каждой отправкой (каждые 5 секунд), брать список онлайн пользователей и перебором отправлять каждому сообщение, походу обрабатывая ответы. Но этот вариант долгий, так как если слишком много online пользователей, последний получит сообщение очень поздно, а время доставки тут тоже критично.

Или для каждого пользователя создавать отдельный Thread и в нем работать. Но тогда есть вариант, что будет слишком много одновременных потоков (1000>)

Какие еще есть оптимальные варианты доставки по времени.

Спасибо!
12 фев 19, 09:34    [21807055]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выбрать реализацию  [new]
qi_ip
Member

Откуда:
Сообщений: 577
Еще, как вариант, чтобы от online клиента, каждые 5 секунд шел запрос, в ответ на который отдавать сообщение.
12 фев 19, 09:39    [21807061]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выбрать реализацию  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
qi_ip
перебором отправлять каждому сообщение, походу обрабатывая ответы. Но этот вариант долгий
сколько в цифрах слово Долгий?
12 фев 19, 10:28    [21807109]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выбрать реализацию  [new]
qi_ip
Member

Откуда:
Сообщений: 577
Petro123, от 3 до 5-8 секунд
12 фев 19, 10:49    [21807134]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выбрать реализацию  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
qi_ip,
Не каждому поток, пул потоков. Уже давно даже в первом классе проходят.
Ну или не велосипед, готовую либу для этих сообщений.
12 фев 19, 11:25    [21807181]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выбрать реализацию  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
qi_ip, а каким образом клиент подтверждает получение? Что то подтверждает клиент вручную ?
12 фев 19, 12:59    [21807300]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выбрать реализацию  [new]
qi_ip
Member

Откуда:
Сообщений: 577
Озверин
qi_ip, а каким образом клиент подтверждает получение? Что то подтверждает клиент вручную ?

Нет, клиентское ПО получает сообщение, сохраняет у себя локально и возвращает статус, что все получено.
12 фев 19, 14:41    [21807440]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выбрать реализацию  [new]
qi_ip
Member

Откуда:
Сообщений: 577
Petro123
qi_ip,
готовую либу для этих сообщений.

Просветите о чем речь!?
12 фев 19, 14:50    [21807461]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выбрать реализацию  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
qi_ip
Озверин
qi_ip, а каким образом клиент подтверждает получение? Что то подтверждает клиент вручную ?

Нет, клиентское ПО получает сообщение, сохраняет у себя локально и возвращает статус, что все получено.


и, как я понимаю, все это у вас реализовано на сокетах поверх tcp протокола?
12 фев 19, 15:00    [21807480]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выбрать реализацию  [new]
qi_ip
Member

Откуда:
Сообщений: 577
Озверин, да
12 фев 19, 15:32    [21807531]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выбрать реализацию  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
qi_ip
Озверин, да


а сокеты - блокирующие или нет?
12 фев 19, 15:38    [21807545]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выбрать реализацию  [new]
qi_ip
Member

Откуда:
Сообщений: 577
Озверин
qi_ip
Озверин, да


а сокеты - блокирующие или нет?

Сокеты не блокирующие
12 фев 19, 15:55    [21807580]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выбрать реализацию  [new]
Alexey Tomin
Member

Откуда: Самара
Сообщений: 1773
qi_ip
Какие еще есть оптимальные варианты доставки по времени.


Взять kafka и не изобретать очередной велосипед.
12 фев 19, 16:17    [21807601]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выбрать реализацию  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
qi_ip, а если человек пишет не другому а всем - у вас никак не реализовано что ли? А код броадкаст сообщения у вас что то типа такого:

for (Channel channel : channels) {
                channel.write("[" + incoming.remoteAddress() + "]" + s + "\n");
        }


? И это работает по 3-5 секунд на 1000 клиентов?
12 фев 19, 16:58    [21807653]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выбрать реализацию  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
Вообщем совет простой - сделайте свой чат сервер поверх нетти и не парьтесь.
Пример, тут - https://github.com/zhanggang807/Netty-Chat/tree/master/src/main/java/org/dean/example/nettychat
12 фев 19, 17:19    [21807677]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выбрать реализацию  [new]
Sergunka
Member

Откуда: Bay Area, CA
Сообщений: 1961
Alexey Tomin
qi_ip
Какие еще есть оптимальные варианты доставки по времени.


Взять kafka и не изобретать очередной велосипед.


Кафка громоздкое решение плюс долго с API разбираться. WebSocket server вполне так хорош для бродкаста на пару сотен юзеров если речь идет об отработки идеи и для собственной самооценки. В продакшин я бы всеж предпочел месседж брокер: kafka или rabbitmq.
12 фев 19, 23:56    [21807913]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выбрать реализацию  [new]
mayton
Member

Откуда: loopback
Сообщений: 42365
Давайте не будем "втаскивать" сюда Кафку. Это не простой фреймворк и нужно потратить
время на его освоение. А поскольку в топике автор говорит об очень базовых вещах (Threads, Sockets)
то можно предположить что у него задача либо должна демонстрировать работу сокетов и тредов
(что-то учебное) либо он (автор) сам учится и ему прост это любопытно.

Если это бизнес-задача то она формулируется совсем в других понятиях и в других терминах.
Например - в терминах предметной области. Клиент. Платеж. и т.п.
13 фев 19, 00:57    [21807927]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выбрать реализацию  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
qi_ip
Подскажите, как правильно продумать механизм доставки сообщений.
странный вопрос.
Любой hello world гугле.
автор
/*
Вы что-то хотели сказать? Введите это здесь:
Алло, сервер? Ты меня слышишь?
Привет, это Сервер! Подтверждаю, вы написали : Алло, сервер? Ты меня слышишь?
Клиент был закрыт...
*/

Ура! Мы научили сервер общаться с клиентом!

https://javarush.ru/groups/posts/654-klassih-socket-i-serversocket-ili-allo-server-tih-menja-slihshishjh
Ну и базу добавить для офф лайна.
13 фев 19, 07:32    [21807982]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить