【问题标题】:Are there any standard messaging protocols that are pull based?是否有任何基于拉取的标准消息传递协议?
【发布时间】:2019-01-23 00:35:28
【问题描述】:

有几种基于推送的消息传递标准(例如 MQTT、STORM)。是否有任何基于拉取的消息传递协议?

用例:

A 公司目前提供支持多个主题的 MQTT 端点。当事件发布到主题时,MQTT 服务器将事件推送给所有订阅者。

但是,A公司希望解决一些缺点:

  • 当新订阅者注册以接收发布到某个主题的事件时,她希望接收曾经发布到该主题的所有消息。
  • 只要有一个“热门”主题,即在短时间内向该主题发布大量事件,将这些事件分派给已注册的订阅者可能会使订阅者不堪重负。因此,订阅者希望按照自己的节奏从主题中提取事件。

当前解决方案:

公司 A 公开了一个 HTTP 端点,该端点具有检索事件的 get-event 操作(例如,编号为 10345671034578 在下面的 curl 调用中发布到名为 some-hot-topic 的主题):

curl http://pull.company-a.com/get-events?topic=some-hot-topic&start-at=1034567&stop-at=1034578

问题:

A 公司需要定义 URL 的格式和响应负载的格式,而不是构建这个单独的解决方案,A 公司可以使用任何已经定义这些的标准来解决问题(该标准确实不必基于 HTTP)。

我想到了一些事情(例如,Kafka Consumer REST APIRSS),它们在不同的上下文中解决了类似的问题,但似乎没有任何定义旨在为基于拉的事件提供标准的目的通知协议。

【问题讨论】:

    标签: messaging kafka-consumer-api architectural-patterns


    【解决方案1】:

    我有一些想法如何使用 Kafka 来实现。我对 MQTT 没有任何经验,所以也许在那里可以实现相同的目标。

    1. Kafka 消费者有一个偏移量 - 它控制消费者从队列接收新消息的当前位置。当组中的消费者从协调器分配的分区中读取消息时,它必须提交与其已读取消息对应的偏移量。因此,据我了解,您的新消费者可以从一开始就开始阅读,从而接收所有消息。您需要阅读有关 Kafka 分区、消费者组和偏移量的更多信息以更好地理解它。
    2. 如果假设您在短时间内消耗了 100 个事件,我想您可以停止消耗新事件。因此,您将有一些时间来处理它。然后你就可以恢复你的消费者了。

    更多关于 Kafka 消费者的信息https://docs.confluent.io/current/clients/consumer.html

    还有一些关于 SO https://stackoverflow.com/a/32392174/574475 中的 Kafka 偏移的很好的讨论

    【讨论】:

    • 问题不在于它是否可以用 Kafka 完成。但是,如果有一个标准(可能是一个 REST API),所有 Kafka 代理都必须实现才能被使用?他们确实有一个,但似乎没有经过任何标准化。
    • 不,没有任何官方的 Kafka HTTP API。 Kafka 本身为发布者/消费者提供了自己的协议——这是 Kafka 消息队列的主要思想。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 2011-03-19
    • 2012-10-28
    相关资源
    最近更新 更多