------------------Dubbo---------------
Dubbo通讯协议实现的RPC调用的真正原理?(最重点)
巧记版:
1)客户端用唯一ID与请求报文+callback放入全局ConcurrentHashMap,然后再封装ID+报文进连接对象发起异步调用,然后当前线程A开始wait等待服务端的回调。
2)服务端收到请求后把带这个ID的结果返回给客户端。
3)客户端socket连接里,专门监听消息的线程收到消息后,拿到ID从ConcurrentHashMap取出callback,并把返回结果放进callback,然后通过notifyAll()唤醒之前客户端等待的线程A,线程A醒了之后,重新执行callback.get()去抓取刚刚放进去的结果,整个调用完成。
009、看过Dubbo源码吗?说说Dubbo的底层架构原理?(附10层)
dubbo 工作原理10层:
第一层:service 层,接口层,给服务提供者和消费者来实现的
第二层:config 层,配置层,主要是对 dubbo 进行各种配置的
第三层:proxy 层,服务代理层,无论是 consumer 还是 provider,dubbo 都会给你生成代理,代理之间进行网络通信
第四层:registry 层,服务注册层,负责服务的注册与发现
第五层:cluster 层,集群层,封装多个服务提供者的路由以及负载均衡,将多个实例组合成一个服务
第六层:monitor 层,监控层,对 rpc 接口的调用次数和调用时间进行监控
第七层:protocal 层,远程调用层,封装 rpc 调用
第八层:exchange 层,信息交换层,封装请求响应模式,同步转异步
第九层:transport 层,网络传输层,抽象 mina 和 netty 为统一接口
第十层:serialize 层,数据序列化层
------------------zk---------------
过半选举算法实现原理?
------------------redis---------------
------------------MQ---------------
------------------ES---------------
ES是java写的,看完源码后
14_分布式搜索引擎的架构是怎么设计的?为啥是分布式的?
15_分布式搜索引擎增删查改的工作流程及原理是什么样的?(读写的原理--写详细原理也介绍了)
参考:https://yq.aliyun.com/articles/706605
1、单条数据的写和读的简单过程:
都会拿docid做hash,得到对应的分片编号,然后再去找此分片编号下的主或副本分片
2、全文收索的简单过程
3. ES 删除数据的执行流程
将对应doc在.del文件里标识为deleted态,那么搜索的时候根据.del文件就知道该doc已被删除,不会返回,merge磁盘文件时也会把标记在.del里的真正的从磁盘上删除
4.ES 更新数据的执行流程
将原来的doc标识为deleted状态,然后新写入一条数据
5、写的详细原理-----结合四大核心讲解:有4个底层的核心概念,refresh、flush、translog、merge------
以写底层原理为例讲解:
1、refresh---写时直接生成数据文件,先存入buffer(这里是不能被搜索到),数据默认每1s刷到os cache(refresh)才能被收索到,并且有数据才refresh.---解决延迟1S方案:可以通过ES的RESRful API或者Java API,手动执行一次refresh,即手动将buffer中数据刷入os cache
2、flush----30分钟(或translog到达阀值)一次,先refresh到os cache做一次,将os cache中所有数据都fsync到磁盘,然后把磁盘记录的新文件通过commit point标识写到磁盘,且清空translog
3、translog---写时直接生成数据日志translog,直接进入os cache,translog默认每5s刷到磁盘(flush)---解决宕机丢5秒数据的方案:设置每次写入一条数据都flush translog操作
4、merge---segment file磁盘文件达到阀值时,会merge,此时就会将标识为deleted的doc给物理删除。(del文件里标记了删除的docid)
ES的持久化、延迟和数据丢失问题讲一下?
持久化:就是translog的作用就是持久化,如果os cache和buffer丢了,可以用5秒前写入物理磁盘的那些translog做恢复(5秒内还没写入磁盘,自身也有丢失风险)
延迟问题:1、refresh---写时直接生成数据文件,先存入buffer(这里是不能被搜索到),数据默认每1s刷到os cache(refresh)才能被收索到,并且有数据才refresh.---解决延迟1S
方案1:可以通过ES的RESRful API或者Java API,手动执行一次refresh,即手动将buffer中数据刷入os cache
方案2:通过参数index.refresh_interval
来修改这个刷新间隔时间
附:间隔设置成-1来临时关闭refresh,不自动刷新入os cache
丢失问题:
translog---写时直接生成数据日志translog,直接进入os cache,translog默认每5s刷到磁盘(flush)---解决宕机丢5秒数据的方案:设置每次写入一条数据都flush translog操作
ES调优讲一下?
------------------JVM---------------
讲一下类加载器原理的理解?