为什么需要消息系统:由于消息发送者不需要等待消息接收者处理数据就可以返回,系统具有更好的响应延时,同时,在网站访问高峰,消息可以暂时存储在消息队列中等待消息接收者根据自己负载处理能力控制消息处理速度,减轻数据库等后端存储的负载压力

1.解耦:允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。

2.冗余:消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。许多消息队列所采用的"插入-获取-删除"范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕。

3.扩展性:因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可。

4.灵活性 & 峰值处理能力:在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。

5.可恢复性:系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。

6.顺序保证:在大多使用场景下,数据处理的顺序都很重要。大部分消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理。(Kafka 保证一个 Partition 内的消息的有序性)

7.缓冲:有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况。

8.异步通信:很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。


kafka的关键特性:

1.kafka具有近乎实时性的消息处理能力。kafka将消息保存在磁盘中。采用顺序读写的访问磁盘。从而避免了随机读写磁盘的性能瓶颈。

2.kafka支持批量读写消息。并且会对消息进行批量压缩。这样提高了网络的利用率。也提高了压缩效率。

3.kafka支持消息分区。分区之间可以并发操作。支持现在扩容

4.kafka支持副本。每个分区都有自己的副本。副本中有一个负责读写的leader。其他副本负责与Leader进行同步。


kafka相关的原语:

1.producer:消息生产者,发布消息到 kafka 集群的终端或服务。

2.brokerkafka 集群中包含的服务器。

3.Topic(话题):每条发布到 kafka 集群的消息属于的类别,即 kafka 是面向 topic 的。

4.partitionpartition 是物理上的概念,每个 topic 包含一个或多个 partitionkafka 分配的单位是 partition

5.consumer:从 kafka 集群中消费消息的终端或服务。

6.Consumer grouphigh-level consumer API 中,每个 consumer 都属于一个 consumer group,每条消息只能被 consumer group 中的一个 Consumer 消费,但可以被多个 consumer group 消费。

7.replicapartition 的副本,保障 partition 的高可用。

8.leaderreplica 中的一个角色, producer consumer 只跟 leader 交互。

9.followerreplica 中的一个角色,从 leader 中复制数据。

10.controllerkafka 集群中的其中一个服务器,用来进行 leader election 以及 各种 failover

11.ISR:In-Sync-Replica集合表示的是目前”可用“(alive)且消息量与leader相差不多的副本集合。这是整个副本集合的一个子集。”可用“和”相差“不多都是很模糊的描述,其实际含义是ISR集合中的副本必须满足下面两个条件:

(1)副本所在节点必须维持着与zookeeper的连接

(2)副本最后一条消息的offset与Leader副本的最后一条消息的offset之间的差异不能超出指定的阈值。

12.HW(HighWatermark)和LEO与上面的ISR集合紧密相关。HW标记了一个特殊的offset。当消费者处理消息的时候,只能拉取到HW之前的消息。HW之后的消息对消费者来说是不可见的。与ISR集合类似,HW也是由Leader副本管理的。当ISR集合中全部的Follower副本都拉取HW指定的消息进行同步后。Leader副本会递增HW的值。kafka官网网站将HW之前的消息的状态称为"commit",其含义是这些消息在多个副本中同时存在,即使此时Leader副本损坏,也不会出现数据丢失。

13.LEO(Log End Offset)是所有的副本都会有的offset标记。它指向追加到当前副本的最后一个消息的offset。当生产者向Leader副本追加消息的时候。Leader副本的LEO的标记会递增。当Follower副本成功从Leader副本拉取消息并更新到本地的时候。Follower副本的LEO就会递增。

14.zookeeperkafka 通过 zookeeper 来存储集群的 meta 信息。

15.Push  推送数据

16.Pull (fetch)拉数据

17.Append   追加

18.stack栈和queue队列     队列先进先出,栈先进后出