Kafka(分布式消息队列)的基本认识

作用(用于消息中间件)

1.可以作为缓冲(流量消减)--防止高并发

2.分布式

3.解耦合

分片机制

简要介绍:

1.Kafka可以将主题划分为多个分区(Partition)

2.主要解决了单台服务器存储容量有限的问题

3.将消息均匀的分布到不同的分区中,这样实现了负载均衡.(提高读写效率)

生产者和消费者对分区的操作:

1.生产者和消费者可以多线程地并行操作,每一个线程处理的是一个分区的数据,所以分区实际上是调优Kafka并行度的最小单元.

2.生产者可以多线程同时向不同分区发送消息

3.消费者:同一个消费组内,一个分区可以被一个组中某一个成员消费,如果消费组中有多于分区数量的消费者,那么一定会有消费者无法消费数据。

4.一个topic分区越多,理论上整个集群所能达到的吞吐量就越大。但每个分区都有自己的资源占用开销,分区多了,副本也多了,资源占用同样也多了.

注意:kafka中的topic在消费时,整体上是无序的,而每个分区的内部消费是有顺序的,如果想要全局有序,可以设置一个分区,但是这样的话丢失了很多的性能。

如何合理的设置分区数:

一个topic分区的个数不是随意来来设置的,需要有些衡量的指标,可以使用如下方法进行测试:

(1)、创建只有一个分区数的topic

(2)、然后测试这个topic的producer和consumer吞吐量

(3)、假设它们的值分别为Tp和Tc,单位可以是MB/s 

(4)、然后假设总的目标吞吐量是Tt,那么分区数= Tt / max(Tp, Tc)

注意:

Tp表示producer的吞吐量。测试producer通常是很容易的,因为它的逻辑非常简单,就是直接发送消息到Kafka就好了。Tp=10m/s

Tc表示consumer的吞吐量。测试Tc通常与应用的关系更大,因为Tc的值取决于你拿到消息之后执行什么操作,因此Tc的测试通常也要麻烦一些。Tc=5m/s总的目标吞吐量是Tt,可以理解为说业务数据每秒实际产生的数据量100M

副本机制:

副本备份机制解决了数据存储的高可用问题

容错原则例子:

假设有三个分片, 三个副本, 共计9个节点

​ 在三台服务器上 各放置一个分片的副本

​ 第二个副本放置在和这台服务器同机架上

​ 第三个副本放置在不同的机架的服务器上

消息不丢失机制:

生产者端消息不丢失:

1) 消息生产分为同步模式和异步模式

2)  消息确认分为三个状态

​ a) 参数0:生产者只负责发送数据

​ b) 参数1:某个partition的leader收到数据给出响应

​ c) 参数-1:某个partition的所有副本都收到数据后给出响应

3)  在同步模式下

​ a) 生产者等待10S,如果broker没有给出ack响应,就认为失败。

​ b) 生产者重试3次,如果还没有响应,就报错。

4)  在异步模式下

​ a) 先将数据保存在生产者端的buffer中。Buffer大小是2万条。

​ b) 满足数据阈值或者数量阈值其中的一个条件就可以发送数据。

​ c) 发送一批数据的大小是500条。

注意:异步模式下,如果broker迟迟不给ack,而buffer又满了。开发者可以设置是否直接清空buffer中的数据。

broker端消息不丢失:

1.broker端的消息不丢失,其实就是用partition副本机制来保证。

2.Producer ack -1(all). 能够保证所有的副本都同步好了数据。其中一台机器挂了,并不影响数据的完整性。

消费端消息不丢失:

通过offset commit 来保证数据的不丢失,kafka自己记录了每次消费的offset数值,下次继续消费的时候,会接着上次的offset进行消费。

生产者数据分发策略:

1.用户指定partition

2. 当用户指定key,使用hash算法。如果key一直不变,同一个key算出来的hash值是个固定值。如果是固定值,这种hash取模就没有意义。

3.当用户既没有指定partition也没有key,使用轮询的方式发送数据

消息的发布方式:

点对点的发布方式:只要保证所有接收这个topic的消费者都在同一组中

发布订阅方式:只要保证所有接收这个topic的消费者不属于同一组

面对数据量大,消费者消费慢的解决思路:

1.将同组中的消费者数量提高到这个topic分片的数量

2.若消费能力不足,可以将topic的分片数量扩大

3.通过硬件提高消防者处理能力

你可能感兴趣的:(Kafka(分布式消息队列)的基本认识)