首页 > 数据库 > 数据库开发技术 > 一文读懂消息队列中间件Kafka到底是什么
kafka 是apache下面的子项目,是一个高性能跨语言分布式订阅发布消息队列系统
消息队列就像是一个容器,当我们需要使用消息的时候可以取出来供自己使用。消息队列的存在主要是为了通过异步处理提高系统性能和削峰(使用消息中间件采用队列的形式可以减少突发访问压力,不会因为突发的超时负荷要求而崩溃),降低系统耦合性(程序模块间存在联系的紧密程度)
kafka集群的包含一个或者多个服务器,服务器节点叫做broker,每一条发布到kafka集群的消息都有类别,这个类别叫做Topic,类似与数据库表名,topic上面的数据分割为一个或者多个partition每一个partition数据使用多个segment文件存储,每个partition 有多个副本,但是只有一个为leader,便是负责数据读写的partition
leader的跟随者叫做follower,所有写的请求都要通过follower路由,数据变更会广播给所有follower,follower的数据保持和leader同步,leader失效则从新的follower中选择新的leader,当follower挂掉,卡住,或者同步太慢,leader 会将这个follower删除(in sync replicas ISR中移除),重新创建一个follower
生产者(数据发布者)将消息发布到kafka的topic中,broker接受到消息后,将该消息追加到当前追加数据的segmengt文件中,生产者可以指定存储数据的partition
消费者(consumer)可以从broker读取数据,消费者可以提取多个topic,每一个消费者属于一个特定的consumer group 可以指定,如果不指定,则为默认。
通讯过程:
客户端打开与服务器端的socker,往socker写入int32的数字(数字表示这次发送的Request有多少字节),服务端接受到请求,读取int32数字整数,从而得到request的大小,然后读取对应字节 的数据从而得到request的内容,服务器收到内容后,以同样的方式对客户端做出响应。
数据传输的事务定义:
1、at most once :最多一次.发送一次,无论成败,将不会重发。
at most once:消费者fetch消息,然后保存offset,然后处理消息;当client保存offset之后,但是在消息处理过程中出现了异常,导致部分消息未能继续处理.那么此后”未处理”的消息将不能被fetch到,这就是“atmost once”。
2、at least once:消息至少发送一次,如果消息未能接受成功,可能会重发,直到接收成功。
at least once:消费者fetch消息,然后处理消息,然后保存offset.如果消息处理成功之后,但是在保存offset阶段zookeeper异常导致保存操作未能执行成功,这就导致接下来再次fetch时可能获得上次已经处理过的消息,这就是“atleast once”,原因offset没有及时的提交给zookeeper,zookeeper恢复正常还是之前offset状态。
3、exactly once:消息只会发送一次。
exactly once: kafka中并没有严格的去实现(基于2阶段提交,事务),我们认为这种策略在kafka中是没有必要的。
注:通常情况下“at-least-once”是我们首选。(相比at most once而言,重复接收数据总比丢失数据要好
Kafka的优点:
高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partition进行consume操作。可扩展性:kafka集群支持热扩展持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)高并发:支持数千个客户端同时读写
原文作者:步步运维步步坑;如有侵权,请联系管理员删除。