我有一个依靠消息总线和代理将消息和任务从生产者传播到工人的系统。
能够为消息执行真正的发布/子类型通信,这两者都受益。 但是,它也需要传达任务。这些工作应由工作人员完成,并在工作人员完成任务时报告给经纪人。
生产者可以使用MQTT来发布此任务,以便由单个工作人员来承担吗?
在我看来,生产者将发布主题为“ TASK_FOR_USER_A”的任务,并且有X工人订阅了该主题。 然后,MQTT经纪人将确定这是一项任务,并将其选择性地发送给其中一名工作人员。
这可以做到吗,还是超出了Mosquitto之类的MQTT经纪人的范围?
答案 0 :(得分:0)
据我所知,MQTT并非用于此目的。它没有任何内部工作可将任务分配给工人(消费者)。另一方面,可以在此处使用AMQP。一种破解方法是限制工人仅接受特定类型的任务,但这也需要生产者发送任务类型。在这种情况下,您将无法进行扩展。
最好针对这种用例探索其他协议。
答案 1 :(得分:0)
MQTT v5具有一个称为“共享订阅”的可选扩展,它将以循环方式将消息传递给一组订户。因此,每封邮件只会传递到该群组中的一个。
Mosquitto v1.6.x已实现MQTT v5和共享订阅功能。
目前尚不清楚您一次收到1条消息的意思。消息将在到达时进行传递,并且代理在将下一条消息传递给组中的下一个订阅者之前,不会等待一个订户完成对消息的处理。
如果您对客户端的控制不足,则可以阻止较高的QOS响应,以防止客户端确认消息,并强制代理一次只允许发送一条消息,这将有效地限制消息传递,但是只有在消息处理非常快时才能执行此操作,以防止代理确定传递失败并尝试将消息传递到共享组中的另一个客户端。
通常,代理不会根据主题进行超出和超出该范围的任何路由。如对this的评论中所述,Flespi已实现了“粘性会话”,以便来自特定发布者的消息将被传递到共享订阅池中的同一客户端,但这是自定义的附加组件,而不是规范的一部分。
答案 2 :(得分:0)
您正在寻找的是针对生产者/消费者方案的消息代理。 MQTT是基于发布/订阅模型的轻量级消息传递协议。如果您为此开始使用任何MQTT代理,则可能会遇到问题,具体取决于您的用例。列出几个问题:
您需要对消息进行排序(消费者必须以生产者发布消息的相同顺序来获取消息)。虽然QoS 2在没有共享订阅的情况下保证消息顺序,但是共享订阅并不能提供有序的主题保证。
消费者获取消息,但是在处理消息之前失败,并且MQTT代理已确认消息传递。在这种情况下,使用者需要专门处理失败消息的重新处理。
如果一个主题涉及多个订阅者,则您的消费者必须具有幂等性。
我建议选择适合此目的的消息代理,例如卡夫卡,RabbitMQ仅举几例。