这篇文章http://social.msdn.microsoft.com/Forums/en-US/windowsazuredata/thread/d84ba34b-b0e0-4961-a167-bbe7618beb83涵盖了Azure的性能问题。
默认情况下,Azure角色只能在单个线程中运行,这在服务器上效率非常低。有一些非常好的设计模式,向您展示如何实现多线程Azure角色,我个人会遵循这一个http://www.31a2ba2a-b718-11dc-8314-0800200c9a66.com/2010/12/running-multiple-threads-on-windows.html。有了这个你的角色可以并行地串行化对象。
我使用JSON作为交换格式而不是XML,它具有小得多的字节大小,并且在.NET 4中得到很好的支持。我目前使用DataContractJsonSerializer
,但如果是串行化,您也可以查看JavaScriptSerializer
或JSON.NET我会建议你比较这些表现后你的表现。
WCF服务默认为单线程(来源: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)。下面是一个代码示例,这将使你的问题的REST API的多线程:
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" %>
另外,ASP.NET默认只允许两个并发的HTTP连接(源请参阅http://social.msdn.microsoft.com/Forums/en-US/windowsazuredata/thread/d84ba34b-b0e0-4961-a167-bbe7618beb83)。这些设置将允许多达48个并发的HTTP连接:
的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>
如果你的HTTP POST体消息通常是你应该把Nagling的提高性能的小于1460个字节(源http://social.msdn.microsoft.com/Forums/en-US/windowsazuredata/thread/d84ba34b-b0e0-4961-a167-bbe7618beb83)。下面是一些设置,这是否:
的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>
定义你的JSON API的是这样的:
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);
}
}
可序列化JSON英寸NET 4这样的:
string SerializeData(object data)
{
var serializer = new DataContractJsonSerializer(data.GetType());
var memoryStream = new MemoryStream();
serializer.WriteObject(memoryStream, data);
return Encoding.Default.GetString(memoryStream.ToArray());
}
一个典型的交换实体可以定义为正常:
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; }
}
}
你可以写你自己的上游gzip压缩的HttpModule,但我会尝试以上第一的东西。
最后,请确保您的表存储与使用它们的服务位于相同的位置。
你发现什么是问题/解决方案? – Rory