前言
我们经常需要根据用户对自己数据的一些操作来做一些事情.
比如如果用户删除了自己的账号,我们就给他发短信骂他,去发短信求他回来.
类似于这种功能,当然可以在业务逻辑层实现,在收到用户的删除请求之后执行这一操作,但是数据库的binlog为我们提供了另外一种操作方法.
要监听binlog,需要两步,第一步当然是你的mysql需要开启这一个功能,第二个是要写程序来对日志进行读取.
mysql开启binlog.
首先mysql的binlog日常是不打开的,因此我们需要:
- 找到mysql的配置文件
my.cnf
,这个因操作系统不一样,位置也不一定一样,可以自己找一下, - 在其中加入以下内容:
1 | 复制代码 |
- 之后重启mysql.
1 | 复制代码/ ubuntu |
- 监测是否开启成功
进入mysql命令行,执行:
1 | 复制代码 |
如果结果如下图,则说明成功了:
- 查看正在写入的binlog状态:
代码读取binlog
引入依赖
我们使用开源的一些实现,这里因为一些奇怪的原因,我选用了mysql-binlog-connector-java
这个包,(官方github仓库)[github.com/shyiko/mysq…]具体依赖如下:
1 | 复制代码<!-- https://mvnrepository.com/artifact/com.github.shyiko/mysql-binlog-connector-java --> |
当然,对binlog的处理有很多开源实现,阿里的cancl
就是一个,也可以使用它.
写个demo
根据官方仓库中readme里面,来简单的写个demo.
1 | 复制代码 public static void main(String[] args) { |
这个完全是根据官方教程里面写的,在onEvent里面可以写自己的业务逻辑,由于我只是测试,所以我在里面将每一个event都打印了出来.
之后我手动登录到mysql,分别进行了增加,修改,删除操作,监听到的log如下:
1 | 复制代码00:23:13.331 [main] INFO util.MysqlBinLog - Event{header=EventHeaderV4{timestamp=0, eventType=ROTATE, serverId=1, headerLength=19, dataLength=28, nextPosition=0, flags=32}, data=RotateEventData{binlogFilename='mysql-bin.000001', binlogPosition=886}} |
根据自己的业务,封装一个更好使,更定制的工具类
开始的时候打算贴代码的,,,但是代码越写越多,索性传在github上了,这里只贴部分的实现.代码传送门
实现思路
- 支持对单个表的监听,因为我们不想真的对所有数据库中的所有数据表进行监听.
- 可以多线程消费.
- 把监听到的内容转换成我们喜闻乐见的形式(文中的数据结构不一定很好,我没想到更加合适的了).
所以实现思路大致如下:
- 封装个客户端,对外只提供获取方法,屏蔽掉初始化的细节代码.
- 提供注册监听器(伪)的方法,可以注册对某个表的监听(重新定义一个监听接口,所有注册的监听器实现这个就好).
- 真正的监听器只有客户端,他将此数据库实例上的所有操作,全部监听到并转换成我们想要的格式
LogItem
放进阻塞队列里面. - 启动多个线程,消费阻塞队列,对某一个
LogItem
调用对应的数据表的监听器,做一些业务逻辑.
初始化代码:
1 | 复制代码 public MysqlBinLogListener(Conf conf) { |
注册代码:
1 | 复制代码 public void regListener(String db, String table, BinLogListener listener) throws Exception { |
在这个步骤中,我们在注册监听者的同时,获得了该表的schema信息,并保存到map里面去,方便后续对数据进行处理.
监听代码:
1 | 复制代码 @Override |
我偷懒了,,,这里面只实现了对添加操作的处理,其他操作没有写.
消费代码:
1 | 复制代码 |
消费时,从队列中获取item,之后获取对应的一个或者多个监听者,分别消费这个item.
测试代码:
1 | 复制代码 public static void main(String[] args) throws Exception { |
在这段很少的代码里,注册了两个监听者,分别监听student
和teacher
表,并分别进行打印处理,经测试,在teacher
表插入数据时,可以独立的运行定义的业务逻辑.
注意:这里的工具类并不能直接投入使用,因为里面有许多的异常处理没有做,且功能仅监听了插入语句,可以用来做实现的参考.
参考文章
cloud.tencent.com/developer/a…
ChangeLog
2019-04-30 完
2019-05-01 使用Multimap替换Map>
以上皆为个人所思所得,如有错误欢迎评论区指正。
欢迎转载,烦请署名并保留原文链接。
更多学习笔记见个人博客——>呼延十
本文转载自: 掘金