RabbitMQ保留特定路由密钥的最后一条消息

时间:2017-10-18 18:07:37

标签: rabbitmq

我正在重建我的家庭自动化,我的目标是使用RabbitMQ作为数据(天气,灯光,供暖......)的中心入口点,远离REST。

消息具有以下结构

routing key: mcu.le.d8.w1.terrasse.BA1
{
  "DS18B20": {
    "T1": 14.75,
    "T2": 14.56
  },
  "HYT221": {
    "H": 73.2,
    "T": 14.23
  },
  "LDR": 53,
  "T": 14.66
}

routing key: weather.wetter.now
{
  "from": "19:30",
  "from-ts": 1508347800,
  "local": "2017-10-18 19:59:00",
  "sunrise": "07:49",
  "sunrise-ts": 1508305740,
  "sunset": "18:27",
  "sunset-ts": 1508344020,
  "temp": 14.1,
  "text": "klar",
  "wind-direction": 270,
  "wind-speed": 2.5
}

包含其他数据,例如此数据的来源和生成时间。

所有这些数据都被推送到一个主题交换中,客户端绑定到独占的auto_deleting队列。

我想要的是当新客户端连接并创建/绑定队列时,每个路由密钥的最后一条消息被发送到客户端,以便客户端获得每个路由密钥的最新状态订阅时订阅。

另一种方法是创建一个订阅所有客户端并将其插入数据库的客户端,客户端首先查询数据库以获取快照,然后开始从RabbitMQ收听更新。

有没有一种方法可以在没有数据库的情况下执行此操作,仅在RabbitMQ中?我不想存储所有消息,只存储每个路由密钥的最后一条消息。

2 个答案:

答案 0 :(得分:0)

听起来你需要交换来持久留言,我认为兔子不可能。根据我的理解,流程是交换机接收请求并将该消息转发给所有订阅的队列。如果您没有订阅队列,则消息将丢失。

如果你真的想避开数据库并且不介意一些独特的实现,你可以为每种消息类型创建一个备份队列,然后在发布,阅读和确认消息之前从相应的备份Q开始,然后当新客户端进入时,您可以阅读而不确认,以便该邮件将保留给另一个未来的客户端,或者直到发布者确认为止。这可能比存储到数据库更复杂,但是......

P.S。听起来你有一个很酷的项目。如果您打算将它放在Instructables上,请给我发一个链接。

答案 1 :(得分:0)

Rabbit MQ 没有这个概念(10 多年前就按计划提到了,现在还没有实现)。 AMPS 确实如此 - 它被称为“世界状态”。 http://devnull.crankuptheamps.com/documentation/html/5.2.1.0/user-guide/html/chapters/sow.html