Я пишу критически важный для производительности двунаправленный потоковый сервер с использованием boost.asio.
Сервер работает следующим образом:
- Поток A обрабатывает и помещает объекты для отправки в очередь OUTPUT.
- Поток B ожидает объектов в очереди INPUT, чтобы обработать их.
- Поток C — это поток-акцептор, который принимает входящие клиенты и создает класс CLIENT для каждого из них.
Несколько клиентов работают одновременно, каждый из них имеет свой собственный подключенный сокет, и каждый должен делать две вещи одновременно:
- подождите (переменная условия) хотя бы один объект в очереди OUTPUT (это может занять много времени) и отправьте его как можно быстрее
- получить любой входящий объект из сокета и поместить его в очередь INPUT
Кроме того, производительность и многоядерная масштабируемость имеют решающее значение в этом приложении.
Стандартный асинхронный подход здесь не работает (обратные вызовы отправки могут блокировать другие обратные вызовы в ожидании отправки нового объекта), а подход к блокировке (использование 1 потока для каждого направления) сложен, и я не могу понять, что делать в случае ошибка в одном из потоков.
Должен ли я использовать 2 сокета для каждого клиента (один для вывода и один для ввода)? Или, может быть, каким-то образом использовать два io_services на сокет в двух разных потоках для поддержки параллельного обратного вызова?
Пожалуйста, объясните мне, как бы вы поступили в такой ситуации. Спасибо.