整体架构
依据解决复杂问题应当先化繁为简的原则,这里首先对服务进行拆分。
graph TB client[客户端] sh[Searchhub] admin[后台] internal[后台服务] sync[数据同步服务] es[Elasticsearch] cache[Cache] mysql[Mysql] src((源数据)) client --搜索&推荐--> sh sh --用模板搜索--> es sh --kv读写--> cache sh --sql只读--> mysql admin --内部体验&管理数据--> internal internal --用模板搜索&运营字段更新--> es internal --运营数据更新--> mysql internal --刷缓存--> cache src --定时--> sync sync --写入\更新--> es
按照数据流向可以将整个服务划分为三个部分(参考图中箭头指向):
- 前台服务 – 以searchhub为中心,将多方数据源的数据进行组织整理后返回给用户。
- 后台服务 – 以数据运营管理为主,让运营者有机会影响前台服务,进而达到运营的目的。
- 数据同步服务 – 让源数据与业务数据保持同步更新。
数据同步服务
数据同步服务的目标就是让用于搜索的源数据能够与业务数据保持同步。
逻辑上可以划分为触发和写入两个步骤。
graph LR 入口 --触发--> 新数据 新数据 --写入--> Elasticsearch
触发形式通常有两种:
对比 | 主动探测 | 被动通知 |
---|---|---|
实现方式 | 定时运行 | 订阅事件 |
业务方支持 | 支持增量查询 | 提供消息订阅 |
实时性 | 定时周期决定 | 消息处理时间决定 |
回滚方式 | 调整查询游标 | 调整消费位置 |
回滚范围 | 全部 | 队列长度 |
瓶颈 | 增量查询效率 | 数据更新频率 |
两种触发形式各有优劣,可以根据实际情况选择实现。
当获取到需要更新的数据后,只需要将其转化成需要的形式写入(更新)到Elasticsearch。
前台服务
前台服务,主要是通过Searchhub提供一系列接口供业务方调用,进而产品化后提供给客户端。
Searchhub需要提供以下接口。
搜索
- 输入:搜索词、附加参数(分页、分类等)
- 返回:搜索结果
推荐
- 输入:内容id、用户id、附加参数(数量、策略等)
- 返回:推荐结果
热搜
- 输入:无
- 返回:热搜结果
后台服务
后台服务需要实现以下功能。
管理数据结构和索引
对于index的setting和mapping的管理,接入后台方便开发和运营。
查询源数据
通过指定属性查询源数据,可用于后面的编辑。
管理源数据运营相关字段
对于源数据中一些用于运营的字段,可以通过后台直接编辑修改。
管理搜索模板
对于搜索模板的历史版本进行管理。可以直接修改线上所使用的模板版本。
预览搜索效果
可以指定模板版本进行搜索。以达到上线前预览的效果。
管理屏蔽词
对屏蔽词进行管理。
管理缓存
查询和清除缓存。