Chapters
Related content
If you want to dive into detail, refer to the following pages:
Cloudflare Workflows provides durable execution capabilities, allowing developers to create reliable, repeatable workflows that run in the background. Workflows are designed to resume execution even if the underlying compute fails, ensuring that tasks complete eventually. They are built on top of Cloudflare Workers and handle scaling and provisioning automatically.
Workflows are triggered by events, such as Event Notifications consumed from a Queue, HTTP requests, another Worker, or even scheduled timers. Individual steps within a Workflow are designed as retriable units of work. The state is persisted between steps, allowing workflows to resume from the last successful step after failures. Workflows automatically generate metrics for each step, aiding in debugging and observability.
Chapters
Related content
If you want to dive into detail, refer to the following pages:
Punderful is a sample application that showcases the use of various Cloudflare primitives, including Workers, D1, Vectorize, Workers AI, and Workflows. The application displays a list of puns stored in a D1 database.
The homepage lists the latest puns stored in D1. The application also includes a semantic search feature powered by Vectorize. To perform a search:
To demonstrate adding a new pun:
When a new pun is submitted, it needs to be indexed in Vectorize for the semantic search to work. This indexing process involves creating embeddings from the pun text. This is a task suitable for background processing using Cloudflare Workflows, avoiding delays for the user in the request-response loop.
A workflow is implemented to handle the background processing required when a new pun is submitted.
When a new pun is submitted via the /api/puns
endpoint, the data is first inserted into the D1 database. Then, a new Workflow instance is created and triggered to perform the subsequent background tasks.
In this handler, c.env.PUBLISH.create(crypto.randomUUID(), { punId, pun: payload.pun })
creates a new instance of the workflow bound as PUBLISH
, assigns it a unique ID, and passes the punId
and pun
text as the payload.
The workflow logic is defined in a class that extends WorkflowEntrypoint
.
The run
method is the entrypoint for the workflow execution. It receives the event
containing the payload and a step
object to define individual, durable steps.
Each discrete, retriable task in the workflow is defined using await step.do()
.
Optionally, the workflow can perform content moderation using an external service like OpenAI's moderation API if an API key is available in the environment.
This step calls the OpenAI moderation API. If the content is flagged as inappropriate, the pun's status is updated in the database, and a NonRetryableError
is thrown. Throwing a NonRetryableError
prevents the workflow from retrying this step, as the content is permanently deemed inappropriate.
Next, create vector embeddings for the pun text using a Workers AI model.
This step uses the @cf/baai/bge-large-en-v1.5
model from Workers AI to generate a vector embedding for the pun
text. The result (the embedding vector) is returned by the step and can be used in subsequent steps. step.do()
ensures this step will be retried if it fails, guaranteeing that embeddings are eventually created.
Optionally, use a Workers AI language model to categorize the pun.
This step uses the @cf/meta/llama-3.1-8b-instruct
model with a specific system prompt to generate categories for the pun. The generated categories string is returned by the step. This step also benefits from step.do()
's reliability.
Insert the created pun embedding and potentially categories embedding into the Vectorize database.
This step uses this.env.VECTORIZE.upsert()
to add the generated embeddings and associated metadata to the Vectorize database. This makes the pun searchable semantically. step.do()
ensures this critical indexing step is completed reliably.
The final step updates the status of the pun in the D1 database to indicate that it has been published and processed by the workflow.
This step updates the status
column in the D1 database to "published" for the corresponding pun ID. Once this step is complete, the pun is considered fully processed and ready to be displayed on the homepage.
To make the PublishWorkflow
class available to the main Worker and to provide access to necessary resources (like D1, AI, Vectorize), bindings are configured in the wrangler.toml
file.
This configuration defines a workflow named publish
, binds it to the environment variable PUBLISH
, and links it to the PublishWorkflow
class in src/index.ts
. It also shows bindings for Workers AI (AI
) and Vectorize (VECTORIZE
), which are accessed via this.env
within the workflow.
Vectorize is a vector database used in this application to enable semantic search for puns. It stores the vector embeddings created by Workers AI. The search functionality queries this Vectorize index to find puns similar in meaning to the user's query.
The homepage displays recently published puns (status "published"). The detail page for a specific pun displays "Similar Puns", which are found by querying Vectorize with the embedding of the current pun.
Cloudflare Workers and Workflows are designed to scale automatically based on demand, handling concurrent requests and background tasks efficiently without requiring manual provisioning.