MySQL-fifo-Plugin进程间通信解决方案
MySQL fifo Plugin 是数据库与其他第三方应用程序进程间通信解决方案。
1. 背景
你是否有这样的需求:
你需要监控访问网站的IP,当同一个IP地址访问次数过多需要做出处理,例如拉黑,直接丢进iptables 防火墙规则连中。你的做法只能每个一段时间查询一次数据库,并且判断是否满足拉黑需求?
你是否需要监控某些数据发生变化,并通知其他程序作出处理。例如新闻内容修改后,需要立即做新页面静态化处理,生成新的静态页面
你使用数据库做队列,例如发送邮件,短信等等。你要通知发送程序对那些手机或者短线发送数据
2. 解决思路
需要让数据库与其他进程通信,传递信号
例如,发送短信这个需求,你只要告诉发短信的机器人发送的手机号码即可,机器人永远守候那哪里,只要命令一下立即工作。
监控数据库变化的需求原理类似,我们需要有一个守护进程等待命令,一旦接到下达命令便立即生成需要的静态页面
这里所提的方案是采用 fifo(First In First Out) 方案,通过管道相互传递信号,使两个进程协同工作,这样的效率远比定时任务高许多。fifo 是用于操作系统内部进程间通信,如果跨越操作系统需要 使用Socket,还有一个新名词MQ(Message queue).
这里只做 fifo 演示, 将本程序改为 Socket 方案,或者直接集成成熟的 MQ 也是分分钟可以实现。
3. Mysql plugin
我开发了几个 UDF, 共4个 function
UDF
- fifo_create(pipename)
-
创建管道.成功返回true,失败返回flase.
- fifo_remove(pipename)
-
删除管道.成功返回true,失败返回flase.
- fifo_read(pipename)
-
读操作.
- fifo_write(pipename,message)
-
写操作 pipename管道名,message消息正文.
有了上面的function后你就可以在begin,commit,rollback 直接穿插使用,实现在事物处理期间做你爱做的事。也可以用在触发器与EVENT定时任务中。
4. plugin 的开发与使用
编译UDF你需要安装下面的软件包
sudo apt-get install pkg-config sudo apt-get install libmysqlclient-dev sudo apt-get install gcc gcc-c++ make automake autoconf
https://github.com/netkiller/mysql-fifo-plugin
编译udf,最后将so文件复制到 /usr/lib/mysql/plugin/
git clone https://github.com/netkiller/mysql-image-plugin.git cd mysql-image-plugin gcc -O3 -g -I/usr/include/mysql -I/usr/include -fPIC -lm -lz -shared -o fifo.so fifo.c sudo mv fifo.so /usr/lib/mysql/plugin/
装载
create function fifo_create returns string soname 'fifo.so'; create function fifo_remove returns string soname 'fifo.so'; create function fifo_read returns string soname 'fifo.so'; create function fifo_write returns string soname 'fifo.so';
卸载
drop function fifo_create; drop function fifo_remove; drop function fifo_read; drop function fifo_write;