2011-01-15 2 views
5

Привет, я сейчас создаю спокойную службу с WCF, эта услуга, вероятно, будет потребляться не менее 500 человек в любой момент времени. Какие настройки мне нужно установить, чтобы справиться с этим. Пожалуйста, дайте мне какие-то вопросы и подсказки, спасибо.Создание службы WCF Restful, проблемы с параллелизмом

Вот пример того, что у меня до сих пор;

[ServiceBehavior(IncludeExceptionDetailInFaults = true, InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)] 

И это пример метода, который называется;

public UsersAPI getUserInfo(string UserID) 
    { 
     UsersAPI users = new UsersAPI(int.Parse(UserID)); 

     return users; 
    } 



    [OperationContract] 
    [WebGet(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, UriTemplate = "User/{UserID}")] 
    [WebHelp(Comment = "This returns a users info.")] 
    UsersAPI getUserInfo(string UserID); 

ответ

7

Наилучшим подходом было бы использовать:

  • InstanceContextMode.PerCall
  • ConcurrencyMode.Single

Это создаст новый экземпляр класса обслуживания для каждого абонента и избавляет вас от необходимости беспокоиться о многопоточном одновременном доступе к вашему коду, поскольку каждый запрос получает свой собственный экземпляр класса обслуживания (который сам по себе является однопоточным - он одновременно обслуживает только одного абонента).

Кроме того, при таком подходе вы можете легко «масштабировать», например. просто добавьте больше серверов для обработки более высокой нагрузки (серверы в ваших местах или «в облаке», например, работники Windows Azure).

Использование поведения службы ServiceThrottling позволяет легко контролировать, сколько одновременных абонентов разрешено - это зависит от типа и размера вашего устройства.

<serviceBehaviors> 
    <behavior name="Throttling"> 
    <serviceThrottling 
      maxConcurrentCalls="16" 
      maxConcurrentInstances="16" 
      maxConcurrentSessions="10" /> 
    </behavior> 
</serviceBehaviors> 

Это значение по умолчанию для WCF 3.5 - в maxConcurrentCalls настройке определяет, сколько абонентов могут быть обработаны одновременно.

За дополнительной информацией обращайтесь к MSDN docs on Service throttling.

+0

Привет, спасибо за ответы, будут ли сохраняться те же настройки, если бы мы выросли, и что-то вроде 30000 пользователей? – pmillio

+0

+1, хороший ответ. С приведенными выше настройками вам все равно придется беспокоиться о безопасности потоков, если вы обращаетесь к общему состоянию вне экземпляра службы. Кроме того, если вы не сохраняете изменяемое состояние в своем экземпляре службы, вы можете использовать 'InstanceContextMode.Single' и' ConcurrencyMode.Multiple' для лучшей производительности. –

+1

@pmillio: вам может потребоваться увеличить количество maxConcurrentCalls (это просто значение по умолчанию), или вам может потребоваться купить дополнительные серверы, но архитектура очень хорошо масштабируется –

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