В этой статье 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-множественные потоки -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). Вот пример кода, который сделает ваш RESTfull 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 обычно меньше 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>
Определите ваши API-интерфейсы JSON примерно так:
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; }
}
}
Вы могли бы написать свой собственный HTTPModule для сжатия GZip в восходящем направлении, но я бы сначала попробовал вышеописанное.
Наконец, убедитесь, что хранилище таблиц находится в том же месте, что и службы, которые их используют.