Apache kafka 发布/订阅和消费者感知发布。无人订阅时停止生产

Apache kafka 发布/订阅和消费者感知发布。无人订阅时停止生产,apache-kafka,architecture,publish-subscribe,Apache Kafka,Architecture,Publish Subscribe,我试图找到一个支持以下用例的消息传递系统 生产者注册主题名称空间 客户端订阅主题 第一个客户端触发生产者开始生产的通知 订阅同一主题的新客户端接收数据(可能合并,类似于RX世界中的热/冷观测) 当最后一个客户离开、取消订阅或崩溃时,通知制作人停止制作该主题 我知道,根据《经济学》的定义,生产者被定义为幸福地不知道消费者的存在,这意味着我的用例根本不符合pub/sub范式 到目前为止,我已经研究过卡夫卡、Redis、NATS.io和Amazon SQS,但没有太大成功。我一直在想一些可能的方法来解

我试图找到一个支持以下用例的消息传递系统

  • 生产者注册主题名称空间
  • 客户端订阅主题
  • 第一个客户端触发生产者开始生产的通知
  • 订阅同一主题的新客户端接收数据(可能合并,类似于RX世界中的热/冷观测)
  • 当最后一个客户离开、取消订阅或崩溃时,通知制作人停止制作该主题
  • 我知道,根据《经济学》的定义,生产者被定义为幸福地不知道消费者的存在,这意味着我的用例根本不符合pub/sub范式

    到目前为止,我已经研究过卡夫卡、Redis、NATS.io和Amazon SQS,但没有太大成功。我一直在想一些可能的方法来解决这个问题,但是还没有找到任何能满足我需求的方法

    对于bullet 2)来说,脑海中浮现的一个选项是将a建模为NATS页面上详细介绍的其他amongs,让制作人听取客户的意见。然后,客户机将向系统发布一条“订阅”消息,生产者将从通配符订阅中获取该消息。然而,这留下了一个大问题,那就是取消订阅。假设消费者停止了,发布一条取消订阅的消息,就像订阅一样。但在发生碰撞或类似情况时,这将不起作用

    如果有任何想法、参考资料或架构模式/最佳实践能够满足上述要求,我将不胜感激

    在过去的一周里,我做了很多研究,但没有发现任何令人满意的问答或文章。要么我完全错了,要么似乎没有太多让我吃惊的东西,这似乎是一个相当常见的场景,适用于许多领域

    提前谢谢 克里斯

    //编辑

    我手头的一个实际的简单用例是股票报价分布

    • 引文来自外部来源
    • 当第一个最终用户查看股票A时,从外部系统订阅股票A报价
    • 当不再有终端用户查看股票时,停止从外部系统接收股票报价

    我没有考虑任何基于消息消费者的发布。最糟糕的是,你需要一种心跳机制来处理消费者崩溃

    这是我的两分钱,不是sue,如果你正在寻找一个现成的解决方案,但是如果不是,你可以将你的应用程序包装在zookeeper集群中来处理你的所有用例。 只需在短暂节点上使用观察者来检查何时没有更多的消费者(包括崩溃),并在“消费者”路径周围放置一些观察者,以便在获得消费者时进行广告

    消费者方面,无论何时启动zk节点ID,都必须注册它。 这样做并不复杂,zk并不是唯一的解决方案,您也可以使用其他一致性技术

    zookeeper的开始:

    (强烈建议使用curator api,该api可顺利处理大量食谱)


    Yannick

    不幸的是,您没有指定您试图用这些需求解决的业务用例。从它的声音来看,你想要的不是发布/订阅系统,而是一个编排系统

    我建议查看能够支持您列出的需求和更多编排用例的

    下面是一个符合您需求的strawman设计:

    • 任何新订阅者都会向工作流发送一个事件,其中TopicName作为要订阅的workflowID。如果给定ID的工作流不存在,它将自动启动
    • 任何订阅都会发送另一个取消订阅的信号
    • 没有订阅服务器时,工作流将退出
    • Publisher向工作流发送事件以传递给订阅服务器
    • 工作流使用活动将事件传递给订阅服务器
    • 如果具有给定TopicName的工作流未运行发布事件,它将失败
    与使用队列进行任务处理相比,Cadence提供了许多其他优势

    • 构建了无限过期时间间隔的指数重试
    • 故障处理。例如,它允许执行一个任务,当两个更新在配置的时间间隔内都无法成功时,通知另一个服务
    • 支持长时间运行的心跳操作
    • 能够实现复杂的任务依赖关系。例如,在发生无法恢复的故障时实现调用链接或补偿逻辑()
    • 提供对更新当前状态的完全可见性。例如,在使用队列时,如果队列中有一些消息,您就知道所有这些消息,并且您需要额外的数据库来跟踪总体进度。每一个事件都有节奏地记录下来
    • 能够取消飞行中的更新
    • 分布式CRON支持

    请参阅Cadence编程模型。RabbitMQ具有可用于的内部事件。事件(如
    consumer.created
    consumer.deleted
    )可用于触发服务器级别的某些操作:例如,使用RabbitMQ检查剩余的使用者数量,并根据您的用例采取关闭主题等操作。

    Yeah,理想情况下,这将是一个开箱即用的解决方案,我不必自己进行订阅管理/重新计算。但是谢谢,我会看看Zookeeper API,看看能在上面构建什么。从来没有想过使用它不仅仅是为了满足卡夫卡的一个需求:)谢谢你的链接,我有空的时候会看一看。另外,在原始问题中添加一个用例,我将使用Cadence进行订阅管理,但是pas报价直接通过内存流或外部系统(如Kafka)进行传输。是的,这就是e