kafka在大数据、分布式架构中都很流行。kafka可以进行流式计算,也可以做为日志系统,还可以用于消息队列。

本篇主要是消息队列相关的知识。

零、kafka作为消息队列的优点:

  • 分布式的系统
  • 高吞吐量。即使存储了许多TB的消息,它也保持稳定的性能。
  • 数据保留在磁盘上,因此它是持久的。

一、pull模式

消息队列有push模式和pull模式。push模式是消息队列推送给消息消费者,pull模式是消息消费者从消息队列中拉取。

二、发布 - 订阅消息系统

kafka是一个分布式的发布 - 订阅(pub-sub)消息系统。

在发布 - 订阅系统中,消息被保留在主题中。 消费者可以订阅一个或多个主题并使用该主题中的所有消息。

消息生产者称为发布者,消息使用者称为订阅者。

比如,购物网站,有一个订单系统,还有一个物流系统,消息队列可以作为两个系统的消息中间件,订单系统可以将订单数据发送给kafka消息队列,然后物流系统再从消息队列中订阅得到订单数据。

三、角色和组件

Topics(主题)

属于特定类别的消息流称为主题。 数据存储在主题中。

Topic被拆分成分区。 对于每个Topic,Kafka保存一个分区的数据。 每个这样的分区包含不可变有序序列的消息。 分区被实现为具有相等大小的一组分段文件。

Partition(分区)

Topic可能有许多Partition,因此它可以处理任意数量的数据。

Partition offset(分区偏移)

每个分区消息具有称为 offset 的唯一序列标识。类似数据库自增int Id,随着数据的不断写入 kafka 分区内的偏移量会不断增加,一条消息由一个唯一的偏移量来标识。偏移量的作用是,让消费者知道自己消费到了哪个位置,下次可以接着从这里消费

Replicas of partition(分区备份)

副本只是一个分区的备份。 副本从不读取或写入数据。 它们用于防止数据丢失。

Brokers

一台kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic。每个broker都有各自的broker.id。

Kafka Cluster(Kafka集群)

Kafka有多个代理被称为Kafka集群。 可以扩展Kafka集群,无需停机。 这些集群用于管理消息数据的持久性和复制。

Producer (消息生产者)

向kafka broker发消息的客户端。支持负载均衡,异步发送。

Consumer (消息消费者)

向kafka broker拉取消息的客户端。kafka采用的是 pull模型,而不是push模型。

Consumer Group (消费者组)

每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group)。

每个Consumer Group都有一个唯一的GroupId。

Leader(领导者)

Leader是负责给定分区的所有读取和写入的节点。 每个分区都有一个服务器充当Leader

Follower(追随者)

跟随Leader指令的节点被称为Follower。 如果Leader失效,一个Follower将自动成为新的领导者。 跟随者作为正常消费者,拉取消息并更新其自己的数据存储。

record(消息)

kafka 通信的基本单位,每一条消息称为record

示例如下:

在上图中,主题配置为三个分区。 分区1具有两个偏移因子0和1.分区2具有四个偏移因子0,1,2和3.分区3具有一个偏移因子0.副本的id与承载它的服务器的id相同。

四、Zookeeper在Kafka中的作用

Zookeeper在Kakfa中扮演的角色Kafka将元数据信息保存在Zookeeper中,但是发送给Topic本身的数据是不会发到Zk上的。

  • kafka使用zookeeper来实现动态的集群扩展,不需要更改客户端(producer和consumer)的配置。broker会在zookeeper注册并保持相关的元数据(topic,partition信息等)更新。
  • 而客户端会在zookeeper上注册相关的watcher。一旦zookeeper发生变化,客户端能及时感知并作出相应调整。这样就保证了添加或去除broker时,各broker间仍能自动实现负载均衡。这里的客户端指的是Kafka的消息生产端(Producer)和消息消费端(Consumer)
  • Broker端使用zookeeper来注册broker信息,以及监测partition leader存活性。
  • Consumer端使用zookeeper用来注册consumer信息,其中包括consumer消费的partition列表等,同时也用来发现broker列表,并和partition leader建立socket连接,并获取消息。
  • Zookeeper和Producer没有建立关系,只和Brokers、Consumers建立关系以实现负载均衡,即同一个Consumer Group中的Consumers可以实现负载均衡。

参考资料:

https://www.w3cschool.cn/apache_kafka/apache_kafka_quick_guide.html

https://my.oschina.net/u/258745/blog/1824848

