@coelho

Обработка потоков на сервере мессенджера?

Для студенческого проекта разрабатываю некое подобие мессенджера, соединение - через сокеты. Каким лучше способом обрабатывать потоки на сервере? Пока что есть два варианта:

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

2) Создаём тредпул на ограниченное количество потоков, и обрабатываем там приходящие сообщения. Но как в данном случае отправить сообщение получателю, ведь у нас нет открытого сокета с ним? Можно хранить в базе ip последнего подключения в базе, но это не решит проблему с отсутствием открытого сокета.

Каким образом всё-таки будет лучше всё это организовать?
  • Вопрос задан
  • 376 просмотров
Решения вопроса 1
@nirvimel
Количество потоков не равно количеству открытых сокетов. Расходовать на каждое подключение отдельный поток ни в коем случае нельзя. Но синхронно закрывать сокет после обработки подключения совсем не обязательно. Сокет - просто значение ячейки массива (или карты) будет взято и использовано когда понадобится в любом потоке (работа с конкретным сокетом, конечно, должна быть обернута в соответствующий синхроблок). Единственно, о чем не следует забывать это - KeepAlive пинги (отдельный пул потоков и таймера под них, например), которые обеспечивают сразу две задачи: 1) помогают удержать неактивное соединение (умные роутеры любят закрывать "мертвые" соединения, и клиент, в зависимости от реализации, может делать то же). 2) очищают список сокетов от реально мертвых.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@res2001
Developer, ex-admin
Можно и без потоков реализовать, рассмотрите асинхронный подход к обработке соединений. Как в nginx.
Будет интересно!
Ответ написан
Konstantin18ko
@Konstantin18ko
Стоматолог
Если для студенческой работы нет условий, то берём технологию JMS, и не изобретаем велосипед.
В ином случае, ваша работа будет не совершенна.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы