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

RabbitMQ保留特定路由密钥的最后一条消息,rabbitmq,Rabbitmq,我正在重组我的家庭自动化系统,我的目标是使用RabbitMQ作为数据(天气、灯光、取暖等)的中心入口点,从而远离休息 消息具有以下结构 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 } 或 使用其他数据,例

我正在重组我的家庭自动化系统,我的目标是使用RabbitMQ作为数据(天气、灯光、取暖等)的中心入口点,从而远离休息

消息具有以下结构

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
}

使用其他数据,例如此数据来自何处以及何时生成

所有这些数据都被推送到一个单独的主题交换中,客户机通过独占的自动删除队列绑定到该主题交换

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

另一种方法是创建一个订阅all并将其插入数据库的客户机,客户机首先查询数据库以获取快照,然后开始侦听来自RabbitMQ的更新


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

听起来您需要交换来持久化消息,我认为这在Rabbit中是不可能的。据我所知,流程是exchange接收一个请求并将该消息转发给所有订阅的队列。如果您没有订阅队列,则消息将丢失

如果您真的想避免使用db,并且不介意有一点独特的实现,您可以根据消息类型创建一个备份队列,然后在发布之前,读取并确认来自相应备份Q的消息,然后在新客户端到来时,您可以在不确认的情况下阅读,这样消息将保留给另一个未来的客户端或直到发布者确认。这可能比存储到数据库更复杂


另外,听起来你有一个很酷的项目正在进行。如果您计划将其放在Instructables上,请给我发送一个链接。

听起来您需要交换来持久化消息,我认为这在Rabbit中是不可能的。据我所知,流程是exchange接收一个请求并将该消息转发给所有订阅的队列。如果您没有订阅队列,则消息将丢失

如果您真的想避免使用db,并且不介意有一点独特的实现,您可以根据消息类型创建一个备份队列,然后在发布之前,读取并确认来自相应备份Q的消息,然后在新客户端到来时,您可以在不确认的情况下阅读,这样消息将保留给另一个未来的客户端或直到发布者确认。这可能比存储到数据库更复杂

另外,听起来你有一个很酷的项目正在进行。如果您计划将其放在Instructables上,请给我发送一个链接。

Rabbit MQ没有这个概念(10多年前就已经按计划提到了,现在还没有实现)。不过,AMPS确实如此——它被称为“世界的状态”。

Rabbit MQ没有这一概念(10多年前已按计划提及,但尚未实施)。不过,AMPS确实如此——它被称为“世界的状态”。

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
}