Вход через WCF без замедления - PullRequest
5 голосов
/ 10 мая 2011

У нас в приложении большой процесс, который запускается раз в месяц.Этот процесс обычно выполняется примерно за 30 минут и генерирует около 342000 событий журнала.Недавно мы обновили нашу регистрацию до централизованной модели с использованием WCF и теперь испытываем трудности с производительностью.Принимая во внимание, что предыдущее решение будет завершено примерно через 30 минут, с новым ведением журнала, теперь это занимает 3 или 4 часа.Кажется, проблема в том, что приложение фактически ожидает завершения запроса WCF, прежде чем выполнение продолжится.Метод WCF уже настроен как IsOneWay, и я обернул вызов на стороне клиента к этому методу WCF в другом потоке, чтобы попытаться предотвратить проблему такого типа, но, похоже, это не сработало.Я думал об использовании асинхронных вызовов WCF, но прежде чем пытаться что-то еще, я хотел бы спросить здесь, чтобы посмотреть, есть ли лучший способ справиться с этим.

Ответы [ 4 ]

4 голосов
/ 10 мая 2011

342000 событий журнала за 30 минут, если я правильно сделал математику, получается 190 событий журнала в секунду.Я думаю, что ваша проблема может быть связана с настройками регулирования по умолчанию в WCF.Даже если ваш метод настроен в одностороннем порядке, в зависимости от того, создаете ли вы новый прокси-сервер для каждого зарегистрированного события, вызов метода все равно будет блокироваться, пока создается прокси, канал открывается, и если вы используетеПривязка на основе HTTP блокируется до тех пор, пока служба не получит сообщение (привязка на основе HTTP отправляет ответ null для одностороннего вызова метода при получении сообщения).Дросселирование WCF по умолчанию ограничивает число одновременных экземпляров до 10 на стороне службы, что означает, что за один раз будут обрабатываться только 10 запросов, и любые дальнейшие запросы будут поставлены в очередь, так что соедините это с привязкой HTTP, и все, что после первых 10 запросовбудет блокировать клиент, пока не будет обработан один из 10 запросов.Не зная, как настроены ваши сервисы (режим экземпляра и т. Д.), Сложно сказать больше, но если вы используете инстансинг для каждого вызова, я бы рекомендовал установить MaxConcurrentCalls и MaxConcurrentInstances на вашем ServiceBehavior.к чему-то гораздо более высокому (значения по умолчанию равны 16 и 10 соответственно).

Кроме того, чтобы опираться на то, что другие упоминали об объединении нескольких событий и их одновременной отправке, я нашел полезным настроитьстатический Logger.LogEvent(eventData) метод.Таким образом, его легко использовать во всем коде, и вы можете в своем методе LogEvent контролировать, как ведется ведение журналов во всем приложении, например настраивать, сколько событий следует отправлять за раз.

3 голосов
/ 10 мая 2011

Выполнение вызова другому процессу или удаленной службе (то есть вызов службы WCF) - это самая дорогая вещь, которую вы можете сделать в приложении.Делать это 342 000 раз - это просто сумасшествие!

Если вам необходимо войти в централизованную службу, вам нужно накапливать партии записей журнала, а затем, только когда вы скажете 1000 или около того в памяти, отправить их все вСервис в один клик.Это даст вам разумное улучшение производительности.

1 голос
/ 10 мая 2011

log4net имеет систему буферизации, которая существует вне контекста вызывающего потока, поэтому она не будет удерживать ваш вызов во время регистрации.Его использование должно быть понятно из множества примеров конфигурации appender - поиск по термину bufferSize.Он используется во многих медленных приложениях (например, удаленном взаимодействии, электронной почте), чтобы поддерживать поток источника, не дожидаясь более медленной среды журналирования, и есть также общий мета-приложение для буферизации, которое можно использовать "перед" любым другимappender.

Мы используем его с AdoNetAppender в системе аналогичного объема, и она прекрасно работает.

0 голосов
/ 10 мая 2011

Всегда существует традиционный syslog , в Windows работает множество демонов syslog.Он разработан как более эффективный способ централизованного ведения журнала, чем WCF, который предназначен для менее интенсивных операций, особенно если вы не используете конфигурацию tcpip WCF.

Другими словами, попробуйте это -правильный инструмент для работы.

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