【问题标题】:Kafka consumer and a web server simultaneously, thread blocking problem microserviceKafka消费者和Web服务器同时,线程阻塞问题微服务
【发布时间】:2021-10-23 12:06:15
【问题描述】:

假设: api-gateway 后面有微服务,它们通过 HTTP 同步通信。显然,这些微服务中的每一个都是一个 Web 服务器。现在我希望我的微服务也能扮演 Kafka 生产者和“消费者”的角色。更清楚地说,我的微服务产生事件并为其他事件监听一些主题。

问题: 似乎传统上 Kafka 消费者使用无限循环来轮询消息并保持活动状态(发送心跳)我的进程线程正忙于为主机提供服务,并且不能被无限循环锁定。有没有办法像脉冲星侦听器或兔子一样以某种方式“收听”主题而不会阻塞线程? 由于我在开发过程中必须处理的技术复杂性,我不希望将我的 Web 服务器和消费者处理器分开。在这种情况下我可以使用 Kafka 流吗?我的假设有问题吗?

【问题讨论】:

    标签: multithreading apache-kafka thread-safety microservices kafka-consumer-api


    【解决方案1】:

    即使使用 Clojure,也只需像 https://github.com/gklijs/bkes-demo/blob/main/topology/src/nl/openweb/topology/client.clj 或现在的几个 Clojure 客户端中的任何一个一样抽象出线程。如果你很疯狂,你可以使用 core.async。

    【讨论】:

      【解决方案2】:

      你可以把你的消费者放在它自己的线程中。

      假设你提到了 Kafka Streams,那么如果你使用 Quarkus、Micronaut、Spring-Kafka、Reactor、Vertx 或类似的 Java Web 框架,它们也有 Kafka 连接器,那么它们就是这样做的。如果您没有使用基本 Jersey 之外的 Web 框架,您可能应该使用。

      【讨论】:

      • 是的,伙计,我正在使用 Clojure,正如我所提到的,我不想将它们分开,因为增加了您提到的那些工具的复杂性,需要其他工具,以及管理单独服务等其他注意事项(又名容器)等。我更喜欢消费者(及其处理功能)和网络服务器在一个线程中以某种方式。启动拓扑时,Kafka 流会阻塞主线程吗?
      • Kafka Streams 只是消费者 API 之上的一层。但是,线程在后台,是的。这种“复杂性”让您可以对代码进行检测,例如在出现问题时添加有用的指标和日志(您不需要容器)
      • 是的,你是对的,有一个权衡,如果资源短缺,培训人员,以及关于容器的全新开发堆栈等,我们可能会失去一些:如果我的消费者完全是一个单独的 jar(比如我的网络服务器)我应该把它放在哪里以便我可以管理它?如果消费者崩溃或发生什么,谁会运行一个新实例?
      • 如果消费者 JAR 在类路径中,您可以像其他任何东西一样从 main 启动它,并使用您的框架提供的任何工具来监视失败的任务并重试。
      • @Gho 容器和独立 jar 需要以相同的方式进行监控 - 使用 JMX 指标收集。我不明白你所说的“放在哪里”是什么意思
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      • 2018-10-31
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多