Announcing Zeebe 0.11.0: Snapshot Replication for Fast Failover, Updated Default Mapping Behavior for Simpler Workflow Creation, Easy Access to Deployment Events, and More

Written by Sebastian Menski on in the Releases category.

The Zeebe team is pleased to announce the Zeebe 0.11.0 release, which includes:

  • Snapshot replication for fast failover
  • An updated default output mapping for task and workflow instance payloads for simpler workflow creation
  • Easier access to deployment events, including a list of all workflows deployed to Zeebe
  • Accessing and setting the payload of workflow or job as generic map or POJO

In the rest of this post, we’ll cover release highlights in more detail and point you to resources for getting started with Zeebe.

You can download the release here, and be sure to check out the installation guide if you have any questions about getting started.

What’s New In Zeebe 0.11.0

Snapshot Replication For Fast Failover

(Note: if you’re new to Zeebe’s leader / follower concepts, we recommend you take a look at this section of the documentation, which provides background info for this feature.)

We’ve already written a bit about the mechanisms that make Zeebe fault tolerant, and the new snapshot replication feature speeds up Zeebe’s startup time after a failure. Snapshots make it possible for brokers in Zeebe to recover state more efficiently and without reprocessing all events stored in a log.

Prior to Zeebe 0.11.0, only leader brokers have access to snapshots. That means that when a follower broker becomes a leader, it must reprocess all events in a log to build up internal state. In some cases, this rebuilding of state can take a significant amount of time.

Snapshots are now replicated to followers (along with the log itself) so that follower brokers can more quickly become leaders and resume processing.

See more in this issue.

Changing Default Output Mapping from “replace” to “merge”

This new behavior, inspired by user feedback in the forum, seeks to make workflow design simpler for users. When merging a task payload with a workflow instance payload, the Zeebe now uses a top-level merge by default instead of replacement.

This is best described with an example:

Zeebe Output Mapping Behavior, Before and After

This output behavior is configurable. A user can also specify:

  • OVERWRITE, which will overwrite the workflow instance payload with the task payload
  • NONE, which means that the task worker doesn’t produce any output, and the task result would be dropped

Deployment events (e.g. a list of all workflows deployed to Zeebe) available via a “deployment subscription”

This feature supports a case where, for example, a user wants to display all workflows currently deployed to Zeebe in an external application. Prior to 0.11.0, this required polling a workflow repository API to fetch all workflows. There were some problems with this approach:

  • It introduced unnecessary overhead on both client and broker because it fetched all workflows over and over
  • If the number of deployed workflows exceeded the maximum size of a response message, the expected behavior was unclear

It’s now possible to subscribe to Zeebe’s internal-topic, and this subscription will receive all deployed workflows.

ZeebeClient.newClient()
   .newManagementSubscription()
   .name("deployment-subscription")
   .deploymentEventHandler(System.out::println)
   .open();

This will print out all deployment events for all topics.

Learn more in this issue.

Access and set payload of workflow or job as generic map or POJO

This feature allows users to easily modify the payload without handling the (de)serialization themselves. Previously, payloads were only available as a JSON string.

ZeebeClient.newClient().topicClient().jobClient()
 .newWorker()
 .jobType("payment-service")
 .handler((jobClient, job) -> {
   // Access payload as generic map
   final Map<String, Object> payload = job.getPayloadAsMap();
   // or deserialize it to a POJO
   // final PayloadObject payload = job.getPayloadAsType(PayloadObject.class);

   payload.put("totalPrice", 46.50);

   jobClient.newCompleteCommand(job)
     .payload(payload)
     .send()
     .join();
 })
 .open();

Get Started With Zeebe

Ready to get started? The following links will help you get going with Zeebe.

If you have questions about Zeebe, visit the Community page to learn how to contact us via the forum or our public Slack channels.

If you’d like to stay on top of what’s new with Zeebe, you can subscribe to our newsletter, follow us on Twitter, or subscribe to the Zeebe blog via RSS.