我的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();
}