5

1、能否简单描述下reactor线程模型?

三个点,事件驱动、一个或者多个数据源、多路复用
事件驱动简单理解 :
场景1 : 比如说小A HR要招聘一个NB的程序员,既要Java基础厉害,又涉及大数据领域(不单单只会皮毛的)的人,突然小A在xxx
招聘网站看到了一个小B,发现小B就是我想要找的人哈,怎么办?打个电话吧?嘟嘟嘟...,接通了,聊了聊,挺好,过来上班吧
场景2 : 还有一种情况就是,小A和小B聊了聊,小A说,你先关注订阅一下我们公司,我们有新消息了通知你,因为我自己做不了主,需要主管看看,
一个时间,主管看了看,桌子一拍,唉吆喂,这不就是我想要找的人么,回调发一个邮件,来上班吧,小A收到邮件,高高兴兴来上班了

同步理解消息驱动 :
HR 小A在各种招聘网站都看,要么Java基础不行的,要么大数据不会的,肿么办?要不在xxx上发布一个招聘消息吧,一旦有这样能力的人看到,说不定会联系我

总结 :
简单理解 : 事件驱动就是我是主动的,比如说RPC,我主动来调用你,你有事件通知我 ; 消息驱动,我把消息处理完毕了,放到这里了,你想消费就消费哈

一个或者多个数据源 : NIO 多路复用可以支持百万client连接,接受客户端的Accept、Read、Write事件

多路复用 : client channel的注册到一个selector,轮询channel事件,事件处理

2、Kafka的 reactor线程模型能说说么?最好画个图吧?

7,Reactor线程模型.png
简单说说,Acceptor线程疯狂的接受客户端的连接,come on,来和我建立连接吧,Acceptor拥有Processor线程的引用,过来了,是吧。
好,打入到Processor线程中,不断的轮询打。一旦客户端有新的事件,我要读,好,Processor线程感知到了,然后又摔到一个线程安全的队列中,Handler线程池中,感知到了,会从队列中获取,比如说真正的IO操作(磁盘读/写操作,可能很浪费时间,没事,搞到线程池中,你干你的,不要阻塞我上游的线程),一旦Handler线程操作完成,因为Handler线程拥有Processor中的响应队列引用,直接写回去,Processor线程在轮询的时候,吆,Handler处理完毕了,好吧,我写给客户端,好的,客户端完成了一次读取操作

欢迎点赞加关注,用最简单的话,聊晦涩难懂的技术


journey
32 声望20 粉丝

« 上一篇
MySQL原理