MySQL-fifo-Plugin進(jìn)程間通信解決方案
MySQL fifo Plugin 是數(shù)據(jù)庫(kù)與其他第三方應(yīng)用程序進(jìn)程間通信解決方案。
1. 背景
你是否有這樣的需求:
你需要監(jiān)控訪問(wèn)網(wǎng)站的IP,當(dāng)同一個(gè)IP地址訪問(wèn)次數(shù)過(guò)多需要做出處理,例如拉黑,直接丟進(jìn)iptables 防火墻規(guī)則連中。你的做法只能每個(gè)一段時(shí)間查詢一次數(shù)據(jù)庫(kù),并且判斷是否滿足拉黑需求?
你是否需要監(jiān)控某些數(shù)據(jù)發(fā)生變化,并通知其他程序作出處理。例如新聞內(nèi)容修改后,需要立即做新頁(yè)面靜態(tài)化處理,生成新的靜態(tài)頁(yè)面
你使用數(shù)據(jù)庫(kù)做隊(duì)列,例如發(fā)送郵件,短信等等。你要通知發(fā)送程序?qū)δ切┦謾C(jī)或者短線發(fā)送數(shù)據(jù)
2. 解決思路
需要讓數(shù)據(jù)庫(kù)與其他進(jìn)程通信,傳遞信號(hào)
例如,發(fā)送短信這個(gè)需求,你只要告訴發(fā)短信的機(jī)器人發(fā)送的手機(jī)號(hào)碼即可,機(jī)器人永遠(yuǎn)守候那哪里,只要命令一下立即工作。
監(jiān)控?cái)?shù)據(jù)庫(kù)變化的需求原理類(lèi)似,我們需要有一個(gè)守護(hù)進(jìn)程等待命令,一旦接到下達(dá)命令便立即生成需要的靜態(tài)頁(yè)面
這里所提的方案是采用 fifo(First In First Out) 方案,通過(guò)管道相互傳遞信號(hào),使兩個(gè)進(jìn)程協(xié)同工作,這樣的效率遠(yuǎn)比定時(shí)任務(wù)高許多。fifo 是用于操作系統(tǒng)內(nèi)部進(jìn)程間通信,如果跨越操作系統(tǒng)需要 使用Socket,還有一個(gè)新名詞MQ(Message queue).
這里只做 fifo 演示, 將本程序改為 Socket 方案,或者直接集成成熟的 MQ 也是分分鐘可以實(shí)現(xiàn)。
3. Mysql plugin
我開(kāi)發(fā)了幾個(gè) UDF, 共4個(gè) function
UDF
- fifo_create(pipename)
-
創(chuàng)建管道.成功返回true,失敗返回flase.
- fifo_remove(pipename)
-
刪除管道.成功返回true,失敗返回flase.
- fifo_read(pipename)
-
讀操作.
- fifo_write(pipename,message)
-
寫(xiě)操作 pipename管道名,message消息正文.
有了上面的function后你就可以在begin,commit,rollback 直接穿插使用,實(shí)現(xiàn)在事物處理期間做你愛(ài)做的事。也可以用在觸發(fā)器與EVENT定時(shí)任務(wù)中。
4. plugin 的開(kāi)發(fā)與使用
編譯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文件復(fù)制到 /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;
