2011-01-15 31 views
5

Xin chào, tôi đang trong quá trình tạo dịch vụ an toàn với WCF, dịch vụ có thể được tiêu thụ bởi ít nhất 500 người tại bất kỳ thời điểm nào. Tôi cần thiết lập những cài đặt nào để giải quyết vấn đề này. Xin vui lòng cho tôi bất kỳ điểm và lời khuyên, cảm ơn.Tạo WCF Dịch vụ an toàn, các vấn đề tương tranh

Đây là mẫu của những gì tôi có cho đến nay;

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

Và đây là ví dụ về phương thức được gọi;

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); 

Trả lời

7

Cách tiếp cận tốt nhất là nên sử dụng:

  • InstanceContextMode.PerCall
  • ConcurrencyMode.Single

này sẽ tạo ra một thể hiện mới của lớp dịch vụ cho mỗi người gọi và giúp bạn khỏi phải phải lo lắng về việc truy cập nhiều luồng, đồng thời với mã của bạn, vì mỗi yêu cầu nhận được cá thể lớp dịch vụ riêng của nó (mà trong chính nó là một luồng đơn - nó chỉ phục vụ một người gọi duy nhất tại một thời điểm).

Ngoài ra, với phương pháp này, bạn có thể dễ dàng "mở rộng", ví dụ: chỉ cần thêm nhiều máy chủ hơn để xử lý tải cao hơn (máy chủ tại vị trí của bạn hoặc "trong đám mây", ví dụ: nhân viên Windows Azure).

Sử dụng hành vi dịch vụ ServiceThrottling, bạn có thể kiểm soát rất dễ dàng bao nhiêu người gọi đồng thời được phép - điều này phụ thuộc vào loại và kích thước của máy của bạn.

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

Đây là các giá trị mặc định cho WCF 3.5 - cài đặt maxConcurrentCalls xác định số lượng người gọi có thể được xử lý đồng thời.

Khám phá MSDN docs on Service throttling để biết thêm chi tiết.

+0

Xin cảm ơn vì đã trả lời, các cài đặt tương tự vẫn áp dụng nếu chúng tôi phát triển lớn và có khoảng 30000 người dùng? – pmillio

+0

+1, câu trả lời hay. Với các cài đặt trên bạn vẫn phải lo lắng về an toàn luồng nếu bạn truy cập trạng thái chia sẻ bên ngoài cá thể dịch vụ. Ngoài ra, nếu bạn không lưu trữ trạng thái có thể thay đổi trong trường hợp dịch vụ của mình, bạn có thể sử dụng 'InstanceContextMode.Single' và' ConcurrencyMode.Multiple' để có hiệu suất tốt nhất. –

+1

@pmillio: bạn có thể cần tăng số lượng maxConcurrentCalls (đó chỉ là mặc định), hoặc bạn có thể cần phải mua thêm máy chủ - nhưng kiến ​​trúc quy mô rất tốt –

Các vấn đề liên quan