基于canal的缓存系统
- 2019-04-11 22:17:00
- CJL 原创
- 4044
背景
积累多年的系统中往往缺少事件驱动思想、与基础组件。当我们想进行异构数据同步、监听某个接口数据的时候就变得异常困难。团队之间缺少统一的事件通知机制,消息队列、接口通知等方式繁杂不统一,且团队合作难度较大。
这时候一种基于数据库的数据通知机制便是一种成本比较低的选择。我们通过数据库变化事件进行业务通知,通过代理层将消息转到消息队列、业务接口、redis缓存等,结合后续的业务代码可以很轻松的实现业务数据缓存层,也可以替代一部分api业务触发的场景,提高系统性能,实现非核心业务异步话。
架构
通过canal实现数据库的数据监听(canal可以通过伪装成从库的方式实现多个数据库的监听)
通过canal客户端实现事件的转发,将数据事件转发到MQ、Redis、文件等地方
业务代码通过消息队列监听等方式对具体事件进行处理
缓存系统实现
主要包含两部分canal客户端开发和缓存管理系统开发。canal客户端比较简单,可以根据实际需要进行一部分实现。缓存系统设计需要能够数据定义、数据源、数据刷新机制等。
数据源:数据计算方法,可以是api、数据库、redis、计算等。
数据刷新:消息队列更新、api通知更新
数据有效期:有效期更新算法(热点数据延长有效期、随机刷新、主动失效等)
代码实现
实现中
相关系统安装
mariadb安装:https://www.cnblogs.com/freelandun/p/7841640.html
主从同步配置:https://www.cnblogs.com/liaojie970/p/6198547.html
binlog需要设置为row模式,后续canal才能活动到具体数据
多源复制:https://blog.51cto.com/suifu/1830682 未成功
canal简介:https://www.cnblogs.com/scote/p/5959205.html
rabbit安装:https://blog.csdn.net/yexiaomodemo/article/details/80473411 docker更快 https://www.jianshu.com/p/14ffe0f3db94
rocketmq安装docker https://github.com/apache/rocketmq-externals/tree/master/rocketmq-docker/4.4.0
docker exec -ti rmqbroker sh ./tools.sh org.apache.rocketmq.example.quickstart.Producer
docker exec -ti rmqbroker sh ./tools.sh org.apache.rocketmq.example.quickstart.Consumer
rocket管理界面安装 https://blog.csdn.net/jiangyu1013/article/details/82414932 http://192.168.1.110:8088/#/
canal 客户端代码:https://blog.csdn.net/hblfyla/article/details/72877760
注意:依赖
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>15.0</version>
</dependency>
<dependency>
<groupId>com.alibaba.otter</groupId>
<artifactId>canal.client</artifactId>
<version>1.0.25</version>
</dependency>
canal用户需要设置权限(需要查询权限)mysql高版本会出现权限不足的情况,需要GRANT ALL
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;