Estimation des coûts et pratiques de migration lors de l'adoption de Vercel Workflows
Le mur du délai d'attente sans serveur et le calcul des coûts mensuels
Lorsque vous gérez un SaaS avec des fonctions sans serveur, la limite de délai d'attente de 10 à 60 secondes vous freine plus souvent qu'on ne le pense. Lors de la mise en œuvre de sauvegardes de données volumineuses ou de pipelines de génération de médias IA multimodaux, l'environnement sans serveur traditionnel interrompt constamment le code.
Vercel Workflows maintient les tâches en vie tout en réduisant la consommation de ressources à zéro lorsque la fonction entre en état d'attente. Pour prévoir les coûts, un script TypeScript est exécuté directement afin de calculer à l'avance les dépenses mensuelles. Après avoir défini le nombre d'exécutions quotidiennes, le nombre d'étapes, la durée d'exécution et la taille de la charge utile sous forme d'objets, nous les intégrons dans la fonction de calcul des coûts. Si vous dépassez la limite de 50 000 événements par mois et 1 Go d'écriture du plan Hobby, vous devez vous préparer à l'avance à passer au plan Pro. Si vous effectuez moins de 15 000 exécutions par mois, vous pouvez les absorber dans les crédits de base Pro, ce qui réduit les coûts par rapport au maintien d'une infrastructure Redis auto-hébergée.
`typescript
interface WorkflowMetrics {
dailyExecutions: number;
stepsPerExecution: number;
avgStepDurationMs: number;
payloadSizeKb: number;
}
function calculateEstimatedCost(metrics: WorkflowMetrics): { totalEvents: number; estimatedCostUsd: number } {
const totalEvents = metrics.dailyExecutions * metrics.stepsPerExecution * 30;
const freeTierEvents = 50000;
const overageEvents = Math.max(0, totalEvents - freeTierEvents);
const costPerThousand = 0.20;
const estimatedCostUsd = (overageEvents / 1000) * costPerThungk?: number;
return {
totalEvents,
estimatedCostUsd: Number(((overageEvents / 1000) * costPerThousand).toFixed(2))
};
}
`
Procédure de transition d'une file d'attente de messages vers le SDK Workflow
Lors de l'utilisation de BullMQ ou d'AWS SQS, la création de files d'attente, la publication de tâches, la réception et la gestion des connexions Redis étaient entièrement conçues manuellement. Ce processus alourdit inutilement le code. Le SDK Vercel Workflows élimine ce code d'infrastructure grâce à des directives au niveau du code.
La migration s'effectue en 3 étapes. Premièrement, enveloppez le fichier next.config.ts avec le wrapper withWorkflow. Deuxièmement, au lieu du processus worker existant, utilisez la directive use step pour écrire des tâches individuelles sous forme de fonctions asynchrones. Troisièmement, abandonnez la structure complexe en chaîne Parent-Child Job et utilisez les instructions de contrôle JavaScript ainsi que la fonction await sleep à l'intérieur de use workflow. La disparition du code de connexion Redis externe réduit l'empreinte mémoire de l'application et accélère le temps de transition.
`typescript
import { workflow } from "@vercel/workflows";
export const { POST } = workflow(async (context) => {
const userId = context.request.payload.userId;
const data = await context.run("fetch-user-data", async () => {
const res = await fetch(https://api.example.com/users/${userId});
return res.json();
});
await context.sleep("wait-for-processing", "10m");
await context.run("finalize-task", async () => {
await db.users.update({ where: { id: userId }, data: { status: "processed" } });
});
});
`
Gestion des erreurs pour préserver la cohérence des données en cas de coupure réseau
Pour éviter la perte de données lors d'une panne non déterministe, il faut d'abord isoler la nature de l'erreur. Vercel Workflows traite séparément les erreurs temporaires et les erreurs fatales.
Pour intercepter une erreur au sein d'une étape, lancez d'abord une RetryableError en cas d'erreur de la famille HTTP 429 ou 500 afin de déclencher une nouvelle tentative basée sur un backoff exponentiel. Ensuite, insérez une logique de vérification de clé unique à l'intérieur de l'étape modifiant la base de données pour empêcher l'accumulation de données en double lors des nouvelles tentatives. Enfin, connectez Vercel Log Drains à Sentry pour diffuser en temps réel des journaux JSON structurés. L'application de ce modèle permet de restaurer l'état à partir du point d'arrêt même en cas de situation exceptionnelle, éliminant ainsi le besoin de récupérer manuellement les données.
`typescript
import { RetryableError } from "@vercel/workflows";
export async function processPaymentStep(context: any, paymentData: any) {
return await context.run("charge-payment", async () => {
const exists = await db.transactions.findUnique({
where: { idempotencyKey: paymentData.key }
});
if (exists) {
return exists;
}
const response = await paymentGateway.charge(paymentData);
if (response.status === 429 || response.status >= 500) {
throw new RetryableError("Payment gateway overloaded, retrying...");
}
return await db.transactions.create({
data: { idempotencyKey: paymentData.key, amount: response.amount }
});
});
}
`