网站宝 添加二级域名,海外营销是做什么的,建筑行业网站模版,如何用手机做钓鱼网站kafka无疑是当今互联网公司使用最广泛的分布式实时消息流系统#xff0c;它的高吞吐量#xff0c;高可靠等特点为并发下的大批量实时请求处理提供了可靠保障。很多同学在项目中都用到过kafka#xff0c;但是对kafka的设计原理以及处理机制并不是十分清楚。为了知其然知其所以…kafka无疑是当今互联网公司使用最广泛的分布式实时消息流系统它的高吞吐量高可靠等特点为并发下的大批量实时请求处理提供了可靠保障。很多同学在项目中都用到过kafka但是对kafka的设计原理以及处理机制并不是十分清楚。为了知其然知其所以然本文主要从三个方面介绍kafka第一kafka简介以及适用场景第二kafka设计原理三常见问题及思考。
一、kafka简介及适用场景
**kafka官网上对 kafka 的定义**一个分布式发布-订阅消息传递系统。主要特点包括高吞吐量、持久化消息持久化到磁盘支持批量和实时处理、可扩展性、容错性。
kafka 相关术语
Message消息基本数据单元key-value形式。为了提高效率消息被分批次写入 kafka。批次就是一组消息这些消息属于同一个Topic和Partition。
Topic主题每条消息都有一个类别这个类别被称为 Topic。Topic类似于数据库的表或者一个文件夹物理上不同 Topic 的消息分开存储。
Partition分区每个 Topic 包含一个或多个 Partition。Partition是物理概念通常一个Topic的消息被均匀地分发到每个partition以追加的方式写入先入先出的顺序读取。注由于一个主题一般包含几个分区因此无法在整个主题范围内保证消息的顺序但可以保证消息在单个分区的顺序。
Offst(偏移量)单个分区中的每一条消息都被分配一个 Offset它是一个单调递增的整型数可用来作为分区中消息的唯一标识符。
Broker缓存代理kafka 集群包含一个或多个服务器这种服务器被称为 broker。不维护任何消息的状态。
Producer生产者负责发布消息到 kafka broker。
Consumer消费者消息消费者向 kafka broker 读取消息的客户端。
Consumer Group消费组每个 Consumer 属于一个特定的 Consumer Group。注一个分区消息只能被一个Consumer Group中的一个Consumer消费。一个Consumer可以消费多个Topic的消息。每个Group中Consumer消息消费独立。具体理解见下图第三部分的常见问题2给出了解释。
kafka使用场景
1push发送
2高吞吐量
3可以作为大缓冲区使用
4Hadoop或传统的数据仓库中存储消息用于离线分析
5nginx日志收集
二、kafka设计原理
一个简单的kafka集群架构如下图所示
从图中可以看到生产者将数据发送(push)到Broker代理Broker代理有多个topic消费者主动从Broker获取(pull)数据。为什么采取Broker拉去数据的方式下面的思考问题会给出答案。在发送拉去过程中kafka的一些机制如下。
1、Message-partition的分配机制
1Key不为空时对key进行hash后对分区数量取余运算保证了同一个key会被分到同一个分区。
2key为空则进行轮询发送。
2、kafka 默认的消息保留策略
要么保留一段时间要么保留到到消息达到一定大小的字节数。
**3、kafka消息处理机制 **
1 发送到partitions中的消息将会按照它接收的顺序追加到日志中。
2对于消费者而言,它们消费消息的顺序和日志中消息顺序一致。
3如果Topic的“replication factor”复制因子为N,那么允许N-1个kafka实例失效比如3副本的设置允许2个副本失效。
4kafka提供at-least-once至少一次 delivery,即当consumer宕机后有些消息可能会被重复delivery。
5因每个partition只会被consumer group内的一个consumer消费故kafka保证每个partition内的消息会被顺序的消费。
6ack校验当消费者消费成功返回ack信息。
三、常见问题及思考
1、为什么Broker为什么不主动推送消息然后保存消息状态为已消费
Broker推送消息的方式无法很好地保证消费的处理语义。比如当我们已经把消息发送给消费者之后由于消费进程挂掉或者由于网络原因没有收到这条消息如果我们在消费代理将其标记为已消费这个消息就永久丢失了。kafka 采取拉取模型(pull)由自己控制消费速度以及消费的进度消费者可以按照任意的偏移量进行消费。比如消费者可以消费已经消费过的消息进行重新处理或者消费最近的消息。
2、为什么一个分区消息只能被一个消费组中的一个消费者消费
我们可以假设同一个消费组中的消费者1 已经消费了1-10那么该分区的消费index 需要移动到10的位置。当同一个消费组中的消费者2希望消费10-20时index再继续进行移动。
问题1我们已经了解了broker维护消息状态的以及索引的弊端。那么就需要在consumer端进行多个index维护那么就得引入中心的概念大家都在中心去获得当前的index这会增加复杂性。因此虽然牺牲了分区的分布式消费。但是因为可以有多个分区也是一个比较合理的方案。
3、为什么发送了消息接收端确没有收到消息
a、确认发送方和接收方配置的topic是否一致
b、确认发送方和接收方配置的kafka集群是否一致jps命令查看集群是否启动
c、确认发送方和接收方配置的是不是同一个partition
d、查看时间戳的方式确认发送方的消息是否落入到kafka的日志中
d.1没有落入相应partition的kafka日志中即kafka没有接收到
1发送方是否有特殊配置即一定量的消息才发送到kafka中批量发送可设置
2消息没有发送成功消息格式不正确或者kafka发送工具问题
d.2kafka日志中即kafka没有接收到
1接收端offset设置有误导致接收不到消息
2接收端拉取消息出现问题
四、总结
文本简述了kafka的简介以及原理企业在实际使用中还会有很多新的挑战
最后感谢每一个认真阅读我文章的人礼尚往来总是要有的虽然不是什么很值钱的东西如果你用得到的话可以直接拿走 这些资料对于【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴上万个测试工程师们走过最艰难的路程希望也能帮助到你