kafka消息队列的简单理解的更多相关文章

  1. 初试kafka消息队列中间件一 (只适合初学者哈)

    初试kafka消息队列中间件一 今天闲来有点无聊,然后就看了一下关于消息中间件的资料, 简单一点的理解哈,网上都说的太高大上档次了,字面意思都想半天: 也就是用作消息通知,比如你想告诉某某你喜欢他,或 ...

  2. Kafka:docker安装Kafka消息队列

    安装之前先看下图 Kafka基础架构及术语  Kafka基本组成 Kafka cluster: Kafka消息队列(存储消息的队列组件) Zookeeper: 注册中心(kafka集群依赖zookee ...

  3. Kafka基础教程(四):.net core集成使用Kafka消息队列

    .net core使用Kafka可以像上一篇介绍的封装那样使用(Kafka基础教程(三):C#使用Kafka消息队列),但是我还是觉得再做一层封装比较好,同时还能使用它做一个日志收集的功能. 因为代码 ...

  4. 公司内部一次关于kafka消息队列消费积压故障复盘分享

    背景现象 1.20晚上8点业务线开始切换LBS相关流量,在之后的1个小时时间内,积压量呈上升趋势,一路到达50W左右,第二天的图没贴出具体是50W数字,以下是第一天晚上的贴图部分. 现象一: 现象二: ...

  5. 初试kafka消息队列中间件二(采用java代码收发消息)

    初试kafka消息队列中间件二(采用java代码收发消息) 上一篇 初试kafka消息队列中间件一 今天的案例主要是将采用命令行收发信息改成使用java代码实现,根据上一篇的接着写: 先启动Zooke ...

  6. 使用Cloudera Manager部署Kafka消息队列

    使用Cloudera Manager部署Kafka消息队列 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.下载需要安装的Kafka版本 1>.查看Cloudera Dis ...

  7. Canal Server发送binlog消息到Kafka消息队列中

    Canal Server发送binlog消息到Kafka消息队列中 一.背景 二.需要修改的地方 1.canal.properties 配置文件修改 1.修改canal.serverMode的值 2. ...

  8. Kafka消息队列初识

    一.Kafka简介 1.1 什么是kafka kafka是一个分布式.高吞吐量.高扩展性的消息队列系统.kafka最初是由Linkedin公司开发的,后来在2010年贡献给了Apache基金会,成为了 ...

  9. 使用kafka消息队列解决分布式事务(可靠消息最终一致性方案-本地消息服务)

    微服务框架Spring Cloud介绍 Part1: 使用事件和消息队列实现分布式事务 本文转自:http://skaka.me/blog/2016/04/21/springcloud1/ 不同于单一 ...

随机推荐

  1. C# 设计模式-策略者模式(Strategy)

    策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 策略模式是对算法的包装,是把使用算法的责任和 ...

  2. HDFS 原理解析

    源自https://www.cnblogs.com/duanxz/p/3874009.html Namenode是整个文件系统的管理节点.它维护着整个文件系统的文件目录树,文件/目录的元信息和每个文件 ...

  3. 32. 安装oracle11g时,先决条件一直失败的解决方法

    解决方法:1. 在命令提示符下 net share c$=c: 补充: 如果这个命令提示错误:“发生系统错误 5,拒绝访问的时候”,那我们可以修改注册表,检查AutoShareServer和AutoS ...

  4. PHP AES加密解密。

    <?php namespace app\models; class AES{ public $key; //构造函数,用密钥初始化 function Prpcrypt( $k ) { $this ...

  5. CoordinateLayout简介

    CoordinateLayout简介 参考:CoordinatorLayout CoordinatorLayout is a super-powered FrameLayout. Coordinato ...

  6. python网络图片爬取存储全代码

    #图片爬取全代码import requestsimport osurl = "https://timgsa.baidu.com/timg?image&quality=80&s ...

  7. 将tgz文件解压到指定目录

    转:http://blog.csdn.net/zhenwenxian/article/details/4400404 tar在linux上是常用的打包.压缩.加压缩工具,他的参数很多,折里仅仅列举常用 ...

  8. [记录] CSS 多行文本超出部分省略

    如果实现单行文本的溢出显示省略号同学们应该都知道用text-overflow:ellipsis属性来,当然还需要加宽度width属来兼容部分浏览 <p style="width: 30 ...

  9. Valgrind简单用法 (转)

    转自 http://www.cnblogs.com/sunyubo/archive/2010/05/05/2282170.html Valgrind的主要作者Julian Seward刚获得了今年的G ...

  10. air 调用jsfl 执行对应函数,并传参

    jsflPath = "WindowSWF/dt_tool_jsfl/" + event.item.fileName+".jsfl"; var element_ ...