Kafka 在分布式系统中的 7 大应用场景
Kafka 介绍
Kafka 是一个开源的分布式流式平台,它可以处理大量的实时数据,并提供高吞吐量,低延迟,高可靠性和高可扩展性。Kafka 的核心组件包括生产者(Producer),消费者(Consumer),主题(Topic),分区(Partition),副本(Replica),日志(Log),偏移量(Offset)和代理(Broker)。Kafka 的主要特点有:
- 数据磁盘持久化:Kafka 将消息直接写入到磁盘,而不依赖于内存缓存,从而提高了数据的持久性和容错性。
- 零拷贝:Kafka 利用操作系统的零拷贝特性,减少了数据在内核空间和用户空间之间的复制,降低了 CPU 和内存的开销。
- 数据批量发送:Kafka 支持生产者和消费者批量发送和接收数据,减少了网络请求的次数和开销。
- 数据压缩:Kafka 支持多种压缩算法,如 gzip,snappy,lz4 等,可以有效地减少数据的大小和传输时间。
- 主题划分为多个分区:Kafka 将一个主题划分为多个分区,每个分区是一个有序的消息队列,分区之间可以并行地读写数据,提高了系统的并发能力。
- 分区副本机制:Kafka 为每个分区设置多个副本,分布在不同的代理节点上,保证了数据的冗余和一致性。其中一个副本被选为领导者(Leader),负责处理该分区的读写请求,其他副本为追随者(Follower),负责从领导者同步数据,并在领导者失效时进行故障转移。
Kafka 最初是为分布式系统中海量日志处理而设计的。它可以通过持久化功能将消息保存到磁盘直到过期,并让消费者按照自己的节奏提取消息。与它的前辈不同(RabbitMQ、ActiveMQ),Kafka 不仅仅是一个消息队列,它还是一个开源的分布式流处理平台。
Kafka 的应用场景
Kafka 作为一款热门的消息队列中间件,具备高效可靠的消息异步传递机制,主要用于不同系统间的数据交流和传递。下面给大家介绍一下 Kafka 在分布式系统中的 7 个常用应用场景。
- 日志处理与分析
- 推荐数据流
- 系统监控与报警
- CDC(数据变更捕获)
- 系统迁移
- 事件溯源
- 消息队列
1. 日志处理与分析
日志收集是 Kafka 最初的设计目标之一,也是最常见的应用场景之一。可以用 Kafka 收集各种服务的日志,如 web 服务器、服务器日志、数据库服务器等,通过 Kafka 以统一接口服务的方式开放给各种消费者,例如 Flink、Hadoop、Hbase、ElasticSearch 等。这样可以实现分布式系统中海量日志数据的处理与分析。
下图是一张典型的 ELK(Elastic-Logstash-Kibana)分布式日志采集架构。
- 购物车服务将日志数据写在 log 文件中。
- Logstash 读取日志文件发送到 Kafka 的日志主题中。
- ElasticSearch 订阅日志主题,建立日志索引,保存日志数据。
- 开发者通过 Kibana 连接到 ElasticSeach 即可查询其日志索引内容。
2. 推荐数据流
流式处理是 Kafka 在大数据领域的重要应用场景之一。可以用 Kafka 作为流式处理平台的数据源或数据输出,与 Spark Streaming、Storm、Flink 等框架进行集成,实现对实时数据的处理和分析,如过滤、转换、聚合、窗口、连接等。
淘宝、京东这样的线上商城网站会通过用户过去的一些行为(点击、浏览、购买等)来和相似的用户计算用户相似度,以此来给用户推荐可能感兴趣的商品。
下图展示了常见推荐系统的工作流程。
- 将用户的点击流数据发送到 Kafka 中。
- Flink 读取 Kafka 中的流数据实时写入数据湖中其进行聚合处理。
- 机器学习使用来自数据湖的聚合数据进行训练,算法工程师也会对推荐模型进行调整。
这样推荐系统就能够持续改进对每个用户的推荐相关性。
3. 系统监控与报警
Kafka 常用于传输监控指标数据。例如,大一点的分布式系统中有数百台服务器的 CPU 利用率、内存使用情况、磁盘使用率、流量使用等指标可以发布到 Kafka。然后,监控应用程序可以使用这些指标来进行实时可视化、警报和异常检测。
下图展示了常见监控报警系统的工作流程。
- 采集器(agent)读取购物车指标发送到 Kafka 中。
- Flink 读取 Kafka 中的指标数据进行聚合处理。
- 实时监控系统和报警系统读取聚合数据作展示以及报警处理。
4. CDC(数据变更捕获)
CDC(数据变更捕获)用来将数据库中的发生的更改以流的形式传输到其他系统以进行复制或者缓存以及索引更新等。
Kafka 中有一个连接器组件可以支持 CDC 功能,它需要和具体的数据源结合起来使用。数据源可以分成两种:源数据源( data source ,也叫作“源系统”)和目标数据源( Data Sink ,也叫作“目标系统”)。Kafka 连接器和源系统一起使用时,它会将源系统的数据导人到 Kafka 集群。Kafka 连接器和目标系统一起使用时,它会将 Kafka 集群的数据导人到目标系统。
下图展示了常见 CDC 系统的工作流程。
- 源数据源将事务日志发送到 Kafka。
- Kafka 的连接器将事务日志写入目标数据源。
- 目标数据源包含 ElasticSearch、Redis、备份数据源等。
5. 系统迁移
Kafka 可以用来作为老系统升级到新系统过程中的消息传递中间件(Kafka),以此来降低迁移风险。
例如,在一个老系统中,有购物车 V1、订单 V1、支付 V1 三个服务,现在我们需要将订单 V1 服务升级到订单 V2 服务。
下图展示了老系统迁移到新系统的工作流程。
- 先将老的订单 V1 服务进行改造接入 Kafka,并将输出结果写入 ORDER 主题。
- 新的订单 V2 服务接入 Kafka 并将输出结果写入 ORDERNEW 主题。
- 对账服务订阅 ORDER 和 ORDERNEW 两个主题并进行比较。如果它们的输出结构相同,则新服务通过测试。
6. 事件溯源
事件溯源是 Kafka 在微服务架构中的重要应用场景之一。可以用 Kafka 记录微服务间的事件,如订单创建、支付完成、发货通知等。这些事件可以被其他微服务订阅和消费,实现业务逻辑的协调和同步。
简单来说事件溯源就是将这些事件通过持久化存储在 Kafka 内部。如果发生任何故障、回滚或需要重放消息,我们都可以随时重新应用 Kafka 中的事件。
7. 消息队列
Kafka 最常见的应用场景就是作为消息队列。 Kafka 提供了一个可靠且可扩展的消息队列,可以处理大量数据。
Kafka 可以实现不同系统间的解耦和异步通信,如订单系统、支付系统、库存系统等。在这个基础上 Kafka 还可以缓存消息,提高系统的可靠性和可用性,并且可以支持多种消费模式,如点对点或发布订阅。
参考资料
- https://levelup.gitconnected.com/top-8-kafka-use-cases-distributed-systems-d47fc733c7c1
- https://blog.bytebytego.com/p/ep76-netflixs-tech-stack
- Apache Kafka Benefits & Use Cases。https://www.confluent.io/learn/apache-kafka-benefits-and-use-cases/
总结
自此本文介绍了 Kafka 在分布式系统中的 7 大应用场景,感谢大家阅读。
关注公众号【waynblog】每周分享技术干货、开源项目、实战经验、国外优质文章翻译等,您的关注将是我的更新动力!
Kafka 在分布式系统中的 7 大应用场景的更多相关文章
- 分布式系统中我们会对一些数据量大的业务进行分拆,分布式系统中唯一主键ID的生成问题
分布式全局唯一ID生成策略 https://www.cnblogs.com/vandusty/p/11462585.html 一.背景 分布式系统中我们会对一些数据量大的业务进行分拆,如:用户表,订 ...
- 菜鸟到大神之多图预警——从 RAID 到分布式系统中的副本分布
我们知道,在面对大规模数据的计算和存储时,有两种处理思路: 垂直扩展(scale up):通过升级单机的硬件,如 CPU.内存.磁盘等,提高计算机的处理能力. 水平扩展(scale out):通过添加 ...
- 【分布式】Zookeeper在大型分布式系统中的应用
一.前言 上一篇博文讲解了Zookeeper的典型应用场景,在大数据时代,各种分布式系统层出不穷,其中,有很多系统都直接或间接使用了Zookeeper,用来解决诸如配置管理.分布式通知/协调.集群管理 ...
- 分布式系统中一些主要的副本更新策略——Dynamo/Cassandra/Riak同时采取了主从式更新的同步+异步类型,以及任意节点更新的策略。
分布式系统中一些主要的副本更新策略. 1.同时更新 类型A:没有任何协议,可能出现多个节点执行顺序交叉导致数据不一致情况. 类型B:通过一致性协议唯一确定不同更新操作的执行顺序,从而保证数据一致性 2 ...
- zookeeper系列(五)zookeeper在大型分布式系统中的应用
作者:leesf 掌控之中,才会成功:掌控之外,注定失败. 出处:http://www.cnblogs.com/leesf456/p/6063694.html 尊重原创感谢博主公开这么好的博文, ...
- 分布式系统中幂等性、at least once 和 at most once 问题
讨论一下分布式系统传输过程中常见的at least once 还是 at most once 问题.一般在一次传输过程中,失败与否是使用最大等待时间(记为time out)来判断是否传输成功,如果超过 ...
- 如何在高并发分布式系统中生成全局唯一Id
月整理出来,有兴趣的园友可以关注下我的博客. 分享原由,最近公司用到,并且在找最合适的方案,希望大家多参与讨论和提出新方案.我和我的小伙伴们也讨论了这个主题,我受益匪浅啊…… 博文示例: 1. ...
- 如何在高并发分布式系统中生成全局唯一Id(转)
http://www.cnblogs.com/heyuquan/p/global-guid-identity-maxId.html 又一个多月没冒泡了,其实最近学了些东西,但是没有安排时间整理成博文, ...
- (转)如何在高并发分布式系统中生成全局唯一Id
又一个多月没冒泡了,其实最近学了些东西,但是没有安排时间整理成博文,后续再奉上.最近还写了一个发邮件的组件以及性能测试请看 <NET开发邮件发送功能的全面教程(含邮件组件源码)> ,还弄了 ...
- 多版本号并发控制(MVCC)在分布式系统中的应用
QQ群:289150599 问题 近期项目中遇到了一个分布式系统的并发控制问题.该问题能够抽象为:某分布式系统由一个数据中心D和若干业务处理中心L1,L2 ... Ln组成:D本质上是一个key-va ...
随机推荐
- 4.4 x64dbg 绕过反调试保护机制
在Windows平台下,应用程序为了保护自己不被调试器调试会通过各种方法限制进程调试自身,通常此类反调试技术会限制我们对其进行软件逆向与漏洞分析,下面是一些常见的反调试保护方法: IsDebugger ...
- Java扩展Nginx之四:远程调试
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<Java扩展Nginx> ...
- linux内核vmlinux的编译过程之 --- vmlinux.o详解(八)
内核构建系统之所以要在链接 vmlinux 之前,去链接出vmlinux.o.其原因并不是要将 vmlinux.o 链接进 vmlinux,而是要在链接 vmlinux.o 的过程中做完两个动作: e ...
- 《最新出炉》系列入门篇-Python+Playwright自动化测试-9-页面(page)
1.简介 通过前边的讲解和学习,细心认真地小伙伴或者童鞋们可能发现在Playwright中,没有Element这个概念,只有Page的概念,Page不仅仅指的是某个页面,例如页面间的跳转等,还包含了所 ...
- Redis和Mysql保持数据一致性
1.简述 在高并发的场景下,大量的请求直接访问Mysql很容易造成性能问题.所以,我们都会用Redis来做数据的缓存,削减对数据库的请求.但是,Mysql和Redis是两种不同的数据库,如何保证不 ...
- 使用Docker安装Apollo并使用SpringBoot连接配置中心
上篇文章我们学习了Apollo的本地安装,如果还不会本地安装的朋友可以查看之前的文章进行了解和学习链接地址(https://www.cnblogs.com/eternality/p/17583023. ...
- 信创啊,信创。Solon 的 war 包,现在同时支持 jakarta.servlet(及 javax.servlet)容器了!
Solon 是个神奇的项目,不是基于 Servlet 的.但是又很支持 Servlet,尤其是 war 包.打起来还挺方便的. 如果你是做信创的(听说,很多信创项目是用 war 部署到 tomcat ...
- [golang]使用gocron编写定时任务
前言 linux自带的crontab默认情况下只能精确到分钟,没法执行秒级任务.当然,也不是不行,比如: * * * * * for i in $(seq 1 11);do echo hello &g ...
- 理解linux的CPU上下文切换
前言 linux是一个多任务操作系统,它支持远大于CPU数量的任务同时运行.当然,这个同时运行不是真的同时运行,而是系统在很短的时间内轮流分配CPU资源,由于CPU的速度很快,所以给人一种同时运行的错 ...
- .NET周刊【8月第2期 2023-08-14】
本周由于Myuki大佬感染新冠,国际板块暂停更新一周,将在下周补齐,所以本周只有国内板块. 国内文章 解决 Blazor 中因标签换行导致的行内元素空隙问题 https://www.cnblogs.c ...