Большое количество одновременных соединений в хозяйстве - PullRequest
5 голосов
/ 05 июня 2009

Я пытаюсь написать простой сервер с Thrift. Сначала это выглядело многообещающе, но я столкнулся с проблемой с несколькими клиентами, подключенными одновременно. Я использую TThreadPoolServer, который позволяет 4 клиентам подключаться, а затем блокирует других клиентов, пока я не убью одного из подключенных. Что я могу сделать для одновременного подключения большего количества (возможно, нескольких сотен) клиентов без увеличения количества потоков. Я предположил, что рабочие потоки позволяют выполнять один клиентский запрос за раз, но похоже, что один поток обрабатывает одно соединение, пока не будет закрыто. Я бы хотел избежать ситуации, когда мои клиенты должны снова открыть сокет для выполнения действия.

Ответы [ 2 ]

3 голосов
/ 18 июня 2010

Используя другой подход, если вы используете C ++ для создания своего сервера, вы можете использовать TNonblockingServer вместо TThreadPoolServer, что позволит вам принимать сразу несколько соединений независимо от количества активных потоков и т. Д.

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

Вот как выглядит код для NB-сервера:

shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());
shared_ptr<MyHandler> handler(new MyHandler());
shared_ptr<TProcessor> processor(new MyProcessor(handler));
TNonblockingServer server(processor, protocolFactory, port);
2 голосов
/ 25 июня 2009

Ваше ограничение четырех потоков в пуле встроено в конструктор по умолчанию SimpleThreadManager:

class SimpleThreadManager : public ThreadManager::Impl {

 public:
  SimpleThreadManager(size_t workerCount=4, size_t pendingTaskCountMax=0) :
    workerCount_(workerCount),
    pendingTaskCountMax_(pendingTaskCountMax),
    firstTime_(true) {
  }
...
};

Этот объект ThreadManager передается в конструктор ThreadPoolServer, поэтому передайте большее число конструктору этого объекта, чтобы увеличить размер пула потоков.

...