基于 SpringCloud 微服务架构的广告系统(第三部分:索引构建与检索、binlog更新、Kafka投递)

目录

六、search模块(广告索引)

构建索引示意图(例子)

加载全量索引示意图

binlog构建增量索引

预定义json模板及解析 示意图

binlog解析及Kafka投递 示意图

广告检索服务

媒体方请求、检索服务响应的结构图

检索服务示意图

再次回顾整个编码实现


第一部分:eureka、zuul、通用模块(不讲代码实现,下载代码自己看。)

第二部分:广告投放、微服务调用与断路器(不讲代码实现,下载代码自己看。)

源码 : github https://github.com/yingyingqiqi/luoweiying-ad-spring-cloud/tree/master

这不是一个完整的广告系统,主要涉及两方面  广告检索 、广告投放 ,这两个方面我感觉是最重要的,但是也使用Kafka的消息传递,为剩下的曝光见监测、 报表 、扣费 这三个部分留下了接口。

第三部分:

  1. 介绍广告检索系统的搭建,我们通过构建索引来为广告检索服务;
  2. 使用MySql的Master-Slave协议,通过Slave监听Binlog日志实现数据复制,达到数据一致性的目的;
  3. Kafka投递解析后的binlog日志,方便后续统计业务等,并维持索引(增量索引)。
  4. 检索广告的索引,实现条件匹配,并返回响应;

广告系统架构图

简略的广告系统架构图

六、search模块(广告索引)

构建索引示意图(例子)

为什么不用关系数据库查询进行检索,索引是为广告检索服务的,向数据库查询太慢;用redis缓存也不够快,最快的方法用JVM的内存,这才是最快的。

加载全量索引示意图

通过加载广告投放系统导出的索引表,adxxxtable作为媒介,经过adLevelDataHandler处理 ,转换成AdXXXObject索引表,存入AdxxxIndex的一对多map中,再统一通过DataTable存取。

为什么要导出广告投放系统的索引表,直接通过jdbc获取数据库的信息不好吗??这里为了sponsor广告系统解耦,整个检索服务不对数据库进行操作。

binlog构建增量索引

Binlog 是 MySQL Server 维护的一种二进制日志, 主要是用来记录对 MySQL 数据更新或潜在发生更新的 SQL 语句, 并以
"事务"的形式保存在磁盘中( 文件)

对于Binlog日志的解析过于复杂,以及Binlog日志没有列名等信息(有序号),太复杂,那就分层处理:

  1. mysql-binlog-connector-java ( 监听解析 Binlog 的开源工具)
  2. 使用json文件预先定义模板,内容为要解析Binlog的列,没有定义的不处理。
  3. Binlog 日志Event对象解析 BinlogRowData对象, 再借助json模板文件转换成MySqlRowData对象。
  4. 第三次借助通用模板AdxxxTable,向索引更新方法投递出去

预定义json模板及解析 示意图

binlog解析及Kafka投递 示意图

广告检索服务

我们前面做的增量索引+全量索引 ,为了保存索引与数据库中存储的数据一致性,都是为了检索服务的高效、准确的执行检索,

媒体方请求信息,检索服务响应信息,根据多个索引去筛选匹配广告信息。

媒体方请求、检索服务响应的结构图

检索服务示意图

再次回顾整个编码实现

 

到目前未知,整个基于springCloud微服务架构的广告系统一小部分完成,整个系统中,最重要的是:

检索服务、全量索引、增量索引里面很复杂,很容易绕晕,为了维护索引,在里面使用了binlog日志保存一致性;

为了方便投递增量数据,使用了Kafka;

为了微服务正常运行,使用ribbon、feign通讯,eureka注册,zuul网关,hystrix短路器

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章