Azure Functions http触发所有流量路由到一个实例

时间:2017-07-10 16:10:39

标签: azure azure-functions

我的Function只有一个实例处理所有请求。

我有一个Azure功能(消费计划),可以通过HTTP触发器将水印应用于PDF。 PDF通过函数中的HTTP调用检索,加水印,然后在响应中返回。

Application Insights可以监控性能并进行一些负载测试。在门户网站中,我使用静态URL(超过5分钟的100个用户)配置基本负载测试,并针对我的功能运行它。当我检查实时指标时,我看到一个实例正在处理一些请求,而每个其他实例处于0个请求/秒并且提交的内存不会改变。如果我在负载测试中增加用户数,它最终会开始超时处理请求,而不是将它们路由到其他实例。

为什么只有一个实例处理所有请求?

简化示例代码。

#r "D:\home\site\wwwroot\watermark\bin\itextsharp.dll"

using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using iTextSharp.text;
using iTextSharp.text.pdf;

static HttpClient client = new HttpClient();
static BaseFont font = BaseFont.CreateFont(BaseFont.TIMES_ROMAN,     BaseFont.WINANSI, BaseFont.EMBEDDED);

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    var fetch = "http://url.to.pdf";
    log.Info(fetch);
    log.Info("C# HTTP trigger function processed a request.");
    var pdf = await client.GetAsync(fetch);
    var stream = await pdf.Content.ReadAsStreamAsync();
    var resp = req.CreateResponse();

    var ms = new MemoryStream();
    var reader = new PdfReader(stream);
    var stamper = new PdfStamper(reader, ms);
    stamper.Writer.CloseStream = false;

    var pages = reader.NumberOfPages;

    for (int i = 1; i <= pages; i++)
    {
        var content = stamper.GetOverContent(i);
        AddWatermark(content, "Here is some watermark text.", font, 10, Color.BLACK, reader.GetPageSize(i));
    }

    stamper.Close();

    ms.Seek(0, SeekOrigin.Begin);

    resp.Content = new StreamContent(ms);
    resp.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");  

    return resp;
}

private static void AddWatermark(PdfContentByte dc, string text, BaseFont font, float fontSize, Color color, Rectangle realPageSize, Rectangle rect = null)
{
    dc.SaveState();
    dc.SetColorFill(color);
    dc.BeginText();
    dc.SetFontAndSize(font, fontSize);
    var ps = rect ?? realPageSize; /*dc.PdfDocument.PageSize is not always correct*/
    var x = (ps.Right + ps.Left) / 2;
    var y = (ps.Bottom + ps.Top) * (1.0f / 100.0f);
    dc.ShowTextAligned(Element.ALIGN_LEFT, text, x, y, 0);
    dc.EndText();
    dc.RestoreState();
}

0 个答案:

没有答案