消息收发
- 消息发送,支持指定分区发送、同步发送、异步发送、分区批量累积发送;支持身份认证,客户端连接Broker时使用SSL或SASL进行验证,数据传加密传输;支持ACL机制,提供客户端读、写权限认证。支持通过压缩算法实现消息体压缩,减少网络传输数据量,提高Kafka的消息发送吞吐量。
- 消息消费,支持指定Partition消费、指定分区的offset消费;采用poll方式,支持批量消费,支持广播消费。
消息有序性
针对消息有序的业务需求,分为全局有序和局部有序。
- 全局有序:一个Topic下的所有消息都需要按照生产顺序消费。
- 局部有序:一个Topic下的消息,只需要满足同一业务字段的要按照生产顺序消费。例如:Topic消息是订单的流水表,包含订单orderId,业务要求同一个orderId的消息需要按照生产顺序进行消费。
由于Kafka的一个Topic可以分为了多个Partition,Producer发送消息的时候,是分散在不同 Partition的。当Producer按顺序发消息给Broker,但进入Kafka之后,这些消息就不一定进到哪个Partition,会导致顺序是乱的。因此要满足全局有序,需要1个Topic只能对应1个Partition。
要满足局部有序,只需要在发消息的时候指定Partition Key,Kafka对其进行Hash计算,根据计算结果决定放入哪个Partition。这样Partition Key相同的消息会放在同一个Partition。此时,Partition的数量仍然可以设置多个,提升Topic的整体吞吐量。
消费群组
在kafka中,某些Topic的主题拥有数百万甚至数千万的消息量,如果仅仅靠个消费者进程消费,那么消费速度会非常慢。Kafka提供的消费组功能,一个分区只可以被消费组中的一个消费者所消费, 一个消费组中的一个消费者可以消费多个分区。消费组三大优势消费效率更高、消费模式灵活、便于故障容灾。
消息回溯
Kakfa消息写入Broker后,会保存一段时间。在这段时间内,如果消费者导致消息丢失(比如消费者过早的提交了偏移量,发送故障,进行rebalance),可以通过发送seek指令到消费者,告诉其从具体的偏移量开始重新消费。
消息清理
Kafka每一个分区副本都对应的一个 log 日志文件。而 Log 又分为多个 LogSegement 日志分段,每个片段可以设置大小,当达到上限,就关闭当前文件,打开一个新的文件。这些片段是不能永久保存的,达到一定的条件,就需要清理。Kafka包括基于时间,基于日志大小,基于日志偏移量三种模式。
- 基于时间模式,检查日志文件中是否有保留时间超过设定的的阀值(log.retention.hours, log.retention.minutes ,log.retention ms三个值配合),符合条件则删除。比如log.retention.hours设置为24,则保留仅1天的片段数据,其他的都删除。注意,活跃的片段(正在写入的片段)是无法删的,以下几种模式也一样。
- 基于日志大小模式,检查片段文件的大小是否超过设定的阀值(通过log.segment.bytes设置单个片段的大小),符合条件则删除。
- 基于日志起始偏移量模式,检查片段文件的偏移量(结束位置)是否小于设置的偏移量阀值,符合条件则删除。
高吞吐
高吞吐量是Kafka设计的主要目标,Kafka将数据写到磁盘,充分利用磁盘的顺序读写。同时,Kafka在数据写入及数据同步采用了零拷贝(zero-copy)技术,采用sendFile()函数调用,sendFile()函数是在两个文件描述符之间直接传递数据,完全在内核中操作,从而避免了内核缓冲区与用户缓冲区之间数据的拷贝,操作效率极高。Kafka还支持数据压缩及批量发送,同时Kafka将每个主题划分为多个分区,这一系列的优化及实现方法使得Kafka具有很高的吞吐量并经受充分验证。
高可用
kafka中一个主题下面可以有多个分区(partition),每个分区(partition)可以有多个副本,所以kafka的副本的维度是以分区为维度进行划分的;同一个分区下的所有副本保存有相同的消息序列,这些副本分散保存在不同的 Broker 上,从而能够对抗部分 Broker 宕机带来的数据不可用。在生产环境中,每个分区的副本分布在不同的机器上,这样即使某些机器出现故障,集群依然可用。