Bài viết này http://social.msdn.microsoft.com/Forums/en-US/windowsazuredata/thread/d84ba34b-b0e0-4961-a167-bbe7618beb83 bao gồm các vấn đề về hiệu suất với Azure.
Vai trò Azure theo mặc định chỉ chạy trong một chuỗi duy nhất, điều này rất không hiệu quả trên các máy chủ. Có một số mẫu thiết kế rất đẹp ra có cho bạn thấy làm thế nào để thực hiện các vai trò đa luồng Azure, cá nhân tôi theo dõi này http://www.31a2ba2a-b718-11dc-8314-0800200c9a66.com/2010/12/running-multiple-threads-on-windows.html. Với điều này vai trò của bạn có thể tuần tự hóa các đối tượng song song.
Tôi sử dụng JSON làm định dạng trao đổi thay vì XML, nó có kích thước nhỏ hơn nhiều và được hỗ trợ tốt với .NET 4. Tôi hiện đang sử dụng DataContractJsonSerializer
nhưng bạn cũng có thể xem JavaScriptSerializer
hoặc JSON.NET. hiệu suất của bạn sau khi tôi đề nghị bạn so sánh chúng.
Dịch vụ WCF được luồn đơn theo mặc định (nguồn: http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k(SYSTEM.SERVICEMODEL.SERVICEBEHAVIORATTRIBUTE.CONCURRENCYMODE);k(TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV4.0%22);k(DevLang-CSHARP)&rd=true). Đây là một mẫu mã mà sẽ làm cho API RESTfull bạn đa luồng:
ExampleService.svc.cs
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerCall,
IncludeExceptionDetailInFaults = false, MaxItemsInObjectGraph = Int32.MaxValue)]
public class ExampleService : IExample
web.config
<system.serviceModel>
<protocolMapping>
<add scheme="http" binding="webHttpBinding" bindingConfiguration="" />
</protocolMapping>
<behaviors>
<endpointBehaviors>
<behavior name="">
<webHttp defaultOutgoingResponseFormat="Json" />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
ExampleService.svc
<%@ ServiceHost Language="C#" Debug="true" Service="WebPages.Interfaces.ExampleService" CodeBehind="ExampleService.svc.cs" %>
Ngoài ra, ASP.NET theo mặc định chỉ cho phép hai kết nối HTTP đồng thời (nguồn Xem http://social.msdn.microsoft.com/Forums/en-US/windowsazuredata/thread/d84ba34b-b0e0-4961-a167-bbe7618beb83). Các thiết lập này sẽ cho phép lên đến 48 kết nối HTTP đồng thời:
web.config
<system.net>
<connectionManagement>
<!-- See http://social.msdn.microsoft.com/Forums/en-US/windowsazuredata/thread/d84ba34b-b0e0-4961-a167-bbe7618beb83 -->
<add address="*" maxconnection="48" />
</connectionManagement>
</system.net>
Nếu thông điệp cơ thể HTTP POST của bạn thường nhỏ hơn so với 1460 byte bạn nên bật của nagling để cải thiện hiệu suất (nguồn http://social.msdn.microsoft.com/Forums/en-US/windowsazuredata/thread/d84ba34b-b0e0-4961-a167-bbe7618beb83). Dưới đây là một số thiết lập mà thực hiện điều này:
web.config
<system.net>
<settings>
<!-- See http://social.msdn.microsoft.com/Forums/en-US/windowsazuredata/thread/d84ba34b-b0e0-4961-a167-bbe7618beb83 -->
<servicePointManager expect100Continue="false" />
</settings>
</system.net>
Xác định API JSON của bạn một cái gì đó như thế này:
using System.ServiceModel;
using System.ServiceModel.Web;
using Interchange;
namespace WebPages.Interfaces
{
[ServiceContract]
public interface IExample
{
[OperationContract]
[WebInvoke(Method = "POST",
BodyStyle = WebMessageBodyStyle.Bare,
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json)]
string GetUpdates(RequestUpdates name);
[OperationContract]
[WebInvoke(Method = "POST",
BodyStyle = WebMessageBodyStyle.Bare,
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json)]
string PostMessage(PostMessage message);
}
}
Bạn có thể serialize để JSON trong.NET 4 như thế này:
string SerializeData(object data)
{
var serializer = new DataContractJsonSerializer(data.GetType());
var memoryStream = new MemoryStream();
serializer.WriteObject(memoryStream, data);
return Encoding.Default.GetString(memoryStream.ToArray());
}
Một thực thể trao đổi thông thường bạn có thể định nghĩa như bình thường:
using System.Collections.Generic;
using System.Runtime.Serialization;
namespace Interchange
{
[DataContract]
public class PostMessage
{
[DataMember]
public string Text { get; set; }
[DataMember]
public List<string> Tags { get; set; }
[DataMember]
public string AspNetSessionId { get; set; }
}
}
Bạn có thể viết HTTPModule của riêng bạn cho nén Gzip thượng nguồn, nhưng tôi sẽ cố gắng những thứ ở trên đầu.
Cuối cùng, hãy đảm bảo rằng bộ nhớ bảng của bạn ở cùng một vị trí với các dịch vụ tiêu thụ chúng.
Bạn phát hiện ra vấn đề/giải pháp là gì? – Rory