RabbitMQ 的 Dapr 绑定无法使用 Dapr pub/sub 示例
Dapr binding for RabbitMQ not working using Dapr pub/sub sample
我已经使用 Dapr pub/sub How-to sample 并尝试更新它以使用 RabbitMQ
我已经从 DockerHub 下载了 Docker rabbitmq:3 图像,它应该在 amqp://localhost:5672 上监听。
我为 RabbitMQ 创建了一个名为 rabbitmq.yaml 的新组件文件,并将其放在 .dapr/components 目录中。我的 RabbitMQ 组件配置是:
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: my-rabbitmq
spec:
type: pubsub.rabbitmq
version: v1
metadata:
- name: host
value: amqp://localhost:5672
- name: durable
value: true # Optional. Default: "false"
- name: deletedWhenUnused
value: false # Optional. Default: "false"
- name: ttlInSeconds
value: 60
- name: prefetchCount
value: 0
我的订阅在 subscription-rabbitmq.yaml 中定义,位于相同的 .dapr/components 目录中。它看起来如下:
apiVersion: dapr.io/v1alpha1
kind: Subscription
metadata:
name: rabbitmq-subscription
spec:
topic: deathStarStatus
route: /dsstatus
pubsubname: my-rabbitmq
scopes:
- app2
当我 运行 使用 Redis Streams 组件和订阅的示例时,节点应用程序接收消息并显示在 dapr 运行 命令的输出中。
dapr publish --topic deathStarStatus --pubsub pubsub --data '{ "message": "This is a test" }'
但是当我向 RabbitMQ 发布消息时,它显示“事件发布成功”,但是节点应用程序没有收到消息。
dapr publish --topic deathStarStatus --pubsub my-rabbitmq --data '{ "message": "This is a test" }'
这是节点应用程序和 运行 它的命令:
dapr run --app-id app2 --app-port 3000 node app2.js
const express = require('express')
const bodyParser = require('body-parser')
const app = express()
app.use(bodyParser.json({ type: 'application/*+json' }));
const port = 3000
// app.get('/dapr/subscribe', (req, res) => {
// res.json([
// {
// pubsubname: "my-rabbitmq",
// topic: "deathStarStatus",
// route: "dsstatus"
// }
// ]);
// })
app.post('/dsstatus', (req, res) => {
console.log(req.body);
res.sendStatus(200);
});
app.listen(port, () => console.log(`consumer app listening on port ${port}!`))
我做错了什么?
事实证明,RabbitMQ(Dapr 世界)中的“主题”实际上是一个 Exchange 而不是 Queue。
当 运行“app2”订阅 RabbitMQ 时,会创建一个带有前置 appid(例如 {appid}-{queueName})的队列,但不会创建 Exchange。不确定这是设计使然还是我的特定配置。
我最终创建了一个名为“deathStarStatus”的 Exchange,并将该 Exchange 映射到我名为“app2-deathStarStatus”的队列,一切正常。
我已经使用 Dapr pub/sub How-to sample 并尝试更新它以使用 RabbitMQ
我已经从 DockerHub 下载了 Docker rabbitmq:3 图像,它应该在 amqp://localhost:5672 上监听。
我为 RabbitMQ 创建了一个名为 rabbitmq.yaml 的新组件文件,并将其放在 .dapr/components 目录中。我的 RabbitMQ 组件配置是:
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: my-rabbitmq
spec:
type: pubsub.rabbitmq
version: v1
metadata:
- name: host
value: amqp://localhost:5672
- name: durable
value: true # Optional. Default: "false"
- name: deletedWhenUnused
value: false # Optional. Default: "false"
- name: ttlInSeconds
value: 60
- name: prefetchCount
value: 0
我的订阅在 subscription-rabbitmq.yaml 中定义,位于相同的 .dapr/components 目录中。它看起来如下:
apiVersion: dapr.io/v1alpha1
kind: Subscription
metadata:
name: rabbitmq-subscription
spec:
topic: deathStarStatus
route: /dsstatus
pubsubname: my-rabbitmq
scopes:
- app2
当我 运行 使用 Redis Streams 组件和订阅的示例时,节点应用程序接收消息并显示在 dapr 运行 命令的输出中。
dapr publish --topic deathStarStatus --pubsub pubsub --data '{ "message": "This is a test" }'
但是当我向 RabbitMQ 发布消息时,它显示“事件发布成功”,但是节点应用程序没有收到消息。
dapr publish --topic deathStarStatus --pubsub my-rabbitmq --data '{ "message": "This is a test" }'
这是节点应用程序和 运行 它的命令:
dapr run --app-id app2 --app-port 3000 node app2.js
const express = require('express')
const bodyParser = require('body-parser')
const app = express()
app.use(bodyParser.json({ type: 'application/*+json' }));
const port = 3000
// app.get('/dapr/subscribe', (req, res) => {
// res.json([
// {
// pubsubname: "my-rabbitmq",
// topic: "deathStarStatus",
// route: "dsstatus"
// }
// ]);
// })
app.post('/dsstatus', (req, res) => {
console.log(req.body);
res.sendStatus(200);
});
app.listen(port, () => console.log(`consumer app listening on port ${port}!`))
我做错了什么?
事实证明,RabbitMQ(Dapr 世界)中的“主题”实际上是一个 Exchange 而不是 Queue。
当 运行“app2”订阅 RabbitMQ 时,会创建一个带有前置 appid(例如 {appid}-{queueName})的队列,但不会创建 Exchange。不确定这是设计使然还是我的特定配置。
我最终创建了一个名为“deathStarStatus”的 Exchange,并将该 Exchange 映射到我名为“app2-deathStarStatus”的队列,一切正常。