写在前面 —— 本文源码
在使用ElasticSearch(下文简称es)经常会遇到将本地库的数据传入的es中进行索引.我们在完成批量同步的时候可以使用官方提供的logstash来进行同步,也可以自己编写java api 利用es的blak进行批量同步.
在实际生产中利用es做搜索引擎,将数据库中的数据索引到es中,在这种情况下需要的是实时性和更高的操作性,有如下几种方法可以完成:
- 使用数据库二进制监控(中间件)
- 使用一些数据库二进制文件监控中间件,通过监控数据库的二进制文件来判断数据库发生的增删改查,从而去动态的更新es中的索引信息例如阿里的精卫,等二进制日志监控组件.
- 使用消息转发(消息中间件)
- 通过RabbitMq或者是消息队列将需要索引到es的数据上报给search服务然后在服务里使用es的api进行操作将数据索引到es上.
涉及到的技术
- ElasticSearch:2.3.2(有待升级,emmmm和老大说了好久终于准备升级到最新版本了,所以涉及到的很多api可能都用不了了,这里暂时就先用SpringBoot提供的jpa简单操作下~~毕竟没有涉及到搜索,目前只是对数据进行索引.
- Spring Boot:1.5.10
- RabbitMq:Spring Boot封装的api
- FastJson:阿里的json操控包
- 命令模式:为了统一规范化,在search服务中使用命令模式定义各种操作命令,之后进行组装来完成对es的操作.
简单的架构图和数据流图
命令模式简介
模式结构
命令模式包含如下角色:
- Command:抽象命令
- ConcreteCommand:具体命令类
- Invoker:调用者
- Receiver:接收者
- Client:客户类意图
命令模式(Command Pattern):将请求封装为一个对象,从而使我们可用不同的请求对客户进>行参数化;队请求排队或者记录请求日志,以及支持可撤销操作.命令模式是一种对象行为模式,泣别名为动作(Action)模式或事物(Transaction)模式.
模式结构
命令模式包含如下角色:
- Command:抽象命令
- ConcreteCommand:具体命令类
- Invoker:调用者
- Receiver:接收者
- Client:客户类适用情况
- command模式类似于过程语言中的回调,command是将回调通过面向对象的方式来实现,在我们需要将方法提前设计出来在需要的时候被调用,此时我们就可以使用命令模式.
- 在不同的时刻指定,排序和执行请求.一个Command队想可以有一个与初始请求无关的生存周期.如果一个请求的接受者可以用一种与地址空间无关的方式表达,那么就可以将请求的命令传送到另一个不同的进程并在那实现请求.
- 支持取消的操作.再设计Command的接口可以设计一个Unexcute用来实现将上一部的执行取消的操作.通过excute和unexcute来控制命令的执行效果.
- 支持修改日志.在使用命令模式的时候我们可以添加一个存储设备将执行的操作存储起来以防止系统down机的时候进行回复.
- 用来在源操作语言上构建更高层的操作系统.命令模式是一种典型的支持事务的设计模式
- 通过一个Command借口来进行建模.
效果
Command有如下的效果:
1. Command将调用操作的对象与如何实现该操作的对象进行解耦.
2. Command是头等对象他可以被扩展和操控.
3. 可以将多个命令集合起来变成一个组合命令.
4. 新增一个Command很容易因为他是头等类无需改变任何代码.