Serverless-Funktionen
Führe einen HTTP-Service nur aus, solange Anfragen eintreffen. Er schläft im Leerlauf, wacht bei der nächsten Anfrage auf und skaliert unter Last – eingerichtet in deiner Compose-Datei.
Eine Funktion ist ein HTTP-Service, der nur läuft, solange Anfragen eintreffen. Fünf Minuten nach seiner letzten Anfrage stoppt Cloady seinen Container, und die nächste Anfrage startet ihn wieder. Unter Last skaliert er auf bis zu fünf Kopien. Eine einzige Compose-Einstellung macht aus einem Service eine Funktion: deploy.replicas: 0.
Den Service markieren
Gib dem Service, der unter der Adresse deiner App antwortet, unter deploy den Wert replicas: 0:
services:
api:
build: .
ports:
- "3000"
deploy:
replicas: 0Beides muss zutreffen:
deploy.replicasist0.- Der erste Eintrag unter
ports:ist ein HTTP-Port, etwa"3000"oder"8080:3000". Ein Port, der auf/tcpoder/udpendet, oder einer, den Cloady als Port einer Datenbank, eines Caches, einer Queue, eines Mailservers oder eines Gameservers behandelt (5432,6379,25, …), ist reines TCP, und reines TCP kann keinen Container aufwecken.
Mit build: . baut Cloady den Service aus deinem Code, mit Railpack oder mit deinem Dockerfile, falls es eines gibt, und setzt PORT auf den Container-Port. Eine App, die auf $PORT lauscht, braucht also keine Änderung. Ein Service, der ein image: ausführt, funktioniert genauso.
Die App deployen
Deploye sie wie jede andere Compose-App: Füge das Repository in das Deploy-Feld ein, zieh den Ordner darauf oder nutze die CLI:
cloady deploy github.com/acme/api --type gitDie Funktion startet schlafend.
Die Funktion aufrufen
Öffne die Adresse der App. Die erste Anfrage nach einer Schlafphase wartet, während eine Kopie startet, und wird beantwortet, sobald der Container Verbindungen auf seinem Port annimmt. Solange die Funktion wach ist, gehen Anfragen direkt durch. Auch die eigenen Domains der App wecken sie auf.
Den größten Teil dieser ersten Wartezeit braucht dein Container selbst zum Starten. Ein kleines Image und ein schneller Start halten sie also kurz.
Wie sie skaliert
Diese Grenzen gelten für jede Funktion gleich, und die Compose-Datei ändert sie nicht. Eine Funktion
- wacht auf bei einer Anfrage an die Adresse der App oder an eine ihrer eigenen Domains,
- schläft ein fünf Minuten nach ihrer letzten Anfrage,
- skaliert hoch um eine Kopie je 100 gleichzeitig laufende Anfragen, bis zu fünf Kopien,
- hält die erste Anfrage nach einer Schlafphase bis zu 90 Sekunden lang fest, während eine Kopie startet; ist bis dahin keine Kopie bereit, schlägt diese Anfrage fehl,
- gibt jeder Anfrage 90 Sekunden, um mit ihrer Antwort zu beginnen.
Was eine Funktion sein kann
- Nur der Service, der unter der Adresse der App antwortet. Eine App hat einen öffentlichen Hostnamen, auf dem ihr erster HTTP-Service antwortet (Services und Endpunkte). Veröffentliche die Funktion deshalb mit
ports:und gib den anderen Services der Appexpose:. Bei jedem anderen Service wirdreplicas: 0ignoriert, und er läuft mit einer Kopie. - Nur HTTP. Ein TCP- oder UDP-Port kann keinen Container aufwecken, deshalb schläft eine Datenbank oder ein Gameserver nie.
- Zustandslos, ohne Volume. Eine Funktion muss auf jedem Server laufen können. Anfragen können bei verschiedenen Kopien landen, was eine Kopie in ihr eigenes Dateisystem schreibt, ist weg, sobald sie schläft, und ein Volume würde jede Kopie an den einen Server binden, auf dem es liegt, sodass die Funktion nicht aufwachen könnte, solange dieser Server voll ist. Bewahre Daten in einem Datenbank-Service auf.
Mit einer Datenbank
Die anderen Services der App laufen weiter, während die Funktion schläft. Eine Datenbank, die sie nutzt, ist also schon bereit, wenn sie aufwacht. Gib der Datenbank expose: statt ports:, damit sie privat innerhalb der App bleibt:
services:
api:
build: .
ports:
- "3000"
environment:
DATABASE_URL: postgres://app:${DB_PASSWORD}@db:5432/app
deploy:
replicas: 0
db:
image: postgres:17
expose:
- "5432"
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: app
volumes:
- data:/var/lib/postgresql/data
volumes:
data:Lege DB_PASSWORD vor dem Deploy unter Environment auf der Karte der App an.
Preis
Eine Funktion kostet so viel, wie der Service im Dauerbetrieb kosten würde. Cloady berechnet, was eine App deklariert, nicht, was sie verbraucht (Kapazität und Preis), und zählt CPU und Arbeitsspeicher einer Funktion einmal, ob sie schläft oder ausgelastet ist. Innerhalb des Gratis-Kontingents kostet sie so oder so nichts.
Lokal ausführen
docker compose up startet für einen Service mit replicas: 0 keinen Container. Gib ihm einen:
docker compose up --scale api=1Später ändern
Bei einer App aus einem GitHub-Repository änderst du replicas in der Compose-Datei und pushst; das nächste Deployment übernimmt es. Entferne replicas: 0, um die Funktion wieder zu einem ständig laufenden Service zu machen. Apps aus einem Upload oder aus dem Katalog behalten die Compose-Datei, mit der sie erstellt wurden.
Im Dashboard
Die App gilt als laufend, während ihre Funktion schläft. Ihre Statusseite zeigt die Funktion als Idle, und der Uptime-Check von Monitor lässt sie schlafen.
Weiter geht es mit den Grundkonzepten zu Services, Endpunkten und Preisen oder mit der CLI-Referenz zu cloady deploy.