2008-09-19 7 views
4

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

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

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

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

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

ответ

5

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

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

Смежные вопросы