mirror of https://github.com/knative/docs.git
201 lines
5.0 KiB
Markdown
201 lines
5.0 KiB
Markdown
# Parallel with mutually exclusive cases
|
|
|
|
In this example, we are going to see how we can create a Parallel with mutually
|
|
exclusive branches.
|
|
|
|
This example is the same as the
|
|
[multiple branches example](../multiple-branches/README.md) except that we are
|
|
now going to rely on the Knative
|
|
[switch](https://github.com/lionelvillard/knative-functions#switch) function to
|
|
provide a soft mutual exclusivity guarantee .
|
|
|
|
NOTE: this example must be deployed in the default namespace.
|
|
|
|
## Prerequisites
|
|
|
|
Please refer to the sample overview for the [prerequisites](../README.md).
|
|
|
|
### Create the Knative Services
|
|
|
|
Let's first create the switcher and transformer services that we will use in our
|
|
Parallel.
|
|
|
|
```yaml
|
|
apiVersion: serving.knative.dev/v1
|
|
kind: Service
|
|
metadata:
|
|
name: me-even-odd-switcher
|
|
spec:
|
|
template:
|
|
spec:
|
|
containers:
|
|
- image: villardl/switcher-nodejs:0.1
|
|
env:
|
|
- name: EXPRESSION
|
|
value: Math.round(Date.parse(event.time) / 60000) % 2
|
|
- name: CASES
|
|
value: '[0, 1]'
|
|
---
|
|
apiVersion: serving.knative.dev/v1
|
|
kind: Service
|
|
metadata:
|
|
name: even-transformer
|
|
spec:
|
|
template:
|
|
spec:
|
|
containers:
|
|
- image: villardl/transformer-nodejs:0.1
|
|
env:
|
|
- name: TRANSFORMER
|
|
value: |
|
|
({"message": "we are even!"})
|
|
|
|
---
|
|
apiVersion: serving.knative.dev/v1
|
|
kind: Service
|
|
metadata:
|
|
name: odd-transformer
|
|
spec:
|
|
template:
|
|
spec:
|
|
containers:
|
|
- image: villardl/transformer-nodejs:0.1
|
|
env:
|
|
- name: TRANSFORMER
|
|
value: |
|
|
({"message": "this is odd!"})
|
|
.
|
|
```
|
|
|
|
```bash
|
|
kubectl create -f ./switcher.yaml -f ./transformers.yaml
|
|
```
|
|
|
|
### Create the Service displaying the events created by Parallel
|
|
|
|
```yaml
|
|
apiVersion: serving.knative.dev/v1
|
|
kind: Service
|
|
metadata:
|
|
name: event-display
|
|
spec:
|
|
template:
|
|
spec:
|
|
containers:
|
|
- image: gcr.io/knative-releases/knative.dev/eventing/cmd/event_display
|
|
```
|
|
|
|
```bash
|
|
kubectl -n default create -f ./event-display.yaml
|
|
```
|
|
|
|
### Create the Parallel object
|
|
|
|
The `parallel.yaml` file contains the specifications for creating the Parallel
|
|
object.
|
|
|
|
```yaml
|
|
apiVersion: flows.knative.dev/v1
|
|
kind: Parallel
|
|
metadata:
|
|
name: me-odd-even-parallel
|
|
spec:
|
|
channelTemplate:
|
|
apiVersion: messaging.knative.dev/v1
|
|
kind: InMemoryChannel
|
|
branches:
|
|
- filter:
|
|
uri: "http://me-even-odd-switcher.default.svc.cluster.local/0"
|
|
subscriber:
|
|
ref:
|
|
apiVersion: serving.knative.dev/v1
|
|
kind: Service
|
|
name: me-even-transformer
|
|
- filter:
|
|
uri: "http://me-even-odd-switcher.default.svc.cluster.local/1"
|
|
subscriber:
|
|
ref:
|
|
apiVersion: serving.knative.dev/v1
|
|
kind: Service
|
|
name: me-odd-transformer
|
|
reply:
|
|
ref:
|
|
apiVersion: serving.knative.dev/v1
|
|
kind: Service
|
|
name: me-event-display
|
|
```
|
|
|
|
```bash
|
|
kubectl create -f ./parallel.yaml
|
|
```
|
|
|
|
### Create the PingSource targeting the Parallel object
|
|
|
|
This will create a PingSource which will send a CloudEvent with
|
|
`{"message": "Even or odd?"}` as the data payload every minute.
|
|
|
|
```yaml
|
|
apiVersion: sources.knative.dev/v1
|
|
kind: PingSource
|
|
metadata:
|
|
name: me-ping-source
|
|
spec:
|
|
schedule: "*/1 * * * *"
|
|
contentType: "application/json"
|
|
data: '{"message": "Even or odd?"}'
|
|
sink:
|
|
ref:
|
|
apiVersion: flows.knative.dev/v1
|
|
kind: Parallel
|
|
name: me-odd-even-parallel
|
|
```
|
|
|
|
```bash
|
|
kubectl create -f ./ping-source.yaml
|
|
```
|
|
|
|
### Inspecting the results
|
|
|
|
You can now see the final output by inspecting the logs of the
|
|
`me-event-display` pods. Note that since we set the `PingSource` to emit every
|
|
minute, it might take some time for the events to show up in the logs.
|
|
|
|
Let's look at the `me-event-display` log:
|
|
|
|
```bash
|
|
kubectl logs -l serving.knative.dev/service=me-event-display --tail=50 -c user-container
|
|
|
|
☁️ cloudevents.Event
|
|
Validation: valid
|
|
Context Attributes,
|
|
specversion: 1.0
|
|
type: dev.knative.sources.ping
|
|
source: /apis/v1/namespaces/default/pingsources/me-ping-source
|
|
id: 0b0db15c-9b36-4388-8eaa-8c23a9dc2707
|
|
time: 2020-03-03T21:30:00.0007292Z
|
|
datacontenttype: application/json; charset=utf-8
|
|
Extensions,
|
|
knativehistory: me-odd-even-parallel-kn-parallel-kn-channel.default.svc.cluster.local; me-odd-even-parallel-kn-parallel-0-kn-channel.default.svc.cluster.local
|
|
traceparent: 00-e8b17109cd21d4fa66a86633b5a614c7-ba96d220fe13211c-00
|
|
Data,
|
|
{
|
|
"message": "we are even!"
|
|
}
|
|
☁️ cloudevents.Event
|
|
Validation: valid
|
|
Context Attributes,
|
|
specversion: 1.0
|
|
type: dev.knative.sources.ping
|
|
source: /apis/v1/namespaces/default/pingsources/me-ping-source
|
|
id: 321170d1-dea7-4b18-9290-28adb1de089b
|
|
time: 2020-03-03T21:31:00.0007847Z
|
|
datacontenttype: application/json; charset=utf-8
|
|
Extensions,
|
|
knativehistory: me-odd-even-parallel-kn-parallel-kn-channel.default.svc.cluster.local; me-odd-even-parallel-kn-parallel-1-kn-channel.default.svc.cluster.local
|
|
traceparent: 00-78d8b044d23c85789f0a13fd3679ac24-1d69ddde56d620c7-00
|
|
Data,
|
|
{
|
|
"message": "this is odd!"
|
|
}
|
|
```
|