1) Solr服务 i. Solr是什么? 1. 它是基于Lucene的全文检索服务器,solr提供了比lucene更为丰富的查询语言,同时实现了可配置,可扩展,并对索引,搜索性能进行了优化。Solr可以独立运行在servlet容器中。Solr提供了一个管理界面,通过管理界面可以查询solr的配置和运行情况。 ii. 项目中那些地方用到了solr? 1. 我们的项目单独搭建了一个solr服务,搜索服务工程,搜索系统。 iii. 为什么要使用solr? 1. solr相对比于Lucene,它是一款企业级的搜素引擎系统,可以独立运行,通过solr可以非常快速的构建企业的搜索引擎,通过solr也可以高效的完成站内搜索功能;而Lucene是一个全文检索引擎工具包,它不是完整的全文检索引擎。 2. solr和elasticsearch对比: a) solr利用zookeeper进行分布式管理,而elasticsearch自身带有分布式协调管理功能 b) solr支持更多格式的数据,而es仅支持json文件格式 c) solr官方提供的功能更多,而es本身更注重于核心功能,高级功能多由第三方插件提供 d) solr在传统的搜索应用中表现好于es,但是在处理实时搜索应用时效率明显低于es e) solr是传统搜索应用的有力解决方案,但es更适合于新兴的实时搜索应用 f) solr成熟,稳定,再不考虑建索引时,其效率更快,故而我们的项目选用solr, g) 主要原因也是因为我们做的其实也是一个传统电商项目,不设计太多实时搜索。 iv. 怎么使用的solr? 1. 安装solr服务器,需要jdk1.7及其以上环境 2. 需要一个servlet容器,我们采用tomcat 3. 搭建solr集群,需要4个tomcat实例,4个solrhome,3个zookeeper节点。 4. 配置zookeeper,在每一个zookeeper里面创建一个data目录,并且创建一个myid,修改zoo.xml中的端口号、dataDir、文件尾部添加server的信息 5. 配置4个tomcat:修改端口号,需要把solr.war包复制过来,修改solr的家目录,修改每一个solrhome里的solr.xml,修改tomcat/bin/Catalina.sh添加一个JAVA_OPTS 6. 关联zookeeper和solor:使用zkcli.sh -zkhost zookeeper的主机端口号 -cmd upconfig -confdir solorhome的conf目录 -confname 文件名; 7. 添加分词器 8. 添加项目所需的域字段:商品id、商品标题、商品买点、商品价格、商品图片、分类名称、商品描述 9. collection分片 10. 在项目中于spring整合,配置一个cloudSolrServer的bean,需要bean中指出zkhost和使用的collection 11. 在使用时我们使用cloudSolrServer的父接口solrserver。 12. 为域字段创建一个实体SearchItem便于封装数据 13. 服务层使用步骤: a) 创建一个solrserver对象 b) 为每一个商品创建一个solrinputdocument对象 c) 为文档添加域 d) 向索引库中添加文档 14. 表现层使用步骤: a) 创建一个solrserver对象 b) 创建一个solrquery对象 c) 需要设置查询条件,分页条件,设置默认搜索域,高亮设置等 d) 执行查询,返回queryResponse对象 e) 取返回结果封装到list<searchItem>中 f) 返回查询结果的总记录数,计算查询结果总页数 g) 得到查询结果 v. 使用solr存在什么问题? 1. 索引库和数据库同步问题 2. 解决:使用activeMQ,当我们添加修改删除商品时发送一条topic消息,在我们的搜索服务里需要写一些商品变化监听,当发出消息后我们应该执行那些具体的操作,如接受到商品添加的消息,这向索引库中添加当前商品的信息。 2) ActiveMQ(消息队列) i. 什么是activemq? 1. 开源的消息总线 2. 特点 a) 多种语言和协议编写客户端。 b) 完全支持jms1.1和j2ee1.4规范(持久化,xa消息,事务) c) 对spring支持 d) 支持ajax 3. 消息传递形式: a) 点对点模式:一个生产者一个消费者 b) 发布订阅模式:一个生产者多个消费者 c) Jms消息格式:StreamMessage、mapMessage,textMessage(常用)、objectMessage、bytesMessage 4. 在linux在安装启动即可 ii. 项目中什么地方使用了activeMQ? 1. 在对商品执行添加修改删除功能操作时,使用activeMQ发出一条商品具体变化的消息,如增加一个商品,发出一条商品增加的消息textMessage(包含一个商品id),在搜索服务层监听接收消息,根据消息包含的商品id查询数据库,再将对应的商品同步到索引库。 iii. 为什么要使用activeMQ 1. 以往在业务逻辑中添加一个同步业务逻辑,这样做的缺点是,业务逻辑耦合度高,业务拆分不明确 2. 业务逻辑和调用服务分开实现,业务逻辑达到了分开,但是服务间的耦合变高,服务的启动还有先后顺序。 3. 故而引用activeMQ,activeMQ是一个消息中间件,这样可以使我们的服务之间完成解耦。 iv. 怎么使用的ActiveMQ? 1. 使用activeMQ需要有一个生产者producer和consumer,最重要的是一个JMSTemplate模板 2. 发送端Spring整合ActiveMQ(抽象工厂设计模式) a) 配置一个真正可以生产Connection的工厂ActiveMQConnectionFactory,需要指定borkerURL(activeMQ服务的主机号和端口) b) 配置一个用于管理具体工厂的抽象工厂,需要引用真正的工厂 c) 配置jms模板,它可以进行消息发送、接收等,,需要给它指定引用connectionFactory d) 配置消息的模式)(queue----ActiveMQQueue或者topic----ActviveMQTopic) e) 服务层发送消息直接使用JmsTemplate调用send方法发送消息 3. 消息接收端Spring整合ActiveMQ a) 写一个监听器监听消息的类,这个类需要实现MessageListener接口,这个类中接收消息,取消息包含的信息再去操作具体业务 b) 与发送端的spring的整合大体与发送端一致,但是还需要配置自定义监听器和监听器容器,在监听器容器中需要指定连接工厂、消息模式和监听器 v. 使用ActiveMQ存在什么问题? 1. 怎样保证消息必达 a) 消息落地,就是把消息保存到数据库,这也解决了消息服务器宕机的问题 b) 消息超时、重传、确认,增加一些方法,解决消息丢失和是否确认收到消息
|