Kafka简介
Kafka是什么
Kafka是一种高吞吐量的分布式发布订阅消息系统(消息引擎系统),它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。
简单来说就是一个生产者将数据发送给kafka,系统B从kafka中进行拉取自己所需要的东西
异步通信原理
观察者模式
生产者消费者模式
传统模式
- 生产者直接将消息传递给消费者
- 耦合性非常高,当生产者或消费者发生改变,都需要重写业务逻辑
生产者消费者模式
- 通过一个容器解决生产者和消费者的强耦合关系,生产者和消费者彼此之间不直接进行联系,而是通过阻塞队列来进行通讯
数据传递流程
- 生产者消费者模式:有N个线程进行生产,同时N个线程进行消费,两种角色通过内存缓冲区进行通信
- 生产者负责向缓冲区中添加数据单元
- 消费者负责从缓冲区中拉取自己所需数据单元
-
一般情况下都是遵循先进先出原则
-
消息队列
目前企业中常见的消息队列产品主要有:Kafka,ActiveMQ,Rabbit,RocketMQ,在大数据中主要采用Kafka作为消息队列
传统消息队列应用场景
- 缓存/削峰:有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理不一致情况
- 解耦:允许独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束
- 异步通信:允许用户将一个消息放入队列,但并不立即处理,当需要的时候在处理这个消息
-
消息队列的两种模式
- 点对点模式
- 消费者主动拉取数据,消息拉取完成后清除消息
- 发布/订阅模式
- 可以有多个topic主题(浏览,点赞,收藏。。。)
- 消费者消费数据之后不删除数据
- 每个消费者之间相互独立,都可以消费数据
使用消息队列的好处
-
解耦:允许我们独立的扩展或修改队列两边的处理过程。
-
异步通信:消息队列允许用户把消息放入队列但不立即处理它。
-
灵活性 & 峰值处理能力:不会因为突发的超负荷的请求而完全崩溃,消息队列能够使关键组件顶住突发的访问压力。
-
缓冲:有助于解决生产消息和消费消息的处理速度不一致的情况。
-
可恢复性:即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理
kafka的优点
解耦
在项目启动之初来预测将来项目会碰到什么需求,是极其困难的。消息系统在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口。这允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束
扩展性
因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可。不需要改变代码、不需要调节参数。
灵活性&峰值处理
在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见;如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃
可恢复性
系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。
顺序保证
在大多使用场景下,数据处理的顺序都很重要。大部分消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理。Kafka保证一个Partition内的消息的有序性。
缓冲
在任何重要的系统中,都会有需要不同的处理时间的元素。例如,加载一张图片比应用过滤器花费更少的时间。消息队列通过一个缓冲层来帮助任务最高效率的执行———写入队列的处理会尽可能的快速。该缓冲有助于控制和优化数据流经过系统的速度。
冗余
有些情况下,处理数据的过程会失败。除非数据被持久化,否则将造成丢失。消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。许多消息队列所采用的"插入-获取-删 除"范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从 而确保你的数据被安全的保存直到你使用完毕。
异步通信
很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。
Kafka系统架构
Broker
- kafka集群包含一个或多个服务器,服务器的节点被称为Broker
- Broker存储Topic的数据 ,如果某topic有N个partition,集群有N个broker,那么每个broker存储该topic的一个partition。
如果某topic有N个partition,