Kafka是一个消息传递系统,它与事件存储有很多相似之处,但引用它们的介绍:
Kafka集群保留所有已发布的消息 - 无论它们是否存在 已消耗 - 的 在一段可配置的时间内 强> 。例如,如果 保留时间设置为两天,然后设置为两天后 消息发布后可供消费,之后就可以了 将被丢弃以释放空间。卡夫卡的表现是有效的 在数据大小方面保持不变,因此保留大量数据不是 问题。
因此,虽然可以无限期地保留消息,但期望它们将被删除。这并不意味着您不能将其用作事件存储,但使用其他东西可能更好。看一眼 EventStore 替代方案。
卡夫卡文件 :
事件源是一种应用程序设计风格,其中状态更改被记录为按时间排序的记录序列。 Kafka对非常大的存储日志数据的支持使其成为以这种风格构建的应用程序的出色后端。
使用Kafka进行事件采购的一个问题是所需主题的数量。通常在事件源中,每个实体(例如用户,产品等)存在事件流(主题)。这样,可以通过重新应用流中的所有事件来重构实体的当前状态。每个Kafka主题由一个或多个分区组成,每个分区都存储为文件系统上的目录。随着znode数量的增加,ZooKeeper也会有压力。
您可以使用Kafka作为事件存储,但我不建议这样做,尽管它可能看起来不错:
所以,在你做出选择之前,你要三思而后行。事件存储作为应用程序层接口(监视和管理),SQL / NoSQL存储和Kafka作为代理的组合是比Kafka处理这两个角色以创建完整功能完整解决方案更好的选择。
事件存储是一项复杂的服务,如果您认真考虑在事件驱动架构中应用事件源,CQRS,Sagas和其他模式并保持高性能,则需要更多Kafka所能提供的服务。
的 随意挑战我的答案! 强> 您可能不喜欢我对您最喜欢的具有大量重叠功能的经纪人所说的话,但Kafka仍然不是设计为事件存储,而是更多地作为高性能代理和缓冲区同时处理快速生产者与慢速消费者场景,例如。
请查看eventuate.io微服务开源框架,以发现有关潜在问题的更多信息: http://eventuate.io/
我没有收录评论中的新信息,但同意其中的一些方面。此更新更多是关于微服务事件驱动平台的一些建议。如果您认真对待微服务稳健设计和最高性能,我将为您提供一些您可能感兴趣的提示。
如果您对性能有疑问,可以将自己与现有的基准测试套件进行比较。 https://github.com/networknt/microservices-framework-benchmark
根本不要使用Kafka :-))这是半开玩笑。我的意思是,虽然卡夫卡很棒,但它是另一个以经纪人为中心的系统。我认为未来是在无需经纪人的邮件系统中。你可能会感到惊讶,但有比Kafka系统更快的速度:-),当然你必须降到更低的水平。看看纪事。
对于事件存储,我建议使用名为TimescaleDB的高级Postgresql扩展,它专注于大容量的高性能时间序列数据处理(事件是时间序列)。当然CQRS,事件采购(重放等功能)都是在light4j框架中构建的,它使用Postgres作为低存储空间。
对于消息传递,请尝试查看Chronicle Queue,Map,Engine,Network。我的意思是摆脱这个 的 老式的经纪人中心 强>解决方案并采用微信息系统(嵌入式系统)。 Chronicle Queue实际上比Kafka更快。但我同意这不是一个解决方案,你需要做一些开发,否则你去购买企业版(付费一个)。最后,通过消除维护Kafka集群的负担,将从Chronicle构建您自己的消息传递层。
我是卡夫卡的原作者之一。 Kafka将作为事件采购的日志工作得非常好。它具有容错能力,可扩展到巨大的数据大小,并具有内置的分区模型。
我们在LinkedIn使用此表单的几个用例。例如,我们的开源流处理系统Apache Samza随附 内置支持 用于事件采购。
我认为你没有太多关于使用Kafka进行事件采购的原因,主要是因为事件采购术语在Kafka最受欢迎的消费者网络空间中似乎并不普遍。
我已经写了一些关于这种卡夫卡用法的文章 这里 。
是的,您可以将Kafka用作活动商店。它运作得很好,特别是在引入时 卡夫卡流 ,它提供了一种Kafka本地方式来处理您的事件累积 说明你可以查询 。
关于:
能够重放事件日志,允许新订户在事后注册系统。
这可能很棘手。我在这里详细介绍了这一点: https://stackoverflow.com/a/48482974/741970
我一直回到这个QA。而且我没有发现现有的答案有细微差别,所以我添加了这个。
我知道有两种主要的事件源系统。
在这种系统中,事件发生在现实世界中并被记录为事实。如仓库系统,以跟踪产品的托盘。基本上没有冲突的事件。一切都已经发生,即使它是错的。 (即,托盘123456放在卡车A上,但是计划用于卡车B.)然后通过报告机制检查事实的异常情况。 Kafka似乎非常适合这种下游事件处理应用程序。
在这种情况下,为什么Kafka人们将其作为事件采购解决方案提倡是可以理解的。因为它与已经使用的方式非常相似,例如,点击流。然而,使用术语事件采购(与流处理相对)的人可能指的是第二种用法......
由于用户请求通过业务逻辑,这种应用程序声明自己的事件。由于两个主要原因,卡夫卡在这种情况下效果不佳。
此方案需要能够为特定实体加载事件流。这样做的常见原因是为业务逻辑构建一个临时写模型,用于处理请求。这样做在卡夫卡是不切实际的。使用每个实体主题可以允许这样做,但是当可能有数千或数百万个实体时,这是非启动性的。这是由于Kafka / Zookeeper的技术限制。建议使用每个类型的主题代替Kafka,但这需要加载事件 每个实体 该类型只是为了获得单个实体的事件。由于您无法通过日志位置判断哪些事件属于哪个实体。即使使用 快照 从已知的日志位置开始,这可能是大量的事件。但快照无法帮助您更改代码。因为向业务逻辑添加新功能可能会使以前的快照在结构上不兼容。因此,在这些情况下仍然需要进行主题重放以构建新模型。使用瞬态写入模型而不是持久性写入模型的主要原因之一是使业务逻辑变更便宜且易于部署。
其次,由于针对同一实体的并发请求,用户可以创建竞争条件。保存冲突事件并在事后解决它们可能是非常不受欢迎的。因此,能够防止冲突事件非常重要。为了扩展请求负载,通常使用无状态服务,同时使用条件写入防止写入冲突(仅在最后一个实体事件为#x时写入)。又名乐观并发。 Kafka不支持乐观并发。即使它在主题级别支持它,它也需要一直到实体级别才能生效。要使用Kafka并防止冲突事件,您需要在应用程序级别使用有状态的序列化编写器。这是一个重要的架构要求/限制。
更多的信息
每条评论更新
该评论已被删除,但问题是:人们用什么来进行事件存储呢?
似乎大多数人在现有数据库之上推出自己的事件存储实现。对于非分布式场景,如内部后端或独立产品,它是 充分证明 如何创建基于SQL的事件存储。并且在各种数据库之上有可用的库。还有EventStore,它是为此目的而构建的。
在分布式场景中,我看到了几种不同的实现。李连杰的 Panther项目使用Azure CosmosDB ,使用Change Feed通知听众的功能。我在AWS上听到的另一个类似的实现是使用DynamoDB及其Streams功能来通知侦听器。分区键可能应该是用于最佳数据分发的流ID(以减少过度配置的数量)。但是,在Dynamo中跨流的完整重播是昂贵的(阅读和成本方面)。因此,这个impl也被设置为Dynamo Streams将事件转储到S3。当一个新的监听器上线,或者一个现有的监听器想要一个完整的重放时,它会先读取S3以便赶上。
我目前的项目是一个多租户场景,我在Postgres上推出了自己的项目。像Citus这样的东西似乎适合于可扩展性,可以通过tentant + stream进行分区。
Kafka在分布式场景中仍然非常有用。将每个服务的事件暴露给其他服务是一个非常重要的问题。事件存储不是为此而构建的,但这正是Kafka所做的。每个服务都有自己的内部事实来源(可能是事件存储或其他),但是听听Kafka知道“外部”发生了什么。该团队还可以将其服务活动发布到Kafka,以告知服务所做的有趣事情的“外部”。