Масштабируемая обработка очереди событий сокетов

StackOverflow https://stackoverflow.com/questions/99651

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top