Масштабируемая обработка очереди событий сокета - PullRequest
4 голосов
/ 19 сентября 2008

Мой класс C # должен быть в состоянии обрабатывать большой объем событий, полученных через сокетное соединение в стиле потока tcp. Объем сообщений о событиях, полученных от tcp-сервера сокетом класса, является полностью переменным. Например, иногда он получает только одно сообщение о событии в течение десяти секунд, а в другое время он получает шестьдесят сообщений о событиях в течение секунды.

Я использую Socket.ReceiveAsync для получения сообщений. ReceiveAsync возвращает истину, если операция приема находится в состоянии ожидания, или ложь, если в проводе уже есть данные и операция приема завершена синхронно Если операция находится в состоянии ожидания, Socket вызовет мой обратный вызов в потоке завершения ввода-вывода, в противном случае я вызову свой собственный обратный вызов в текущем (IOC) потоке. Кроме того, в сочетании с сообщениями о событиях я также получаю ответы на команды, отправленные на этот tcp-сервер. Ответные сообщения обрабатываются сразу же; индивидуально, путем увольнения рабочего пула.

Однако я бы хотел поставить в очередь сообщения о событиях до тех пор, пока у меня не будет «достаточно» (N) из них ИЛИ до тех пор, пока в сети не останется больше ... и затем запустить работника пула потоков для обработки пакета сообщений о событиях. Кроме того, я хочу, чтобы все события обрабатывались последовательно, поэтому я хочу, чтобы только один сотрудник пула потоков работал над этим одновременно.

Обработчик сообщений о событиях должен только скопировать буфер сообщений в объект, вызвать событие и затем освободить буфер сообщений обратно в пул кольцевых буферов. Итак, мой вопрос ... как вы думаете, какая стратегия лучше для этого?

Вам нужна дополнительная информация? Дай мне знать. Спасибо !!

1 Ответ

5 голосов
/ 19 сентября 2008

Я бы не назвал 60 событий в секунду большой громкостью. При таком низком уровне активности любой метод обработки сокетов вообще может быть в порядке. Я обработал 5000 событий в секунду в одном потоке, используя аппаратное обеспечение, которое намного менее способно, чем современные машины, просто используя select.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...