【问题标题】:Spring-Kafka vs. Spring-Cloud-Stream (Kafka)Spring-Kafka 与 Spring-Cloud-Stream (Kafka)
【发布时间】:2018-04-28 23:32:52
【问题描述】:

在微服务架构中使用 Kafka 作为消息系统 使用 spring-kafka 与 spring-cloud-stream + spring-cloud-starter-stream-kafka 有什么好处?

Spring Cloud Stream 框架支持更多的消息系统,因此具有更模块化的设计。但是功能呢? spring-kafka 和 spring-cloud-stream + spring-cloud-starter-stream-kafka 的功能有差距吗? 哪个 API 设计得更好?

期待阅读您的意见

【问题讨论】:

  • 也许我还没有说清楚,但是想要了解功能方面的差距是您无法轻松提取阅读文档的内容。库/框架的基础和 API 可能不同,但它们提供相同的功能吗?例如:仅使用 kafka 时 spring-kafka API/功能是否更丰富?
  • 嗯,它们每个都有不同的目的。很难很快回答。有关更多信息,请参阅他们的项目页面:projects.spring.io/spring-integration、projects.spring.io/spring-kafka、cloud.spring.io/spring-cloud-stream
  • 我知道使用活页夹概念的优势,但我只是问自己是否需要权衡,因为它建立在 spring-kafka 之上并使用它自己的 API。 spring-kafka 中每个即将推出的新功能都以某种方式“映射”在 spring 云流的概念中。此外,API 必须支持多个 binder,例如 rabbitmq,这就是 API 必须更加抽象/通用的原因。如果我错了,请纠正我,但这就是为什么我问自己在功能方面是否存在(或永远存在)差距,以及是否最好简单地使用 spring-kafka
  • 嗯,没错。由于 Binder API 对于任何 Binder 实现都应该尽可能通用,因此目标协议的细节肯定会遗漏一些东西。如果你真的需要一些没有在 Kafka Binder 中实现的东西,那就只使用 Spring Kafka,如果你需要更多地控制消费者投票,那就只使用原始的 Apache Kafka。在大多数流式传输场景中,Spring Cloud Stream 的自动配置就足够了
  • 感谢您的宝贵时间和 cmets!

标签: spring spring-integration spring-cloud-stream spring-kafka


【解决方案1】:

带有 kafka binder 的 Spring Cloud Stream 依赖于 Spring-kafka。所以前者拥有后者支持的所有功能,但前者会更重量级。以下几点可以帮助您做出选择:

  1. 如果您将来可能将 kafka 更改为另一个消息中间件,那么 Spring Cloud 流应该是您的选择,因为它隐藏了 kafka 的实现细节。
  2. 如果你想将其他消息中间件与kafka集成,那么你应该选择Spring Cloud Stream,因为它的卖点是让这种集成变得容易。
  3. 如果你想享受简单而不接受性能开销,那么选择 spring-kafka
  4. 如果您计划迁移到 AWS Kensis、Azure EventHub 等公共云服务,请使用 Spring Cloud 系列中的 Spring Cloud Stream。

【讨论】:

  • 你能否详细说明#3 - “如果你想享受简单而不接受性能开销,那么选择 spring-kafka”。我正在寻找 Spring 云流的性能开销?
  • 性能开销是由接收、发送和转换消息格式的额外抽象层引起的。由于spring cloud stream是基于channel抽象的,所以可能有一些channel可以缓冲和缓存消息。但真正的开销应该在你的用例中衡量
  • 我想知道 spring batch 与 spring kafka vs spring cloud stream kafa 的兼容性。我已经找到了将 spring batch 与 spring kafka 一起使用的方法,但没有找到 spring batch stream kafka 的方法
  • 我会鼓励您使用 Spring Cloud Stream 3.0 及更高版本 - 所有关键点均由上面的@WarrenZhu 有效总结,应该会有所帮助。就我个人而言,我真的很喜欢 Spring Cloud Stream,因为它将你的依赖与底层消息传递平台分离,并且结合了 Spring Cloud 功能,你几乎可以让你的生产者/消费者建立在配置之外——所以你可以只专注于编写业务逻辑。我猜它有点进化的框架,但有很多好东西。
【解决方案2】:

在创建系统时使用 Spring Cloud Stream,其中 one 通道用于输入进行一些处理并将其发送到 one 输出渠道。换句话说,它更像是一个 RPC 系统来代替 RESTful API 调用。

如果您打算做一个事件溯源系统,请使用 Spring-Kafka,您可以在其中发布和订阅相同的流。这是 Spring Cloud Stream 不允许您轻松完成的事情,因为它不允许以下操作

public interface EventStream {
    String STREAM = "event_stream";

    @Output(EventStream.STREAM)
    MessageChannel publisher();

    @Input(EventStream.STREAM)
    SubscribableChannel stream();
}

Spring Cloud Stream 可以帮助您避免做的一些事情是:

  • 设置序列化器和反序列化器

【讨论】:

  • 您对 RPC 系统与基于事件溯源的看法如何,请您合作一下吗? Spring Cloud Stream 是消息传递的下一级抽象,但思想和用法是相同的。
  • 我想了解更多,因为我主要使用 kafka 来实现 pub/sub 事件系统。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多