TNonblockingServer, TThreadedServer и TThreadPoolServer, который подходит для моего случая?

Наш аналитический сервер написан на С++. Он в основном запрашивает базовый механизм хранения и возвращает довольно большие структурированные данные через бережливость. Типичные запросы занимают от 0,05 до 0,6 секунды, чтобы завершить, зависит от размера запроса.

Я заметил, что есть несколько вариантов, с помощью которых сервер Thrift можно использовать в коде С++, в частности, TNonblockingServer, TThreadedServer и TThreadPoolServer. Похоже, что TNonblockingServer - это путь, так как он может поддерживать гораздо больше параллельных запросов и по-прежнему использовать пул потоков за сценой, чтобы справиться с задачами. Это также позволяет избежать затрат на создание/разрушение потоков.

Обновление Facebook по экономии: http://www.facebook.com/note.php?note_id=16787213919

Здесь, в Facebook, мы работаем над полностью асинхронным клиентом и сервером для С++. Эта сервер использует управляемый событиями ввод-вывод, как текущий TNonblockingServer, но его интерфейс к код приложения основан на асинхронных обратных вызовах. Это позволит нам написать серверы, которые могут обслуживать тысячи одновременных запросов (каждый из которых требует выполнение вызовов на другие серверы Thrift или Memcache) с несколькими потоками.

Связанные записи в stackover: Большое количество одновременных подключений в экономии

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

Просто интересно, есть ли какие-то другие факторы, которые мне здесь не хватает? Как я могу решить, какой из них лучше всего подходит мне?

Ответ 1

Запросы, которые занимают 50-600 миллисекунд, завершаются довольно долго. Время, затрачиваемое на создание или уничтожение потока, намного меньше, поэтому не допускайте этого фактора в ваше решение в это время. Я бы выбрал тот, который легче всего поддерживать, и это наименее подверженный ошибкам. Вы хотите свести к минимуму вероятность появления тонких ошибок concurrency.

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

Если ваша транзакционная загрузка увеличивается (т.е. больше транзакций с клиентами) или запросы становятся быстрее обрабатываться (приближается к 1 миллисекунде за транзакцию), тогда накладные расходы транзакций становятся скорее фактором. Метрика, на которую нужно обратить внимание, это пропускная способность: сколько транзакций завершено за единицу времени. Абсолютная длительность одной транзакции менее важна, чем скорость, с которой они выполняются, по крайней мере, если она остается ниже одной секунды.

Ответ 2

Один парень на Github сделал хорошее сравнение

TThreadedServer

TThreadedServer генерирует новый поток для каждого клиентского соединения, и каждый поток остается в живых до закрытия клиентского соединения. Это означает, что если существует 1000 одновременных клиентских подключений, TThreadedServer должен одновременно запускать 1000 потоков.

TNonblockingServer

В TNonblockingServer имеется один поток, выделенный для сетевого ввода-вывода. Тот же поток также может обрабатывать запросы, или вы можете создать отдельный пул рабочих потоков для обработки запроса. Сервер может обрабатывать множество параллельных подключений с небольшим количеством потоков, поскольку для каждого подключения не требуется создавать новый поток.

TThreadPoolServer (не указано здесь)

TThreadPoolServer похож на TThreadedServer; каждое клиентское соединение получает собственный выделенный поток сервера. Он отличается от TThreadedServer двумя способами:

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