mirror of https://github.com/dapr/docs.git
consume topics how to (#52)
This commit is contained in:
parent
2e06d6a895
commit
36f1654d5b
|
@ -0,0 +1,81 @@
|
||||||
|
# Use Pub Sub to consume messages from topics
|
||||||
|
|
||||||
|
Pub-Sub is a very common pattern in a distributed system with many services that want to utilize decoupled, asynchronous messaging.
|
||||||
|
Using Pub-Sub, you can enable scnearios where event consumers are decoupled from event producers.
|
||||||
|
|
||||||
|
Dapr provides an extensible Pub-Sub system with At-Least-Once guarantees, allowing developers to publish and subscribe to topics.
|
||||||
|
Dapr provides different implementation of the underlying system, and allows operators to bring in their preferred infrastructure, for example Redis Streams, Kafka, etc.
|
||||||
|
|
||||||
|
## Setup the Pub Sub component
|
||||||
|
|
||||||
|
The first step is to setup the Pub-Sub component.
|
||||||
|
For this guide, we'll use Redis Streams, which is also installed by default on a local machine when running `dapr init`.
|
||||||
|
|
||||||
|
*Note: When running Dapr locally, a pub-sub component YAML will automatically be created if it doesn't exist in a directory called `components` in your current working directory.*
|
||||||
|
|
||||||
|
```
|
||||||
|
apiVersion: dapr.io/v1alpha1
|
||||||
|
kind: Component
|
||||||
|
metadata:
|
||||||
|
name: messagebus
|
||||||
|
spec:
|
||||||
|
type: pubsub.redis
|
||||||
|
metadata:
|
||||||
|
- name: redisHost
|
||||||
|
value: localhost:6379
|
||||||
|
- name: redisPassword
|
||||||
|
value: ""
|
||||||
|
```
|
||||||
|
|
||||||
|
To deploy this into a Kubernetes cluster, fill in the `metadata` connection details in the yaml, and run `kubectl apply -f pubsub.yaml`.
|
||||||
|
|
||||||
|
## Subscribe to topics
|
||||||
|
|
||||||
|
To subscribe to topics, start a web server in the programming langauge of your choice and listen on the following `GET` endpoint: `/dapr/subscribe`.
|
||||||
|
The Dapr instance will call into your app, and expect a JSON value of an array of topics.
|
||||||
|
|
||||||
|
*Note: The following example is written in node, but can be in any programming language*
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
const express = require('express')
|
||||||
|
const bodyParser = require('body-parser')
|
||||||
|
const app = express()
|
||||||
|
app.use(bodyParser.json())
|
||||||
|
|
||||||
|
const port = 3000
|
||||||
|
|
||||||
|
<b>app.get('/dapr/subscribe', (req, res) => {
|
||||||
|
res.json([
|
||||||
|
'topic1'
|
||||||
|
])
|
||||||
|
})</b>
|
||||||
|
|
||||||
|
app.listen(port, () => console.log(`consumer app listening on port ${port}!`))
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
## Consume messages
|
||||||
|
|
||||||
|
To consume messages from a topic, start a web server in the programming language of your choice and listen on a `POST` endpoint with the route name that corresponds to the topic.
|
||||||
|
|
||||||
|
For example, in order to receive messages for `topic1`, have your endpoint listen on `/topic1`.
|
||||||
|
|
||||||
|
*Note: The following example is written in node, but can be in any programming language*
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
app.post('/topic1', (req, res) => {
|
||||||
|
console.log(req.body)
|
||||||
|
res.status(200).send()
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### Acking a message
|
||||||
|
|
||||||
|
In order to tell Dapr that a message was processed succesfully, return a `200 OK` response:
|
||||||
|
|
||||||
|
```
|
||||||
|
res.status(200).send()
|
||||||
|
```
|
||||||
|
|
||||||
|
### Schedule a message for redelivery
|
||||||
|
|
||||||
|
If Dapr receives any other return status code than `200`, or if your app crashes, Dapr will attempt to redeliver the message following At-Least-Once semantics.
|
Loading…
Reference in New Issue