论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
物联网
›
物联网
›
【中间件开发】kafka使用场景与设计原理 ...
【中间件开发】kafka使用场景与设计原理
守听
金牌会员
|
7 天前
|
显示全部楼层
|
阅读模式
楼主
主题
871
|
帖子
871
|
积分
2613
前言
本文首先介绍了消息队列,然后详细叙述了Kafka的架构设计和工作流程。
一、MessageQueue
1.1 界说
消息 + 队列 (Message + Queue) 简称 MQ。消息队列本质就是个队列,FIFO 先入先出,只不外队列中存放的内容是 Message,从而叫消息队列。消息队列的重要用途就是在差异的
服务server、进程process、线程thread
之间进行通信。
Q:那么是如何进行通信的呢?
1.2 使用消息队列的场景
1.2.1 异步处理
场景:短信关照、终端状态推送、App推送、用户注册等。
很明显,同步处理的性能远不如可并发的异步处理,多线程处理“库存”是趋势。
1.2.2 流量控制
场景:秒杀场景下的下单状态。
这种场景下网关生产的消息宏大于服务器处理的速度,使用消息队列隔离网关和后端服务,以达到流量控制和掩护后端服务的目的。
1.2.3 服务解耦
可以使用消息队列将各系统进行隔离,以达到修改更少的代码的目的,逻辑层次也更清晰。
使用消息队列:
消息队列在这里充当了一个中介的位置,各系统只需分清生产和消费的位置即可通过消息队列进行通信。
1.2.4 发布订阅
在一些跨服游戏中,当玩家对全服进行喊话,或者系统进行播报的操纵。这些显现出来的消息就是通过消息队列,按着先进先出的规则播报出来的。
比如广播用户获得高阶武器的消息。
1.2.5 高并发缓冲
场景:kafka日志服务、监控上报
1.3 基本概念和原理
1.3.1 点对点消息队列模型 – 线程池
消息生产者向一个特定的队列发送消息,消息消费者从该队列中吸取消息;一条消息只有一个消费者能收到;
1.3.2 发布订阅消息模型-Topic --上课关照
发布订阅消息模型中,支持向一个特定的主题 Topic 发布消息,0 个或多个订阅者吸取来自这个消息主题的消息。 在这种模型下,发布者和订阅者彼此不知道对方。当发布者向这个主题发布消息,然后所有的订阅者会吸取这个消息。
1.3.3 消息的ACK确认机制
为了保证消息的不丢失,消息队列中提供了消息的 ACknowledge 机制,即 ACK 机制。当消费者确认这个消息已经消费掉了,那么会向消息队列发送一个 ACK,消息队列收到后会将这个消息进行删除。但是当系统宕机,消息队列并未收到 ACK 的话,消息队列会认为这个消息并未被消费掉,便会将这个消息继续发送给其他的消费者重新处理。这样 ACK 的及时性会牺牲肯定的吞吐量。
二、Kafka
解耦
:答应我们独立的扩展或修改队列双方的处理过程。
可恢复性
:纵然一个处理消息的进程挂掉,参加队列中的消息仍旧可以在系统恢复后被处理。
缓冲
:有助于办理生产消息和消费消息的处理速度不一致的情况。
灵活性和峰值处理本领
:不会因为突发的超负荷的哀求而完全崩溃,消息队列可以或许使关键组件顶住突发的访问压力。
异步通信
:消息队列答应用户把消息放入队列但不立即处理它。
典型应用:链接
2.1 Kafka的架构设计及名词解释
Producer
:消息生产者,向 Kafka Broker 发消息的客户端。
Consumer
:消息消费者,从 Kafka Broker 取消息的客户端。
Consumer Group
:消费者组(CG),消费者组内每个消费者负责消费差异分区的数据,进步消费本领。一个分区只能由组内一个消费者消费,消费者组之间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。
Broker
:一台 Kafka 呆板就是一个 Broker。一个集群 (kafka C1uster) 由多个 Broker 组成。一 个 Broker 可以容纳多个 topic。
topic
:可以理解为一个队列,topic 将消息分类,生产者和消费者面向的是同一个 topic。
Partition
:为了实现扩展性,进步并发本领,一个非常大的 topic 可以分布到多个 Broker (即服务器)上,一个 topic 可以分为多个 Partition,同一个 topic 在差异的分区的数据是不重复的,每个 Partition 是一个有序的队列,其表现形式就是一个一个的文件夹。
Replication
:每一个分区都有多个副本,副本的作用是做备胎。当主分区(Leader)故障的时间 会选择一个备胎(Follower)上位,成为 Leader。在 kafka 中默认副本的最大数量是 10 个,且副本的数量不能大于 Broker 的数量,follower 和 leader 绝对是在差异的呆板,同一呆板对同一个分区也 只可能存放一个副本(包括自己)。
Message
:消息,每一条发送的消息主体。
Leader
:每个分区多个副本的 “主” 副本,生产者发送数据的对象,以及消费者消费数据的对象,都是 Leader。
Follower
:每个分区多个副本的 “从” 副本,及时从 Leader 中同步数据,保持和 Leader 数据的同 步。Leader 发生故障时,某个 Follower 还会成为新的 Leader。
Offset
:消费者消费的位置信息,监控数据消费到什么位置,当消费者挂掉再重新恢复的时间,可以从消费位置继续消费。同一主题,差异的分区,他们的 offset 是独立的。
ZooKeeper
:Kafka 集群可以或许正常工作,需要依赖于 ZooKeeper,ZooKeeper 帮助 Kafka 存储和管理集群信息。
在这里还需要留意,一个Partition下有多个segment,segment下由.log和.index文件组成,.index文件用于索引.log中的终极文件位置。
2.2 工作流程
在上述工作图中可以发现副本被存储在差异的Broker中,这些副本同样需要和leader通过ACK机制保持通信。Kafka数据冗余重要是为了系统高可用和高持久性,而fastdfs、mongodb可以通过副本机制进步读的哀求量。
2.2.1 Producer
Producer在写入数据时永远只会找leader。
分区策略
决定生产者将消息发送到谁人分区的算法。
轮询策略:每个分区按顺序每次分配一条消息;
随机策略:随意地将消息放置到恣意一个分区上;
按消息键保序策略:一旦消息被界说了 Key,那么你就可以保证同一个 Key 的所有消息都进入到雷同的分区里面;
默认分区规则:
指明 Partition 的情况下,直接将给定的 Value 作为 Partition 的值。
没有指明 Partition 但有 Key 的情况下,将 Key 的 Hash 值与分区数取余得到 Partition 值。
既没有 Partition 有没有 Key 的情况下,第一次调用时随机天生一个整数(后面每次调用都在这个整数上自增),将这个值与可用的分区数取余,得到 Partition 值,也就是常说的 Round-Robin轮询算法
2.2.2 Consumer
传统的消息队列模型的缺陷在于消息一旦被消费,就会从队列中被删除(zeromq),而且只能被下游的一个Consumer消费。严格来说,这一点不算是缺陷,只能算是它的一个特性。但是这种模型的可伸缩性差。
Kafka使用Consumer Group机制,实现了两大模型:
如果所有实例(消费者)都属于同一个 Group,那么它实现的就是点对点消息队列模型;
如果所有实例(消费者)分别属于差异的 Group,那么它实现的就是发布 / 订阅模型。
消费方式
Consumer 接纳 **Pull(拉取)**模式从 Broker 中读取数据。Pull 模式则可以根据 Consumer 的消费本领以适当的速率消费消息。Pull 模式不足之处是,
如果 Kafka没有数据
,消费者可能会陷入循环中,一直返回空数据。
因为消费者从 Broker 主动拉取数据,需要维护一个长轮询,针对这一点, Kafka 的消费者在消费数据时会传入一个时长参数
timeout
。如果当前没有数据可供消费,Consumer 会等候一段时间之后再返回,这段时长即为 timeout。
分区分配策略
一个消费者组中有多个 consumer,一个 topic 有多个 partition,所以必然会涉及到 partition 的分配标题。
Range:针对每个 topic。将 topic 中的分区与消费者排序,通过分区数/消费者数决定每个消费者消费几个分区,若除不尽则前面几个消费者会多消费1个分区。留意,如果有N个 topic,容易产生数据倾斜
RoundRobin:针对集群中的所有 topic。把所有分区和所有的消费者都列出来,然后按照hashcode 进行排序,末了通过轮询算法来分配分区给到各个消费者
Sticky:粘性分区从 0.11.x 版本开始引入,首先会尽量均衡的放置分区到消费者上面,在出现同一消费者组内消费者出现标题的时间,会尽量保持原有分配的分区不变化
CooperativeSticky: 在不停止消费的情况下进行增量再均衡。这与 Sticky 的逻辑雷同,但具有增量支持。这种策略可能会产生不均衡的分配。
2.3 partition和topic的关系
一个分区只能属于一个主题
一个主题可以有多个分区
同一主题的差异分区内容不一样,每个分区有自己独立的 offset
同一主题差异的分区可以或许被放置到差异节点的 broker
分区规则设置恰当可以使得同一主题的消息
匀称落在
差异的分区
为什么会分区? ---- 可以程度扩展
Kafka 的消息组织方式现实上是三级结构:主题 - 分区 - 消息。主题下的每条消息只会生存在某一个分区中,而不会在多个分区中被生存多份。
分区的作用重要提供
负载均衡
的本领,可以或许实现系统的高伸缩性(Scalability)。
总结
本文首先介绍了消息队列,然后详细叙述了Kafka的架构设计和工作流程。Kafka通过自身的分区策略、副本冗余机制、ACK确认机制等保证了消息队列的高可用、高性能和高伸缩性。
参考链接:
https://github.com/0voice
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
守听
金牌会员
这个人很懒什么都没写!
楼主热帖
【网络编程】从零开始搭建一个开源博客 ...
Vulnhub靶机-Al-Web-1
【CSDN云VS腾讯云】要不然怎么说CSDN开 ...
面试官:BIO、NIO、AIO是什么,他们有 ...
报错building for iOS Simulator, but ...
Python学习:import的正确用法
TCP协议
如何成为一名开发人员——第 3 部分: ...
全网最新的nacos 2.1.0集群多节点部署 ...
UWP/WinUI3 Win2D PixelShaderEffec ...
标签云
挺好的
服务器
浏览过的版块
数据安全
快速回复
返回顶部
返回列表