查看: 11466| 回复: 27
跳转到指定楼层
上一主题 下一主题
收起左侧

[经验总结] 系统设计|Kafka相关!

   
全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
本帖打算持续更新有关kafka的技术细节,先写点kafka常见的应用场景及特点,以及面试有可能会问到的问题。在系统设计面试(或聊简历项目过程)中,亦可参考本帖内容给出选型使用kafka的优点和对比其他消息队列的长处和不足(主要对比rabbitmq)。楼主本人也在学习过程中,如果内容有瑕疵,请各位大佬指正!

首先Kafka并不像rabbitmq/activemq等中间件通过实现交换机和任务队列等来实现消息队列,Kafka是一个streaming system,最开始的主要用途是流处理。任务通过写入日志(可以理解为将任务写入磁盘文件系统)来进行储存,消费者通过使用offset,顺序读文件来实现类似于消息队列的功能。

a. why kafka? - high throughput (高吞吐量)
高吞吐量是如何实现的:
1. 日志顺序读写。通常来讲,访问内存比访问磁盘文件快很多,然而也有特例。随机访问磁盘很慢,但顺序访问磁盘文件,效率未必会低于内存。
2. 日志分区:靠多partition来实现并行
3. 批量发送和接受,消费者可以主动pull消息by batch,同时支持数据压缩(例如gzip)以减少网络通讯的花销
4. 零拷贝:这条最关键。通常来讲,数据从一个服务端磁盘读取,发送给另一个客户端,需要经历以下过程:在操作系统的kernel space,内核读取磁盘中的文件,写入内核缓冲区,之后上下文切换到user space,user space的buffer拿到数据,然后在由user space重新发给kernel space的socket缓冲区,然后在经过网卡等网络传输过程传给消费者(客户端)。在这个过程中,经历了两次拷贝,同时又经历了两次上下文切换(context swicth),学过操作系统的朋友们都知道,上下文切换的花销是非常高的,因此这么做效率非常低。
kafka所做的是,底层使用linux sendfile()函数,直接讲文件从内核缓冲区发给网络接口,中间没有任何拷贝和上下文切换过程,因此效率很高。

总体来说:(我认为)最主要的两点是:零拷贝和顺序读取

b. kafka的特性
1. 使用pub/sub的模式来实现消息传输,同时支持topic。(rabbitmq等服务支持更多的规则)
2. 单个partition中消息是有序的
3. 可以重新消费历史数据(因为是使用日志来保存消息的,只要日志还在,就可以重新去消费已经处理过的消息)
4. 待补充

c. 应用场景
1. 日志收集 + 分析

2. 消息队列 (对消息顺序不在意的场景,例如订单)

3. 运营指标监控,用户行为追踪.......

d. 消费者
1. 消费者以组为单位
2. 单个parition只能被组中的一个消费者使用,不能多个消费者订阅一个partition
3. 单个消费者可以订阅多个partition
第二点第三点有点绕,举个例子,你有五个partition,六个消费者,正确做法是只使用其中五个消费者,各自连接五个partition

先写这些。。下次再补充producer相关的内容





补充内容 (2021-05-21 05:02 +8:00):
先总结了两个问题的回答,在24楼

补充内容 (2021-05-22 10:17 +8:00):
更新producer,在25楼

评分

参与人数 38大米 +59 收起 理由
Myron2017 + 3 给你点个赞!
qwert000 + 1 赞一个!
zzxgz + 1 赞一个
dontworry + 2 赞一个!
JerryLi + 1 很好的知识分享!

查看全部评分


上一篇:Commerce Cloud API Design
下一篇:Pattern of Distributed Systems

本帖被以下淘专辑推荐:

  • · 面试|主题: 25, 订阅: 0
全局:
到我的收藏夹吃灰吧
回复

使用道具 举报

推荐
tiancaihb 2021-5-20 17:30:10 | 只看该作者
全局:
ymsfd007 发表于 2021-5-20 14:48
谢谢!

不知道kafka的业界应用趋势如何,有什么痛点吗?

不知道整个业界的情况,感觉为了让这么一个很底层的系统高可用,需要有一些运营的经验和工具。
kafka本身没有processing的功能,要靠其他建立在它上面的系统吧。可能不太擅长batch processing?它本身只是一个相对单一的组件。
另外你说的那些应用,恐怕还要靠对应专门的系统。kafka只是作为一个消息管道。一般好像也不会把kafka作为长期的存储,至少我知道retention大了之后operations会麻烦。
不过kafka是可以看作数据库的change log。好像有个用法叫ktable。

评分

参与人数 2大米 +2 收起 理由
836195369 + 1 给你点个赞!
rxTByjroA2h3 + 1 immutable db

查看全部评分

回复

使用道具 举报

推荐
tiancaihb 2021-5-20 12:51:34 | 只看该作者
全局:
本帖最后由 tiancaihb 于 2021-5-20 12:58 编辑
ymsfd007 发表于 2021-5-20 10:30
非常感谢。

有几个问题:

1. hot shard,因为本来partition之间是独立的,如果平均分message,就是embarrassingly parallel。另外partition多到一定程度,维护metadata,以及网络连接数。
2. 因为kafka和mq不一样,两个consumer读到的会是一样的一系列信息,而非每个信息发给一个consumer处理。所以是要两个consumer做一样的事情?还是让他们协调读同一个topic的不同的信息(但是kafka本来的想法是让consumer各干各的,不好)?
3. 感觉kafka主要优点还是throughput高而不是latency低。很多时候低latency就会牺牲throughput或者durability。例如追求低延迟则不能利用batching,或者produce时不等ackall。
4. 既然kafka是固定的一系列信息,一旦produce了就会一直在那里,也不能删除(因为kafka就是一个message数组,你顺着去读嘛)。你遇到错误的信息,得有办法忽略,跳过,或者记录到一个deadletter topic以便调查和重放。你说的丢包是另一个话题,可能需要详细展开你的问题。

评分

参与人数 4大米 +9 收起 理由
labour31 + 2 很有用的信息!
KeJia + 3 给你点个赞!
helloteacha + 3 很有用的信息!
836195369 + 1 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
 楼主| 836195369 2021-5-20 07:39:46 | 只看该作者
全局:
顺势求点大米
回复

使用道具 举报

全局:
赞赞赞 紫薯紫薯
回复

使用道具 举报

🔗
 楼主| 836195369 2021-5-20 09:24:37 | 只看该作者
全局:

感谢感谢,另外真心求建议意见,第一次写技术分享,感觉语言组织的不是很流畅,以后更新我会尽量带一些例子
回复

使用道具 举报

🔗
ymsfd007 2021-5-20 10:30:20 | 只看该作者
全局:
非常感谢。

有几个问题:
1. 看上去kafka牛逼在于单机性能爆表,因为零拷贝,组成集群以后一般瓶颈会出现在哪呢?
2. 为什么单个parition只能被组中的一个消费者使用,不能多个消费者订阅一个partition?
3. 低延迟是一个硬指标吗?
4. 有什么校正机制吗?比如丢包了,或者某个消息出error,应该是让消息流继续而不至于head-of-line blocking吧?
回复

使用道具 举报

🔗
labour31 2021-5-20 10:54:33 | 只看该作者
全局:
非常期待!很想了解kafka delivery guarantee方面的内容
回复

使用道具 举报

🔗
donnice 2021-5-20 12:29:28 | 只看该作者
全局:
1MB/message as a upper limit, just FYI
回复

使用道具 举报

🔗
HHHHarold 2021-5-20 12:52:21 | 只看该作者
全局:
谢谢分享zs
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表