Я пытаюсь реализовать TCP-сервер, который является частью более крупного проекта. По сути, сервер должен поддерживать TCP-соединение с любым количеством клиентов (минимум 32) и обслуживать любого клиента, который запрашивает обслуживание. В нашем сценарии дело в том, что предполагается, что, как только клиент подключится к серверу, он никогда не закроет соединение, пока не произойдет какой-либо сбой (например, компьютер, на котором работает клиент, выйдет из строя), и он будет повторно запрашивать обслуживание у сервер. То же самое относится и ко всем остальным клиентам, каждый из которых будет поддерживать соединение с сервером и выполнять транзакции. Таким образом, для суммирования сервер будет одновременно поддерживать соединение с клиентами, одновременно обслуживая каждого клиента по мере необходимости, а также должен иметь возможность принимать любые другие клиентские соединения, которые хотят подключиться к серверу.
Теперь я реализовал вышеуказанную функциональность, используя системный вызов API сокета berkely select()
, и он отлично работает, когда у нас небольшое количество клиентов (скажем, 10). Но сервер необходимо масштабировать до максимально возможного уровня, поскольку мы внедряем его на 16-ядерном компьютере. Для этого я просмотрел различные методы проектирования многопоточности, например, по одному потоку на клиента и т. Д., И, на мой взгляд, лучшим из них был бы дизайн пула потоков. Теперь, когда я собирался реализовать это, я столкнулся с некоторыми проблемами:
Если я назначу основной поток для приема любого количества входящих соединений и сохраню каждое файловое дескриптор соединений в структуре данных, и у меня будет пул потоков, как я получу потоки для опроса того, запрашивает ли конкретный клиент сервис или не. Конструкция достаточно проста для сценариев, в которых клиент связывается с сервером, и после получения службы он закрывает соединение, чтобы мы могли выбрать поток из пула, обслуживать клиента и затем отправить его обратно в пул для дальнейшей обработки соединения. Но когда нам нужно обслуживать набор клиентов, которые поддерживают соединение и периодически запрашивают услуги, то какой подход будет лучшим для этого. Вся помощь будет высоко ценится, так как я действительно застрял в этом.
Спасибо.