Pub/Sub and namespaces

Use Dapr Pub/Sub with multiple namespaces

In some scenarios, applications can be spread across namespaces and share a queue or topic via PubSub. In this case, the PubSub component must be provisioned on each namespace.

In this example, we will use the PubSub sample. Redis installation and the subscribers will be in namespace-a while the publisher UI will be on namespace-b. This solution should also work if Redis was installed on another namespace or if we used a managed cloud service like Azure ServiceBus.

The table below shows which resources are deployed to which namespaces:

Resourcenamespace-anamespace-b
Redis masterX
Redis slaveX
Dapr’s PubSub componentXX
Node subscriberX
Python subscriberX
React UI publisherX

Pre-requisites

Setup namespace-a

Create namespace and switch kubectl to use it.

  1. kubectl create namespace namespace-a
  2. kubectl config set-context --current --namespace=namespace-a

Install Redis (master and slave) on namespace-a, following these instructions.

Now, configure deploy/redis.yaml, paying attention to the hostname containing namespace-a.

  1. apiVersion: dapr.io/v1alpha1
  2. kind: Component
  3. metadata:
  4. name: pubsub
  5. namespace: default
  6. spec:
  7. type: pubsub.redis
  8. version: v1
  9. metadata:
  10. - name: "redisHost"
  11. value: "redis-master.namespace-a.svc:6379"
  12. - name: "redisPassword"
  13. value: "YOUR_PASSWORD"

Deploy resources to namespace-a:

  1. kubectl apply -f deploy/redis.yaml
  2. kubectl apply -f deploy/node-subscriber.yaml
  3. kubectl apply -f deploy/python-subscriber.yaml

Setup namespace-b

Create namespace and switch kubectl to use it.

  1. kubectl create namespace namespace-b
  2. kubectl config set-context --current --namespace=namespace-b

Deploy resources to namespace-b, including the Redis component:

  1. kubectl apply -f deploy/redis.yaml
  2. kubectl apply -f deploy/react-form.yaml

Now, find the IP address for react-form, open it on your browser and publish messages to each topic (A, B and C).

  1. kubectl get service -A

Confirm subscribers received the messages.

Switch back to namespace-a:

  1. kubectl config set-context --current --namespace=namespace-a

Find the POD names:

  1. kubectl get pod # Copy POD names and use in the next commands.

Display logs:

  1. kubectl logs node-subscriber-XYZ node-subscriber
  2. kubectl logs python-subscriber-XYZ python-subscriber

The messages published on the browser should show in the corresponding subscriber’s logs. The Node.js subscriber receives messages of type “A” and “B”, while the Python subscriber receives messages of type “A” and “C”.

Clean up

  1. kubectl delete -f deploy/redis.yaml --namespace namespace-a
  2. kubectl delete -f deploy/node-subscriber.yaml --namespace namespace-a
  3. kubectl delete -f deploy/python-subscriber.yaml --namespace namespace-a
  4. kubectl delete -f deploy/react-form.yaml --namespace namespace-b
  5. kubectl delete -f deploy/redis.yaml --namespace namespace-b
  6. kubectl config set-context --current --namespace=default
  7. kubectl delete namespace namespace-a
  8. kubectl delete namespace namespace-b

Last modified February 16, 2021: Merge pull request #1235 from dapr/update-v0.11 (b4e9fbb)