- solr云环境相对于solr单机来说,从流程上来说没有什么大的区别,流程都如下图所示
solr云的请求流程如下
具体流程如下
- http请求至SolrDispatchFilter类,执行doFilter方法,解析请求参数
- solrCore处理请求
- 由请求参数中的select方法来定位到SearchHandler类,主要完成下面几件事
- 预处理组件
- 判断是否是分布式处理
- 分布式计算的流程
- 通过状态判断下一步该如何处理,其中以QueryComponent为例
- prepare预处理
- 通过distributedProcess方法来判断当前的状态,包括查询预处理,执行查询,获取查询结果,查询结束等状态,并且封装请求保存在rb.outgoing中
- 通过rb.outgoing中的请求,像所有的分片发送请求数据,以达到分布式请求 (PS,默认情况下是想zookeeper中的分片的状态来发送请求,但是如果做好了分片,而不是用的默认的路由规则的话,这块是可以控制的,详细的部分在后面的分片研究那块会详细的阐述)
- shardHandler1.submit(sreq, shard, params);来实现请求的异步实现,具体的实现就是上面的图片所描述的单机版的请求数据
- handleResponses方法则是将请求的数据进行统一的处理,包括合并
- 对于QueryComponent组件,solr的实现机制分两步
- 1、向各个分片发送请求数据,返回的仅仅是id,而不是完整的document
- 2、在对id进行merge之后,再向各个分片发送请求数据,请求参数为具体的id,从而返回具体的documen
- url测试DEBUG数据如下
- 第一次请求URL
- {distrib=false&wt=javabin&version=2&rows=10&df=text&fl=id,score&shard.url=http://192.168.74.28:6080/solr/collection1/&NOW=1406796966498&start=0&q=*:*&_=1406796959238&isShard=true&fsv=true}
- 第二次请求URL
- {NOW=1406796966498&shard.url=http://192.168.74.28:6080/solr/collection1/&df=text&ids=MK2387151639554990,MK7739703286335635,MK2113017340876208,MK9848660015477862,MK9571458771402159,MK0840088396921094,MK2818128435777676,MK7543970969920737,MK8509213943201612,MK2501104826406886&q=*:*&distrib=false&_=1406796959238&wt=javabin&isShard=true&version=2&rows=10}
由上面总结可以看出,AUS如果需要实现自定义的组件来满足分布式请求的话,需要做好继承并实现下面几个方法
1、prepare
组件预处理,主要需要处理的事包括:具体的参数的设定,请求参数的二次处理
2、process
单机版中具体的组件的处理类,返回处理结果至rb中,该方法是实现的重点
3、distributedProcess
分布式处理,基本上维护状态,目前可以不实现该方法
4、handleResponses
分布式处理,可以实现处理结果的合并,主要通过该方法实现solr云请求
5、finishStage
分布式处理,主要是改变处理的状态值,目前可以不实现该方法。