Using persistence in SonataFlow workflows
This document describes how to configure a SonataFlow instance to use persistence and store the workflow context in a relational database.
Kubernetes’s pods are stateless by definition. In some scenarios, this can be a challenge for workloads that require maintaining the status of the application regardless of the pod’s lifecycle. In the case of SonataFlow, by default, the context of the workflow is lost when the pod restarts.
If your workflow requires recovery from such scenarios, you must provide additional configuration to enable the Workflow Runtime Persistence.
That configuration must be provided by using the SonataFlowPlatform CR or the SonataFlow CR, and has different scopes depending on each case.
Configuring the persistence using the SonataFlowPlatform CR
The SonataFlowPlatform CR facilitates the configuration of the persistence with namespace scope. It means that it will be automatically applied to all the workflows deployed in
that namespace. This can be useful to reduce the amount resources to configure, for example, in cases where the workflows deployed in that namespace belongs to the same application, etc.
That decision is left to each particular use case, however, it’s important to know, that this configuration can be overridden by any workflow in that namespace by using the SonataFlow CR.
Finally, the SonataFlow Operator can also use this configuration to set the supporting service’s persistence.
|
Persistence configurations are applied at workflow deployment time, and potential changes in the SonataFlowPlatform will not impact already deployed workflows. |
To configure the persistence you must use the persistence field in the SonataFlowPlatform CR spec:
apiVersion: sonataflow.org/v1alpha08
kind: SonataFlowPlatform
metadata:
name: sonataflow-platform-example
namespace: example-namespace
spec:
persistence:
postgresql:
serviceRef:
name: postgres-example (1)
namespace: postgres-example-namespace (2)
databaseName: example-database (3)
port: 1234 (4)
secretRef:
name: postgres-secrets-example (5)
userKey: POSTGRESQL_USER (6)
passwordKey: POSTGRESQL_PASSWORD (7)
| 1 | Name of the Kubernetes Service to connect with the PostgreSQL database server. |
| 2 | (Optional) Kubernetes namespace containing the PostgreSQL Service. Defaults to the SonataFlowPlatform’s local namespace. |
| 3 | Name of the PostgreSQL database to store the workflow’s data. |
| 4 | (Optional) Port number to connect with the PostgreSQL Service. Defaults to 5432. |
| 5 | Name of the Kubernetes Secret containing the username and password to connect with the database. |
| 6 | Name of the Kubernetes Secret key containing the username to connect with the database. |
| 7 | Name of the Kubernetes Secret key containing the password to connect with the database. |
This configuration signals the operator that every workflow deployed in the current SonataFlowPlatform’s namespace must be properly configured to connect with that PostgreSQL database server.
And the operator will add the relevant JDBC connection parameters in the form of environment variables to the workflow container.
Additionally, for SonataFlow CR deployments that use the preview profile, it will configure the SonataFlow build system to include specific Quarkus extensions required for persistence.
|
Currently, PostgreSQL is the only supported persistence. |
Below you can see an example of the configurations produced for a workflow with the name example-workflow, that was deployed using the previous SonataFlowPlatform.
For simplicity, only the env configurations related to the persistence has been included. These operator managed configurations are immutable.
env configurations in the workflow container env:
- name: QUARKUS_DATASOURCE_USERNAME
valueFrom:
secretKeyRef:
name: postgres-secrets-example
key: POSTGRESQL_USER
- name: QUARKUS_DATASOURCE_PASSWORD
valueFrom:
secretKeyRef:
name: postgres-secrets-example
key: POSTGRESQL_PASSWORD
- name: QUARKUS_DATASOURCE_DB_KIND
value: postgresql
- name: QUARKUS_DATASOURCE_JDBC_URL
value: >-
jdbc:postgresql://postgres-example.postgres-example-namespace:1234/sonataflow?currentSchema=example-workflow
- name: KOGITO_PERSISTENCE_TYPE
value: jdbc
|
When you use the |
To learn how to initialize the database schema see: Database schema initialization.
Configuring the persistence using the SonataFlow CR
The SonataFlow CR facilitates the configuration of the persistence with workflow scope, and you can use it independently if the SonataFlowPlatform persistence was already configured in the current namespace, see: Persistence configuration precedence rules.
To configure the persistence, you must use the persistence field in the SonataFlow CR spec:
apiVersion: sonataflow.org/v1alpha08
kind: SonataFlow
metadata:
name: example-workflow
annotations:
sonataflow.org/description: Example Workflow
sonataflow.org/version: 0.0.1
spec:
persistence:
postgresql:
serviceRef:
name: postgres-example (1)
namespace: postgres-example-namespace (2)
databaseName: example-database (3)
databaseSchema: example-schema (4)
port: 1234 (5)
secretRef:
name: postgres-secrets-example (6)
userKey: POSTGRESQL_USER (7)
passwordKey: POSTGRESQL_PASSWORD (8)
flow:
...
| 1 | Name of the Kubernetes Service to connect with the PostgreSQL database server. |
| 2 | (Optional) Kubernetes namespace containing the PostgreSQL Service. Defaults to the workflow’s local namespace. |
| 3 | Name of the PostgreSQL database to store the workflow’s data. |
| 4 | (Optional) Name of the database schema to store workflow’s data. Defaults to the workflow’s name. |
| 5 | (Optional) Port number to connect with the PostgreSQL Service. Defaults to 5432. |
| 6 | Name of the Kubernetes Secret containing the username and password to connect with the database. |
| 7 | Name of the Kubernetes Secret key containing the username to connect with the database. |
| 8 | Name of the Kubernetes Secret key containing the password to connect with the database. |
This configuration signals the operator that the current workflow must be properly configured to connect with that PostgreSQL database server when deployed.
Similar to the SonataFlowPlatform persistence, the operator will add the relevant JDBC connection parameters in the form of environment variables to the workflow container.
Additionally, for SonataFlow CR deployments that use the preview profile, it can configure the SonataFlow build system to include specific Quarkus extensions required for persistence.
|
Currently, PostgreSQL is the only supported persistence. |
To learn how to initialize the database schema see: Database schema initialization.
Persistence configuration precedence rules
SonataFlow CR persistence can be used with or without the SonataFlowPlatform CR persistence.
And, if the current namespace has an already configured SonataFlowPlatform CR persistence, the following rules apply:
-
If the
SonataFlowCR has a configured persistence, that configuration will apply. -
If the
SonataFlowCR has no configured persistence, i.e., the fieldspec.persistenceis not present at all, the persistence configuration will be taken from the current platform. -
If you don’t want the current workflow to use
persistence, you must use the following configuration in the SonataFlow CR:spec.persistence : {}to ignore theSonataFlowPlatformpersistence configuration.
Persistence configuration and SonataFlow profiles
All the configurations shown for the SonataFlowPlatform CR and SonataFlow CR, apply exactly the same for both the preview and the gitops profiles.
However, you must not use them in the dev profile, since this profile will simply ignore them.
Finally, the only distinction between preview and gitops profiles is that, when you use the gitops profile, the following Quarkus extensions must be added when you build your workflow image. Since that build is accomplished outside the operator scope.
| groupId | artifactId | version |
|---|---|---|
io.quarkus |
quarkus-agroal |
3.8.4 |
io.quarkus |
quarkus-jdbc-postgresql |
3.8.4 |
org.kie |
kie-addons-quarkus-persistence-jdbc |
10.0.0 |
If you generate your images by using the kogito-swf-builder, you can do it by passing it the following build argument:
QUARKUS_EXTENSIONS=io.quarkus:quarkus-agroal:3.8.4,io.quarkus:quarkus-jdbc-postgresql:3.8.4,org.kie:kie-addons-quarkus-persistence-jdbc:10.0.0
Database schema initialization
When you use the SonataFlow PostgreSQL persistence, you can either opt to use Flyway to produce the database initialization, or manually upgrade your database via DDL scripts.
Flyway managed database initialization
To enable Flyway you must use any of the following configuration procedures:
|
The Flyway schema initialization is disabled by default. |
Flyway configuration by using the workflow ConfigMap
Add the following property to your workflow ConfigMap.
apiVersion: v1
kind: ConfigMap
metadata:
labels:
app: example-workflow
name: example-workflow-props
data:
application.properties: |
quarkus.flyway.migrate-at-start = true
Flyway configuration by using the workflow container env vars
Add the following env var in the spec.podTemplate.container of the SonataFlow CR.
apiVersion: sonataflow.org/v1alpha08
kind: SonataFlow
metadata:
name: example-workflow
annotations:
sonataflow.org/description: Example Workflow
sonataflow.org/version: 0.0.1
spec:
podTemplate:
container:
env:
- name: QUARKUS_FLYWAY_MIGRATE_AT_START
value: 'true'
flow: ...
Flyway configuration by using SonataFlowPlatForm properties
To apply a common Flyway configuration to all the workflows in a given namespace, you can use the spec.properties.flow of the SonataFlowPlatform in that namespace.
apiVersion: sonataflow.org/v1alpha08
kind: SonataFlowPlatform
metadata:
name: sonataflow-platform
spec:
properties:
flow:
- name: quarkus.flyway.migrate-at-start
value: true
|
The configuration above takes effect at workflow deployment time, so you must be sure that the property is configured before you deploy your workflows. |
Manual database initialization by using DDL
To initialize the database schema manually, you must be sure that the following application property quarkus.flyway.migrate-at-start is not configured, or is set to false, and follow this procedure.
|
Remember that:
|
Conclusion
By using the SonataFlowPlatform CR you can enable the persistence for all the workflows that you deploy in that namespace.
And, by using the SonataFlow CR you can enable the persistence of a particular workflow. If both methods are present in the current namespace, the SonataFlow CR configuration has precedence over the SonataFlowpPlatform configuration.
Found an issue?
If you find an issue or any misleading information, please feel free to report it here. We really appreciate it!