Una funzione serverless è una singola unità di deployment di logica di backend; un microservizio è un servizio intero gestito in autonomia. Quell’unica frase è tutto il confronto in miniatura: tutto il resto – carico di ops, curve di costo, cold start, stato – discende da che cosa sia l’unità di deployment, una funzione affidata a una piattaforma o un servizio da gestire in proprio.
Punti chiave
| Domanda | Risposta |
|---|---|
| La differenza centrale | L’unità di deployment: una sola operazione (funzione) vs. un’intera capacità posseduta (servizio) |
| Chi la gestisce | Funzioni: la piattaforma. Microservizi: il team, servizio per servizio |
| Costo a riposo | Le funzioni scendono a zero; una flotta di servizi fattura giorno e notte |
| L’imposta delle funzioni | Cold start, limiti di durata dell’esecuzione, assenza di stato |
| L’imposta dei servizi | Pipeline, orchestrazione, monitoring, reperibilità – moltiplicati per servizio |
L’unità di deployment, in codice
Questo è l’intero deployabile di un’operazione di checkout: una funzione, nessun repository per servizio, nessuna immagine di container, nessuna pipeline.
// JavaScript / Node.js — the function is the whole deployable
// cloud/main.js — runs on the platform; there is no service to operate
Parse.Cloud.define('checkout', async (request) => {
const cart = await new Parse.Query('Cart').get(request.params.cartId, {
sessionToken: request.user.getSessionToken(),
});
// …price the cart, reserve stock, write the order…
return { orderId: cart.id, status: 'confirmed' };
});
// Any client calls it by name — no gateway, container, or pipeline
const result = await Parse.Cloud.run('checkout', { cartId }); // Flutter / Dart — Back4app Flutter SDK
// Calling the function: one named endpoint, no service discovery
final checkout = ParseCloudFunction('checkout');
final response = await checkout.execute(
parameters: {'cartId': cartId},
);
if (response.success) {
print(response.result['status']); // confirmed
} else {
print(response.error?.message);
} // iOS / Swift — Back4app Swift SDK
// Calling the function: one named endpoint, no service discovery
struct Checkout: ParseCloudable {
typealias ReturnType = [String: String]
var functionName: String = "checkout"
var cartId: String
}
let result = try await Checkout(cartId: cartId).runFunction()
print(result["status"] ?? "") // confirmed // Android / Kotlin — Back4app Android SDK
// Calling the function: one named endpoint, no service discovery
val params = hashMapOf("cartId" to cartId)
ParseCloud.callFunctionInBackground<Map<String, String>>(
"checkout", params
) { result, e ->
if (e == null) {
Log.i("Checkout", result["status"] ?: "")
} else {
Log.w("Checkout", "failed: ${e.code}")
}
} L’equivalente a microservizio di quello snippet è un repository intero: un server HTTP, una build di container, i manifest di deployment, il service discovery, gli health check, una dashboard e un turno di reperibilità – prima della prima riga di logica di checkout.
Funzioni serverless vs. microservizi su misura
| Dimensione | Funzioni serverless | Microservizi su misura |
|---|---|---|
| Unità di deployment | Una funzione | Un servizio (processo + API + dati) |
| Infrastruttura da gestire | Nessuna – la gestisce la piattaforma | Container, orchestrazione, rete per ogni servizio |
| Scalabilità | Automatica, per invocazione, fino a zero | Resta da configurare; la capacità gira anche a riposo |
| Stato | Stateless per contratto; lo stato vive nel database | Può tenere stato in memoria (a un prezzo) |
| Profilo di latenza | Le chiamate calde sono rapide; le istanze inattive pagano un cold start | Costante – il processo è sempre in piedi |
| Runtime | Fornito dalla piattaforma (di norma un runtime JavaScript gestito) | Qualunque cosa sia containerizzabile |
| Lavori di lunga durata | Tagliati dai limiti di durata dell’esecuzione | Illimitati |
| Forma del team | Solo ingegneri di prodotto | Richiede capacità di piattaforma o DevOps |
| Curva di costo | A esecuzione; imbattibile sui picchi, si incrocia a carico costante | Piatta; efficiente a volumi elevati e regolari |
La letteratura sui microservizi è esplicita: i benefici di quell’architettura si comprano con una seria maturità operativa – deployment automatizzato, monitoring sofisticato, progettazione orientata al guasto. Le funzioni esternalizzano esattamente quel conto alla piattaforma, ed è il motivo per cui l’analisi del serverless di Mike Roberts inquadra il FaaS come uno scambio di controllo in cambio di molte meno ops. Nessuno dei due scambi è gratuito; la domanda è quale imposta un team possa permettersi.
Che cosa succede davvero a una richiesta
Vale la pena notare che cosa aggiunge la metà inferiore e la metà superiore non riesce a esprimere: chiamate da servizio a servizio, archivi dati per ogni servizio e un gateway – la superficie di coordinamento in cui vive davvero la complessità dei microservizi. Transazioni distribuite, retry e guasti parziali tra il servizio carrello e il servizio ordini sono codice da scrivere; nel modello a funzioni lo stesso flusso di lavoro è di solito una funzione e un database, e i pezzi orientati agli eventi (trigger, job pianificati) si agganciano alla piattaforma invece che a code da gestire in proprio.
Quando le funzioni sostituiscono una flotta di microservizi – e quando non possono
L’osservazione onesta dietro il pattern BaaS: la maggior parte dei microservizi di un prodotto tipico è sottile. Validano un input, applicano una regola, leggono o scrivono un database e chiamano un vicino, e il guscio operativo attorno a quella logica è il 90 % del loro peso. Le funzioni cloud dentro un BaaS eliminano il guscio: database, autenticazione, archiviazione di file e API sono servizi della piattaforma, così ogni “servizio” si riduce a una manciata di funzioni e trigger. I team da una a dieci persone che rilasciano prodotti fatti di CRUD più logica hanno raramente bisogno di più.
Il soffitto è altrettanto onesto. Le funzioni non possono ospitare un modello di raccomandazione che richiede hardware specializzato, un transcodificatore video che gira per un’ora, un motore di fan-out WebSocket con tuning su misura, né un componente il cui throughput costante rende il prezzo a invocazione l’opzione cara. Quando un componente supera quelle linee, conviene estrarlo come servizio vero e lasciarlo interoperare con le funzioni: estrarre un hot spot dimostrato è una migrazione molto meno costosa che scomporre una flotta speculativa costruita troppo presto, la stessa lezione che l’argomento monolith-first insegna un livello più in alto.
Casi d’uso tipici
- Funzioni: backend di API e mobile. Logica a forma di richiesta su un database gestito: il caso dominante, e quello che le piattaforme BaaS impacchettano da un capo all’altro.
- Funzioni: trigger e collante. Validare al salvataggio, ridimensionare al caricamento, sincronizzare verso un’API di terze parti, far girare job notturni: reazioni brevi che farebbero vergognare un servizio dedicato.
- Funzioni: traffico a picchi o sconosciuto. Lanci, campagne, MVP: la discesa a zero assorbe sia il picco sia il silenzio.
- Microservizi: componenti pesanti e costanti. Ricerca, feed, motori di prezzo: carico regolare dove la capacità sempre attiva costa meno e si può regolare.
- Microservizi: runtime particolari. Linguaggi fuori standard, dipendenze native, GPU, processi di lunga durata.
- L’ibrido. Funzioni per la superficie di API e per gli eventi; uno o due servizi estratti per i componenti i cui numeri lo impongono.
Funzioni o microservizi? Matrice decisionale
| La situazione | Orientarsi verso |
|---|---|
| Team piccolo, logica di prodotto fatta quasi solo di CRUD e regole | Funzioni su un BaaS – la flotta aggiunge costo, non capacità |
| Il traffico è a picchi, basso o imprevedibile | Funzioni – la discesa a zero è tutto l’argomento |
| Un componente gira da minuti a ore per ogni job | Microservizio (o un sistema di job in background) – i timeout escludono le funzioni |
| Throughput elevato e costante su un hot path | Microservizio – la capacità a tariffa fissa vince la curva di costo |
| Budget rigido di latenza di coda su ogni richiesta | Microservizio – nessuna varianza da cold start |
| Runtime personalizzato, dipendenze native, hardware particolare | Microservizio – le piattaforme eseguono ciò che eseguono |
| Non c’è capacità di ops dedicata | Funzioni – l’imposta della flotta arriva, messa a budget o no |
| Un solo hot spot dentro un prodotto a forma di funzioni | Ibrido – estrarre quell’unico servizio e tenere il resto a funzioni |
Limiti e trade-off
- Funzioni: i limiti di esecuzione sono muri invalicabili. I lavori lunghi devono spostarsi su sistemi di job o su servizi: nessuna astuzia allunga un timeout con eleganza.
- Funzioni: cold start e catene. Rari per singola invocazione, ma le architetture in cui una funzione chiama una funzione li impilano; i percorsi caldi conviene tenerli poco profondi.
- Funzioni: l’accoppiamento alla piattaforma. Il runtime e le sue API appartengono alla piattaforma: una base open-source ospitabile in proprio è la copertura pratica contro il lock-in.
- Microservizi: il conto delle ops è per servizio. Pipeline, monitoring, contratti versionati e reperibilità si moltiplicano con la flotta; sottovalutarlo è la modalità di fallimento classica.
- Microservizi: i problemi dei sistemi distribuiti arrivano il primo giorno. Partizioni di rete, guasti parziali e coerenza tra servizi sono costanti architetturali, non casi limite.
- Entrambi: lo stato viene esternalizzato comunque. Le funzioni lo impongono; i servizi ben gestiti lo scelgono. In entrambi i progetti è il database, non il calcolo, a finire per detenere la verità.
Funzioni serverless e microservizi su Back4app
Back4app è una piattaforma open-source di Backend as a Service (BaaS) che combina database gestito, API REST e GraphQL generate automaticamente, autenticazione, archiviazione di file e funzioni serverless con Cloud Code. È il lato funzioni di questo confronto consegnato per intero: Cloud Code esegue funzioni con nome come il checkout qui sopra, più trigger di database e job pianificati, accanto a tutto ciò per cui esiste una flotta di microservizi – così la flotta che la maggior parte dei prodotti avrebbe costruito diventa funzioni sopra servizi gestiti. E poiché la base è open source e ospitabile in proprio, la via dell’estrazione resta aperta: quando un componente supera il modello a funzioni, può essere promosso a servizio dedicato senza abbandonare la piattaforma che lo circonda.
Domande frequenti
Una funzione serverless è un microservizio?
Non proprio: la granularità differisce di un ordine di grandezza. Un microservizio possiede una capacità di business: processo proprio, archivio dati proprio, pipeline di deployment e superficie di API. Una funzione possiede una sola operazione. Un singolo microservizio di norma si scompone in molte funzioni, e processo, scalabilità e runtime attorno a ciascuna li fornisce la piattaforma, non il team.
Le funzioni serverless possono sostituire i microservizi?
Per molti prodotti sì, soprattutto quando i servizi si limiterebbero ad avvolgere un database con validazione e un flusso di lavoro leggero. Le funzioni su un BaaS ereditano database, autenticazione e API, e resta da scrivere solo la logica di business vera. Le eccezioni però esistono: lavori di lunga durata, runtime personalizzati, throughput elevato e costante e soglie di latenza rigide continuano a favorire un servizio gestito in proprio.
Costano meno le funzioni o i microservizi?
A volumi bassi o a picchi le funzioni: si paga per esecuzione e il costo a riposo è zero, mentre una flotta di microservizi fattura container ventiquattr'ore al giorno più il tempo di chi la gestisce. A volumi elevati e costanti le curve si incrociano: la capacità sempre attiva costa meno per richiesta. Nel confronto va contato lo stipendio di chi fa ops, perché di solito domina la voce infrastruttura.
I cold start rendono le funzioni più lente dei microservizi?
Solo sulla frazione di invocazioni che finisce su un'istanza inattiva – di norma da millisecondi a circa un secondo, contro la latenza costante di un servizio sempre caldo. Il traffico regolare tiene calde le istanze delle funzioni, e il caso da tenere d'occhio sono le funzioni concatenate, perché ogni salto può aggiungere il proprio cold start. Per budget rigidi di latenza di coda un servizio sempre attivo resta la scelta vincente.
Quando vincono chiaramente i microservizi su misura?
Con lavori di lunga durata o con stato che sopravvivono ai timeout delle funzioni, con runtime personalizzati o dipendenze di sistema che la piattaforma non offre, con hardware specializzato, con throughput elevato e costante dove la capacità sempre attiva costa meno, e con team che hanno bisogno del controllo completo della rete e della topologia di deployment. Se più di uno di questi punti vale per un componente, quel componente vuole essere un servizio.
Le funzioni serverless possono conservare lo stato?
Non tra un'invocazione e l'altra: ogni chiamata parte da una tabula rasa, e tutto ciò che vale la pena conservare deve vivere nel database o in una cache. I microservizi possono tenere stato in memoria, al prezzo di rendere più difficili scalabilità e failover. In pratica le due architetture convergono sulla stessa disciplina: esternalizzare lo stato, trattare il calcolo come usa e getta.
Si possono combinare funzioni e microservizi?
Sì, e i sistemi maturi di solito lo fanno. La divisione pragmatica: le funzioni si occupano della logica di richiesta e risposta delle API, dei trigger di database, dei job pianificati e del collante tra eventi; i servizi dedicati si occupano dei pochi componenti con carico pesante e costante o con esigenze particolari di runtime. Partire dalle funzioni ed estrarre un servizio quando i numeri lo impongono costa meno della migrazione inversa.