Обработка потокового сервера - PullRequest
0 голосов
/ 27 марта 2012

У меня есть сервер, который отправляет данные так быстро, как может, и отправляет данные через сокет.Сервер использует очередь и имеет поток производителя и поток потребителя, который отправляет полученные данные в сокет клиенту.

Проблема заключается в чтении данных на стороне клиента.Как мне спроектировать клиент для обработки данных без синхронизации?Если я посылаю подтверждение от клиента на сервер, я теряю скорость параллелизма на стороне сервера.Как я могу написать / спроектировать клиента для достаточно быстрой обработки входящих данных?Нужно ли реализовывать очередь на стороне клиента?

1 Ответ

1 голос
/ 27 марта 2012

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

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

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

Если вы не хотите эту цену RTTвы неизбежно должны будете разрешить:

  • для клиента запрашивать более одной партии за раз.Для этого вы можете использовать помеченный протокол, такой как IMAP: клиент отправляет несколько заданий одновременно на один сокет, каждое со своим собственным тегом.Сервер отвечает на каждый запрос, с тегами в заголовке каждого ответа, чтобы клиент знал, какой ответ идет с каким запросом.Когда клиент видел «достаточно» ответов, он отправляет больше запросов.Клиент получает возможность контролировать, сколько запросов может выполняться одновременно.Если клиент допускает только один за раз, это вырождается в простой случай ACK со стоимостью RTT.
  • для сервера, чтобы работать немного впереди клиента, посылая несколько ответов клиенту, прежде чем клиент получитпризнал первый.После заполнения канала до максимального количества неподтвержденных заданий, которые сервер готов разрешить, он ожидает подтверждения и отправляет один дополнительный ответ задания для каждого подтверждения, полученного от клиента.Если сервер допускает только одну невыполненную работу, это вырождается в простой случай ACK, как указано выше.Если сервер допускает слишком много неподтвержденных заданий одновременно, это вырождается в простое заполнение буферов TCP и подсчет управления потоком TCP для блокировки сервера до тех пор, пока клиент не будет готов принять больше данных.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...