2

我正在构建一个需要调用大量外部 Web 服务的 Azure Web 角色。

我记得对于 ASP.Net 1.1,有一个默认的最大连接限制为 2,如果您的应用程序需要更多,您可以调整该限制(说实话,这是相当低的)。在 ASP.Net 2.0 上,我相信他们提出了这一点,并且建议是核心数的 12 倍。

Azure Web 角色的限制和调整方法是什么?我将同时处理数百或数千个并发出站请求。这是否意味着我需要更大的实例(更多核心),或者我可以通过使用更多“超小”实例并正确配置它们来做到这一点(即使这意味着每台服务器 12 个)?

谢谢你。

4

1 回答 1

2

您的实例的大小将仅决定为您的实例保留的带宽(XS 为 5 Mbps,更多信息请点击此处)。您需要做的只是将 DefaultConnectionLimit 更改为 2 以上:

  <system.net>
    <connectionManagement>
      <add address="*" maxconnection="12"/>
    </connectionManagement>
  </system.net>

如果您想在您的 Web 应用程序中允许这样做,请将其添加到您的 web.config 中。例如,如果您想在启动实例之前调用服务,请将以下内容添加到您的 WebRole.cs:

    public override bool OnStart()
    {
        ServicePointManager.DefaultConnectionLimit = 12;
        return base.OnStart();
    }

请记住,即使请求排队,如果您以异步方式调用 Web 服务,您将获得更好的整体性能。这是一个非常基本的示例(假设您调用一个简单的 REST 服务,WCF 客户端代理对异步请求有更好的支持):

<%@ Page Async="true" ... %>

public partial class AsyncPage : System.Web.UI.Page
{
    private WebRequest req;

    void Page_Load (object sender, EventArgs e)
    {
        AddOnPreRenderCompleteAsync (
            new BeginEventHandler(BeginWebServiceCall),
            new EndEventHandler (EndWebServiceCall)
        );
    }

    IAsyncResult BeginWebServiceCall (object sender, EventArgs e, 
        AsyncCallback cb, object state)
    {
        req = WebRequest.Create("http://some.webs.service/rest/api");
        return req.BeginGetResponse (cb, state);
    }
    void EndWebServiceCall (IAsyncResult ar)
    {
        using (var response = req.EndGetResponse(ar))
        {
            using var reader = 
                new StreamReader(response.GetResponseStream()))
            {
                var text = reader.ReadToEnd();
        ...
            }
        }
    }
}
于 2012-09-14T13:57:38.490 回答