encore-pubsub

Par encoredev · skills

Messagerie asynchrone dans Encore.ts via `Topic` et `Subscription` depuis `encore.dev/pubsub` — diffusez des événements, découple les producteurs des consommateurs et exécutez des handlers en arrière-plan.

npx skills add https://github.com/encoredev/skills --skill encore-pubsub

Encore Pub/Sub

Instructions

Pub/Sub permet la messagerie asynchrone entre services. Les producteurs publient des événements vers un Topic ; les consommateurs attachent des Subscriptions pour réagir. Les ressources doivent être déclarées au niveau du package — jamais à l'intérieur de fonctions.

Topics

import { Topic } from "encore.dev/pubsub";

interface OrderCreatedEvent {
  orderId: string;
  userId: string;
  total: number;
}

// Package level declaration
export const orderCreated = new Topic<OrderCreatedEvent>("order-created", {
  deliveryGuarantee: "at-least-once",
});

Publishing

await orderCreated.publish({
  orderId: "123",
  userId: "user-456",
  total: 99.99,
});

Subscriptions

import { Subscription } from "encore.dev/pubsub";

const _ = new Subscription(orderCreated, "send-confirmation-email", {
  handler: async (event) => {
    await sendEmail(event.userId, event.orderId);
  },
});

Message Attributes

Utilisez Attribute<T> pour les champs qui doivent être traités comme des attributs de message (pour le filtrage/tri) :

import { Topic, Attribute } from "encore.dev/pubsub";

interface CartEvent {
  cartId: Attribute<string>;  // Used for ordering
  userId: string;
  action: "add" | "remove";
  productId: string;
}

// Ordered topic: events with same cartId delivered in order
export const cartEvents = new Topic<CartEvent>("cart-events", {
  deliveryGuarantee: "at-least-once",
  orderingAttribute: "cartId",
});

Topic References

Transmettez l'accès aux topics à d'autres parties du code tout en préservant l'analyse statique :

import { Publisher } from "encore.dev/pubsub";

const publisherRef = orderCreated.ref<Publisher>();

async function notifyOrder(ref: typeof publisherRef, orderId: string) {
  await ref.publish({ orderId, userId: "123", total: 99.99 });
}

Delivery Guarantees

  • at-least-once (défaut) : peut livrer des doublons → les handlers doivent être idempotents.
  • exactly-once : plus strict, débit plafonné (AWS 300 msg/s/topic, GCP 3000+ msg/s/région). Ne déduplique pas côté publication.

Guidelines

  • Topics et subscriptions doivent être déclarés au niveau du package.
  • Les handlers de subscription doivent être idempotents (at-least-once delivery est le défaut).
  • Utilisez Attribute<T> pour les champs destinés au filtrage/tri, pas pour des métadonnées arbitraires.
  • Ne faites pas de travail synchrone lourd dans les appelants de publishpublish retourne une fois le message en file d'attente.

Skills similaires