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”的队列,一切正常。