Служба маршрутизации WCF, узкое место? - PullRequest
3 голосов
/ 04 января 2012

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

У нас возникают проблемы с производительностью при использовании этого сервисного маршрутизатора WCF (тайм-ауты при нагрузочном тестировании с одновременными пользователями).Мы задаемся вопросом, происходит ли это из-за ошибки в маршрутизаторе, что мы неправильно настроили службы / IIS или ожидаемо - каждый вызов, проходящий через одну службу, звучит как потенциальная проблема.

Без маршрутизации мы можем обработать около 120 одновременных пользователей, прежде чем получим ошибки тайм-аута, и, хотя мы получаем тайм-ауты, IIS продолжает обрабатывать запросы.При использовании маршрутизатора IIS прекращает обработку запросов примерно с 20 одновременными пользователями и никогда не возобновляет обработку каких-либо запросов в течение всего остального нагрузочного тестирования.

Наш главный вопрос заключается в том, следует ли ожидать этого при использовании служебного маршрутизатора илидолжен ли IIS обрабатывать эту нагрузку так, как мы ее настроили?


Служба маршрутизации выглядит следующим образом:

/// <summary>
/// Generic service contract which can accept any WCF message.
/// </summary>
[ServiceContract]
public interface IServiceRouter
{
    [OperationContract(Action = "*", ReplyAction = "*", AsyncPattern=false)]
    Message ProcessMessage(Message requestMessage);
}

Реализация:

[ServiceBehavior( 
    InstanceContextMode = InstanceContextMode.PerCall,
    ConcurrencyMode = ConcurrencyMode.Multiple,
    AddressFilterMode = AddressFilterMode.Any, 
    ValidateMustUnderstand = false)]
public sealed class ServiceRouter : IServiceRouter

Операция ProcessMessage:

    public Message ProcessMessage(Message requestMessage)
    {            
        //Figure out the url of the downstream service             
        string serviceName = requestMessage.Headers.GetHeader<String>(ServiceNameMessageHeader, String.Empty);
        string url = String.Format(_destinationUrlFormat, _destinationAppName, _destinationAppVersion, serviceName);
        EndpointAddress endpointAddress = new EndpointAddress(url);

        using (ChannelFactory<IServiceRouter> factory = new ChannelFactory<IServiceRouter>(_binding, endpointAddress))
        {
            factory.Endpoint.Behaviors.Add(new MustUnderstandBehavior(false));
            IServiceRouter proxy = factory.CreateChannel();

            using (proxy as IDisposable)
            {
                try
                {
                    IClientChannel clientChannel = proxy as IClientChannel;

                    // invoke service
                    Message responseMessage = proxy.ProcessMessage(requestMessage);

                    return responseMessage;
                }
                catch (Exception ex)
                {
                    // ...
                }
            }
        }
    }

Ответы [ 2 ]

2 голосов
/ 04 января 2012

Не следует ожидать, что служба WCF вызовет у вас такую ​​серьезную проблему, но трудно дать точный ответ, когда мы не знаем точно, что делает ваша служба WCF, как она настроена, но как Вы сказали:

Без маршрутизации мы можем обрабатывать около 120 одновременных пользователей, прежде чем получать ошибки тайм-аута, и хотя мы получаем тайм-ауты, IIS сохраняет обработка запросов. С маршрутизатором IIS прекращает обработку запросов с около 20 одновременных пользователей и никогда не возобновляет обработку любых запросов на протяжении всего остального нагрузочного тестирования.

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

1010 * редактировать *

Посмотрите здесь на некоторые проблемы, которые могут повлиять на производительность WCF.

0 голосов
/ 09 февраля 2012

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

...