Serverless mit C# und fn project

Serverless ist gerade ein großes Hype-Thema, und auch das Java-Magazin hat in der aktuellen Ausgabe ein paar Artikel zu dem Thema. In einem der Artikel hat der Autor das fn project vorgestellt. fn project beschreibt sich selbst als open-source container-native serverless platform that you can run anywhere. Praktisch bietet fn

Die einzelnen Funktionen, die man mit fn baut, werden in Docker Container gepackt und in einer Docker Registry abgelegt. Der fn Server verknüpft HTTP Endpunkte mit diesen Containern. Wenn ich also einen Endpunkt /hello aufrufe, sorgt fn dafür, den entsprechenden Container zu starten, den Payload zu übergeben und hinterher den Container wieder zu beenden. Da alles an Funktion in einem Container steckt, kann man jede Programmiersprache zum Einsatz bringen.

Als Code sieht das so aus, ich passe die Funktion InvokeAsync so an, wie ich lustig bin. Den ganzen Rest macht fn.

using System.Threading;
using System.Threading.Tasks;
using System.Security.Cryptography;
using System.Text;

using FnProject.Fdk;

namespace md5sumfn
{
    public class Function
    {
        public Task<string> InvokeAsync(string input, CancellationToken timedOut)
        {
            using (MD5 md5 = MD5.Create())
            {
                Encoding utf8 = Encoding.UTF8;
                byte[] md5Sum = md5.ComputeHash(utf8.GetBytes(input ?? string.Empty));

                return Task.FromResult(BuildFrom(md5Sum));
            }
        }

        // reference - https://devblogs.microsoft.com/csharpfaq/how-do-i-calculate-a-md5-hash-from-a-string/
        private string BuildFrom(byte[] hash)
        {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < hash.Length; i++)
            {
                sb.Append(hash[i].ToString("X2"));
            }
            
            return sb.ToString();
        }

        public static void Main()
        {
            FdkHandler.Handle<Function>();
        }
    }
}

Aufrufen kann ich den Spaß in meinem Fall dann mit curl http://localhost:8080/t/md5sumapp/md5sumfn.

Fazit: Wenn ich wirklich mal den Fall habe, dass ich eine einzelne zustandslose Funktion deployen muss, dann ist fn sicher eine Option. Die größte Herausforderung bei Serverless dürfte sein, den Überblick über x Funktionen zu behalten.