1. kafka

Kafka SASL认证授权(五)ACL源码解析

一、ACL检查流程解析

一起看一下kafka server的启动与监听流程:

Kafka -> KafkaServer -> SocketServer、KafkaRequestHandler

其中KafkaServer做相关的初始化,包括SocketServer 与 handler pool。

SocketServer的start up流程

看一下acceptor

acceptor实际执行流程:监听网络事件,提交给processor处理

看一下processor,截取KafkaServer代码:这边的numIoThreads就是配置的具体处理线程数量。KafkaApis封装具体的各api的处理逻辑,handler pool则是工作线程池。

看看kafkaApis

接着看pool中每个线程的while循环,从request队列拿一个请求,调用apis处理,结果发送给对应channel。

request的入队,见SocketServer,这里也可以看到acl使用的principal和sasl认证是同一个。

之前我们看到,在selector做channel初始化时,已经做了sasl认证。那acl在哪里处理?KafkaApis。以offset commit为例

看一下,这边的authorize,各api共用的方法。构建resource pattern,即资源描述,以及对应的操作。然后使用authorizer实现类进行处理。

看一下鉴权实现类AclAuthorizer,初始化,主要是zk相关的监听,因为token,user,acl都存在zk。

遍历每个action

每个action的检查,区分超管,否则根据acl进行匹配。使用acl 缓存,结合zk的linstener更新缓存。不管是否开启acl,都会去取acl缓存列表。

二、总结

kafka以事件、线程池的方式,对接口请求做处理。

每个api请求,都会做相关的acl校验,不管是否开启acl,都会去取acl缓存列表。差别在于是否使用acl cache map对action进行匹配,匹配本身是用遍历的方式,action不多的话,对吞吐的影响可以忽略不计。

网上有一篇性能测试:见这里

Comments to: Kafka SASL认证授权(五)ACL源码解析

Your email address will not be published. Required fields are marked *