मैं HTTP ट्रिगर के साथ Azure फ़ंक्शन का उपयोग करके Azure API प्रबंधन के माध्यम से ब्लॉब संग्रहण से बाइनरी फ़ाइल प्राप्त करने का प्रयास कर रहा हूं। सबसे छोटी संभव मेमोरी फ़ुटप्रिंट तक पहुँचने के लिए Azure फ़ंक्शन को कैसे लागू किया जाना चाहिए?

यह कार्यान्वयन काम करता है लेकिन ऐसा लगता है कि बहुत अधिक स्मृति की आवश्यकता होती है जो स्मृति अपवाद से बाहर हो जाती है जब बहुत से समवर्ती अनुरोध संसाधित होते हैं:

public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = "dbrevisions/{dbRevision}")] HttpRequestMessage request,
    [Blob("typedatadev/typedata_{dbRevision}.db", FileAccess.Read)] Stream blobStream,
    string dbRevision,
    ILogger log)
{
    var memoryBlobStream = new MemoryStream();
    blobStream.CopyTo(memoryBlobStream);

    var result = new FileStreamResult(memoryBlobStream, "application/octet-stream");
    result.FileStream.Flush();
    result.FileStream.Seek(0, SeekOrigin.Begin);
    return result;
}

यह 502 की स्थिति तक समाप्त हो जाएगा ("फ्लश" कॉल के बिना भी):

public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = "dbrevisions/{dbRevision}")] HttpRequestMessage request,
    [Blob("typedatadev/typedata_{dbRevision}.db", FileAccess.Read)] Stream blobStream,
    string dbRevision, ILogger log)
{
    var result = new FileStreamResult(blobStream, "application/octet-stream");
    result.FileStream.Flush();
    result.FileStream.Seek(0, SeekOrigin.Begin);
    return result;
}

यह भी विफल रहता है:

var response = new HttpResponseMessage(HttpStatusCode.OK)
{
    Content = new StreamContent(blobStream)
};
response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream");
return response;
0
STM 16 अक्टूबर 2020, 14:18

1 उत्तर

सबसे बढ़िया उत्तर

मुझे न्यूनतम मेमोरी फ़ुटप्रिंट के लिए नीचे पसंद आया। ध्यान दें कि स्ट्रीम करने के लिए बाध्य करने के बजाय, मैं एक ICloudBlob उदाहरण के लिए बाध्य हूं (सौभाग्य से, C# फ़ंक्शन ब्लॉब इनपुट बाइंडिंग) और ओपन स्ट्रीम लौटा रहा है। मेमोरी प्रोफाइलर का उपयोग करके इसका परीक्षण किया और बड़े ब्लॉब्स के लिए भी मेमोरी लीक के साथ ठीक काम करता है।

नोट: आपको स्थिति 0 को स्ट्रीम करने या फ्लश करने या निपटाने की आवश्यकता नहीं है (निपटान स्वचालित रूप से प्रतिक्रिया के अंत में किया जाएगा);

using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Microsoft.Azure.Storage.Blob;

namespace TestFunction1
{
   public static class MyFunction
   {
        [FunctionName("MyFunction")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = "dbrevisions/{dbRevision}")] HttpRequest req,
            [Blob("typedatadev/typedata_{dbRevision}.db", FileAccess.Read, Connection = "BlobConnection")] ICloudBlob blob,
            string dbRevision,
            ILogger log)
        {
            var blobStream = await blob.OpenReadAsync().ConfigureAwait(false);
            return new FileStreamResult(blobStream, "application/octet-stream");
        }
   }
}
1
krishg 16 अक्टूबर 2020, 18:10