webentwicklung-frage-antwort-db.com.de

Azure-Funktionen und Caching

Wir planen die Entwicklung einer Azure-Funktion, für die der Eingangstrigger eine Servicebusnachricht ist und die Ausgabe Blob-Speicher ist. Die Servicebusnachricht enthält eine Bild-URL, und die Funktion ändert das Bild auf eine vordefinierte Auflösung und lädt es in den Azure-Blob-Speicher hoch.

Die Auflösung, auf die das Bild angepasst werden soll, wird in der Datenbank gespeichert. Die Azure-Funktion muss eine Datenbank aufrufen, um die Auflösung zu erfahren, die für das Bild in der Eingabenachricht verwendet werden soll. Bei der Auflösung handelt es sich tatsächlich um Stammdaten, die basierend auf der Quelle der Eingangsnachricht konfiguriert werden.

Ein Aufruf der Datenbank wäre ein teurer Aufruf, da für jeden Aufruf die Datenbank aufgerufen werden müsste. Gibt es eine Möglichkeit, die Daten zwischenzuspeichern und zu verwenden, ohne die Datenbank aufzurufen. Wie im Memory-Caching?

9
Silly John

Sie können die üblichen Ansätze verwenden, die Sie in anderen .NET-Anwendungen verwenden würden:

  • Sie können es im Speicher zwischenspeichern. Am einfachsten ist es, ein statisches Wörterbuch zu deklarieren und Datenbankwerte einzugeben (verwenden Sie bei Bedarf gleichzeitiges Wörterbuch). Die zwischengespeicherten Werte werden für alle nachfolgenden Funktionsausführungen verwendet, die in derselben Instanz ausgeführt werden. Wenn eine Instanz für 5 Minuten inaktiv ist oder App auf eine zusätzliche Instanz skaliert, müssen Sie die Datenbank erneut lesen.

  • Sie können einen verteilten Cache verwenden, z. Redis, indem Sie das SDK des Funktionscodes verwenden. Könnte ein bisschen schöner sein, da Sie die Stateless-Natur der Funktionen beibehalten, aber etwas mehr kosten können. Table Storage ist eine praktikable Alternative zu Redis, jedoch mit einer eingeschränkteren API.

Es gibt keine "Zwischenspeicherung" von Azure Functions selbst, die ohne zusätzlichen Code einsatzbereit wäre.

12
Mikhail Shilkov

Sie können dauerhafte Funktionen verwenden und die Datenbank über eine Aktivität oder eine Sub-Orchestration aufrufen. Der Rückgabewert wird dann im Wesentlichen zwischengespeichert und zurückgegeben, ohne dass der zugrunde liegende Aufruf bei jeder Wiederholung der Funktion erneut ausgeführt wird. 

4
Dennis

Sie können den Azure Cache-Dienst ( https://Azure.Microsoft.com/en-us/services/cache/ ) zum Zwischenspeichern Ihrer Daten verwenden. Grundsätzlich rufen Sie in Ihrer Azure-Funktion, anstatt ständig die Datenbank aufzurufen, den Azure-Cache auf und verwenden Sie ihn, wenn er nicht abgelaufen ist feste Zeit oder eine andere benutzerdefinierte Logik).

2
user862268

Redis ist ein In-Memory-Cache und es gibt eine benutzerdefinierte Ausgabe-Bindung, die Sie verwenden können, um Ihre Funktion sauber zu halten:

[FunctionName("SetPoco")]
public static async Task<IActionResult> SetPoco(
    [HttpTrigger("POST", Route = "poco/{key}")] HttpRequest request,
    [Redis(Key = "{key}")] IAsyncCollector<CustomObject> collector)
{
    string requestBody;
    using (var reader = new StreamReader(request.Body))
    {
        requestBody = reader.ReadToEnd();
        var value = JsonConvert.DeserializeObject<CustomObject>(requestBody);
        await collector.AddAsync(value);
    }
    return new OkObjectResult(requestBody);
}

Link zum Projekt: https://github.com/daulet/Indigo.Functions#redis

Wenn Sie jedoch im Cache-Speicher im Speicher der Funktion arbeiten, würde ich Ihnen dringend empfehlen, da die Funktion zustandslos sein soll und Sie diesen Speicher nicht für mehrere Hosts freigeben können, die Ihre Funktion ausführen. Dies wird auch nicht empfohlen in bewährte Methoden von Azure Functions

0

Betrachten Sie so etwas wie Cloudfront oder Cloudflare. Ich weiß nicht genau, was Microsofts anbietet.

Dies wird sich auf Ihre API- und Cache-Anforderungen stützen und diese für Sie auf der ganzen Welt verteilen.

Dies kann zusätzlich zu den anderen Lösungen verwendet werden, die hier vorgestellt werden, es muss jedoch eine der einfachsten Möglichkeiten sein, sich mit dem Essen zu beschäftigen 

0
Simon_Weaver