kafka的用法问题
学习任务问题反馈
1.kafka消息数据如何存储?
2.kafka如何保证有序,生产者有序,消费者有序
3.kafka主从同步,如何进行选主
4.consumer如何管理offset,如何保证数据不丢,如何保证数据不重复消费
5.tars如何进行服务发现,如何做负载均衡
6.tars线程模型
7.tars服务接口是被调用的流程,从TCP收到数据流开始到调用接口
-
kafka如何存储消息数据:partition相当于一个文件夹,里面分为大小相等的segment数据文件来存储一部分的message,一个segment主要包括一个index文件和一个log文件,index文件里是一个map,key是当前segment的offset的偏移量,value是log文件中对应消息的实际物理地址偏移量。log文件里也是一个map,key是当前partition的offset的偏移量,value是当前消息的实际物理地址偏移量。index文件采用的是稀疏索引,当索引文件没有命中,会二分查找到最近的消息,然后根据消息长度找到offset相等的那条消息。
-
kafka如何保证有序:
2.1 全局有序
(1)生产者有序:
i. 采用双端队列
ii. topic只设置一个partition分区
iii. 将 max.in.flight.requests.per.connection设置为1,生产者在服务器响应之前可以发送1条消息,保证消息按照发送顺序写入服务器
(2)消费者有序:
i. 使用单线程
ii. 采用保证消费顺序的线程模型
iii. 在消费端增加失败标记的记录,然后用定时任务轮询去重试失败的消息并做好监控报警。
2.2 局部有序
(1)生产者有序:
i. 采用双端队列
ii. 将需要保证有序的消息发送到同一个partition
(2)消费者有序:
i. 将需要保证有序的消息发送到同一个消费线程
-
kafka如何实现主从同步:使用ISR机制,ISR中的follower从leader拉取数据进行追加复制,ISR同步leader后有一个LEO,将ISR中最小的LEO作为HW高水位,consumer只能消费到HW的数据。ISR中的节点必须与zookeeper保持回话(心跳机制),不能落后 leader的写操作太多,否则被淘汰到OSR。
如何进行选主:动态的ISR集合中的所有follower都可以选举为leader。
-
consumer如何管理offset: (1)当enable.auto.commit=true,consumer端间隔一定的时间自动提交offset;(2)当enable.auto.commit=false,手动提交,通过客户端代码控制offset的提交,设置累加器,按照一个batch批处理来提交offset。
如何保证数据不丢:(1)确保提交offset的准确性:poll完数据之后,处理数据时通过设置1个累加器,按批来手动提交offset,避免由于处理数据异常时由于自动提交offset导致数据丢失;(2)当consumer处理数据异常时,把数据缓存在redis、DB、file或者专门用于存储失败消息的topic中,让其它的consumer专门处理失败的消息。
如何保证数据不重复消费:将consumer处理过的数据添加一个unique key,这样通过判断数据有没有unique key可以判断有没有消费过该数据,避免重复消费。 -
tars如何进行服务发现:Client通过访问名字服务获取到被调服务的地址信息列表,Client再根据需要选择合适的负载均衡方式来调用服务。
tars如何做负载均衡:支持轮询、hash和权重多种方式。tars通过名字服务来实现服务的注册与发现,Client通过访问名字服务获取到被调服务的地址信息列表,Client再根据需要选择合适的负载均衡方式来调用服务。
(1)基于轮询的负载均衡:将请求按照时间顺序逐个分配给请求列表中的每个机器,分配到列表中的最后一个节点后从第一个节点重新开始循环。
(2)基于权重分配的轮询负载均衡算法:每个节点有一个固定的权重,权重表示每个节点可以分配到流量的概率,注意实现平滑的加权轮询。
(3)基于一致性hash的负载均衡:对key求md5值后,取地址偏移做异或操作或者ketama hash。使同一个客户端请求尽可能落在同一个节点上。
参考链接:https://cloud.tencent.com/developer/article/1831219 -
tars线程模型:主要包括主线程、网络线程和业务线程。
-
1个主线程:框架的初始化,业务层初始化,sevant和adapter的管理,epoll模型的创建,业务线程创建,网络线程创建。
-
N个网络线程:调度epoll处理网络事件,socket的accept,read,write,请求报push到接收队列让业务线程处理。
-
M个业务线程:解析请求包,分发到业务层进行处理。
-
其它的线程。
参考链接:https://blog.csdn.net/woshichenweixian/article/details/100628518
![]()
![]()
7.tars服务接口被调用的流程,从TCP收到数据流开始到调用接口:
(1) 调用read把内核空间的数据copy到栈上的临时空间。
(2)把数据append到Connection的缓存中。
(3)拆包,封装成tagRecvData。
(4)把每个tagRecvData包push到临时队列。
(5)把积累一定数量的tagRecvData统一push到Adapter的队列中。


浙公网安备 33010602011771号