消息中间件--kafka

kafka是什么?

Kafka是linkedin使用Scala编写的具有高水平扩展和高吞吐量的分布式消息系统,kafka对消息保存时根据Topic进行归类,发送消息者称为Producer,消息接收者成为Consumer,此外kafka集群有多个kafka实例组成,每个实例成为broker。无论时kafka集群还是producer和cunsumer都依赖zookeeper来保证系统可用性,为集群保存了一些meta信息。

kafka有什么特点?

在这里插入图片描述
kafka最大的特点就是只要出现就是以集群的方式出现,单台kafka毫无意义。
官网称kafka是一个流处理平台,流平台的特性有:
1、可发布和订阅流数据,类似于消息队列或者企业级消息系统
2、以容错的方式存储流数据。(kafka时可以存储数据的)
3、可以在流数据产生时就进行处理

AMQP协议

AMQP是一个提供统一消息服务的标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件而设计。
在这里插入图片描述
server::AMQP服务端,接受客户端连接,实现AMQP消息队列和路由功能的进程。
producer:生产者,向broker发布消息的客户端应用程序。
consumer:消费者,向消息队列请求消息的客户端应用程序。
为什么说kafka是一个仿AMQP协议,是因为kafka是由多个broker形成的一个集群。

kafka相关概念

1、Topic:数据主题,是kafka中用来代表一个数据流的一个抽象,发布数据时,可用topic对数据进行分类,也作为订阅数据时主题。一个Topic同时可有多个producer、consumer。
2、Partition:每个partition是一个顺序的、不可变的record序列,partition中record会被分配一个增长的id,我们称之为offset。
3、Replication:每个partition还会被复制到其他服务器作为replication,这是一种冗余的备份策略。
4、分片存储(思想是将可用的磁盘空间统一起来,做成一个大的存储)
在这里插入图片描述
比如每台机器只能存储3T的数据,但是我要存储12T的数据,那么我就要找4台3T的机器统一起来;总结起来来说就是 一个topic我把它分成4份存储,4份数据加起来才叫整体,这叫分片(partiton)。这么做还有一个好处,就是查找数据的时候,由原来的单线查找变成了现在的4条线并发查找,将压力负载均衡了,提升了效率。
备份:follower和leader
分片的缺点就是一旦有其中一个分片挂掉,数据丢失,那么这个topic的数据就不再完整,所以每一个分片上都存储一份其他分片的备份数据,访问的时候首先访问leader。

Kafka核心API

kafka的四个核心api:
1、Producer API:允许一个应用程序发布一串流式的数据到一个或者多个Kakfa topic。
在这里插入图片描述
Producer 会为每个partition维护一个缓冲,用来记录还没有发送的数据,每个缓冲区大小用batch.size指定,默认值为16k。
linger.ms为,buffer中的数据在达到batch.size前,需要等待时间。
acks用来配置请求成功的标准,当为0时,只要数据send到buffer,就会立即push到topic中,没有等待;为1时,有回执,只有当前push到leader成功了,下一条才能push,否则等待;为all时,leader和follower都写成功了,才继续下一条,否则就等待。

2、Consumer API:允许一个应用程序订阅一个或者多个topic。
Consumer group是由多个consumer组成,每一个consumer消费一个partition,并且记录当前的消费进度存储到一个consumer_offset中。如果consumer多,partition少,那么多出来的consumer会饿死;如果consumer少,partition多,多出来的partition会随机给其中一个consumer消费;consumer group的目的就是可以让同一条消息多次消费。
每次消费都会记录一个offset值,下次消费的时候,会从这个位置开始消费,但是会产生很多问题,根本就在于自动提交模式下,consumer已经消费了数据,但是在往consumer_offset里面记录的时候没有成功,导致下次消费会重复;或者在往数据库插入数据时,已经提交了offset,但是没有插入到数据库,这个时候就会造成消息丢失。解决方案就是将自动提交改为手动提交,确定插入数据库之后再手动提交。但是可能会造成重复插入问题,解决方法将offset落表记录位置,使用唯一索引,避免重复提交。

3、Streams API:允许一个应用程序作为一个流处理器,消费一个或者多个topic产生的输如流,然后生产一个输出流到一个或者多个topic中,在输入输出流中进行有用的交换。
常见的流处理框架为flink/spark,就是保证数据实时展示,并不是以前的批次展示,如果数据量较小则可以通过kafka的streams,如果数据量较大,则要通过大型的流框架来处理。

4、Connector API:允许构建并运行可重用的生产者或者消费者,将Kafka topics连接到已存在的应用程序或者数据系统,比如连接到一个关系型数据库,捕捉表的所有变更内容。

kafka适用场景

1、基于kafka,构造实视流数据管道,让系统或应用之间可靠地获取数据。
2、构建实时流式应用程序,处理流数据或基于数据做出反应。
3、日志收集

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值