データベースプロセス間通信ソリューションのMQ

7096 ワード

目次
  • 1.背景
  • .アプリケーションシーン
  • .Mysql plugin
  • .pluginの開発と使用
  • .プラグインの使い方
  • 1. 背景
    前に記事を発表しました.http://netkiller.github.io/journal/mysql.plugin.fifo.html
    この記事では、fifoパイプを介してデータベースと他のプロセスとの通信を実現することを提案しています.IPC機構(同じOS/サーバー内)に属しています.ZeroMQを採用してRPCシステムを再実現しました.IPC対応(OS/サーバを横断)
    各種略語のフルネームIPC(IPC:Inter-Parocess Communicationプロセス間通信)、ITC(ITC:Inter Thread Communicationスレッド間通信)とRPC(RPC:Remote Procesdule Calls遠隔プロセス呼び出し).
    サポートプロトコル
    inproc://my_publisher
    tcp://server001:5555
    ipc:///tmp/feeds/0
    2. アプリケーションシーン
    データを処理する場合、様々な理由でプログラムでは実現できません.このプラグインを使ってもいいです.データベース内のデータが変化したときに何らかの操作を行います.このプラグインを使うことができます.
    あなたのプロジェクトは外注かもしれません.プロジェクトが終わったら、外注先はあなたを管理しません.既存のコードを変えることができないかもしれません.このプラグインは使えます.
    MQ技術を採用してデータベースに対していかなる圧力がなくて、プログラムを採用して処理するのと違いがなくて、コードを書くことを省きました.
    処理方法は、同期または非同期方式を採用することができる.
    例 1. メールを送る
    メール、メールを送るには、対応する携帯電話番号を調べて、MQのサービス先に送信し、サーバーが携帯電話番号を受信したら、キューに入れて、マルチスレッドプログラムがキューからジョブを受け取り、メールを送ります.
    select zmq_client('tcp://localhost:5555',mobile) from demo where subscribed='Y' ...;
    複数のパラメータを転送して、記号で区切ることができます.
    select zmq_client('tcp://localhost:5555',concat(name,',',mobile,', news')) from demo;
    select zmq_client('tcp://localhost:5555',concat(name,'|',mobile,'|news')) from demo;
    Jsonフォーマット
    select zmq_client('tcp://localhost:5555',concat('{name:',name,', tel:',mobile,', template:news}')) from demo;
    非同期方式を採用することを提案します.MQ端末は任務を受信したらすぐに「成功」の情報をフィードバックします.成功を送信できるかどうかはあまり気にしていません.携帯電話の番号が使えているかどうかは分かりません.メールやメールの送信率は100%ではないので、列に入ったら、プログラムを自分で処理します.成功または失敗の情報をログに記録すればいいです.
    例 2. 画像を処理
    まず、画像を処理する必要があると照会し、MQの他端に経路と解像度を渡す処理プログラム.
    select zmq_client('tcp://localhost:5555',concat(image,',800x600}')) from demo;
    非同期方式を採用することを提案します.MQ側はタスクを受信したらすぐに「成功」情報をフィードバックします.
    例 3. 身分証番号チェック
    select zmq_client('tcp://localhost:5555',id_number) from demo;
    MQモデルの処理はほとんど遅延しないので、直接的に構造をフィードバックします.
    例 4. スタティック化ケース
    情景シミュレーションでは、あなたのプロジェクトはあなたのエレクトビジネスプロジェクトです.オフショア開発を採用して、プロジェクトはすでに開発されました.外注はもうメンテナンスを担当しません.今は静的にします.この機能を追加して、多くの商品表に関する作成を確認してください.
    コードの変更よりも、プログラムが外部から処理される方が安全です.私たちはプログラムを書いて動的URLを静的に保存すればいいです.データが変化したら上書きを再ダウンロードすればいいです.
    CREATE DEFINER=`dba`@`%` TRIGGER `demo_after_insert` AFTER INSERT ON `demo` FOR EACH ROW BEGIN
    	select zmq_client('tcp://localhost:5555', NEW.id);
    END
    CREATE DEFINER=`dba`@`%` TRIGGER `demo_after_update` AFTER UPDATE ON `demo` FOR EACH ROW BEGIN
    	select zmq_client('tcp://localhost:5555', NEW.id);
    END
    CREATE DEFINER=`dba`@`%` TRIGGER `demo_after_delete` AFTER DELETE ON `demo` FOR EACH ROW BEGIN
    	select zmq_client('tcp://localhost:5555', NEW.id);
    END
    MQ他端のサービスはダウンロードできます.http://www.example.com/goods.php?cid=111&id=100を選択して、htmlページを生成し、http://www.example.com/111/100.html
    新しいページを挿入します.更新はページを上書きします.削除はページを削除します.
    このように商品の価格、属性の変化に関わらず、静的なプロセスは相応の処理を行います.
    例 5. データ同期事例
    私達は複数のデータベースを持っています.Aライブラリの中のデータが変化したら、Bライブラリに同期したり、処理結果を処理したり、データ変換して他のデータベースに書き込んだりします.
    方法も触発器やEVENTで処理します.
    3. Mysql plugin
    いくつかのUDFを開発しました.全部で4つのfunctionです.
    UDF
    zmqclient(sockt,message)
    sockt.trueに戻りました.失敗してflasheに戻りました.
    上のfunctionがあれば、begin、comit、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 cmake
    https://github.com/netkiller/mysql-zmq-plugin
    udfをコンパイルして、最後にsoファイルを/usr/lib/mysql/plugin/にコピーします.
    git clone https://github.com/netkiller/mysql-zmq-plugin.git
    cd mysql-zmq-plugin
    
    cmake .
    make && make install
    読み込み
    create function zmq_client returns string soname 'libzeromq.so';
    create function zmq_publish returns string soname 'libzeromq.so';
    アンマウント
    drop function zmq_client;
    drop function zmq_publish;
    インストール成功確認
    mysql> SELECT * FROM `mysql`.`func` where name like 'zmq%';
    +-------------+-----+--------------+----------+
    | name        | ret | dl           | type     |
    +-------------+-----+--------------+----------+
    | zmq_client  |   0 | libzeromq.so | function |
    | zmq_publish |   0 | libzeromq.so | function |
    +-------------+-----+--------------+----------+
    2 rows in set (0.00 sec)
    5. プラグインの使い方
    プラグインにはいろいろな使い方があります.ここでは一例だけです.
    zromq server試験手順をコンパイルします.
    cd test
    cmake .
    make
    サービスプロセスを開始
    ./server
    ハローワールドを送信します
    mysql> select zmq_client('tcp://localhost:5555','Hello world!');
    +---------------------------------------------------+
    | zmq_client('tcp://localhost:5555','Hello world!') |
    +---------------------------------------------------+
    | Hello world! OK                                   |
    +---------------------------------------------------+
    1 row in set (0.01 sec)
    サーバ側が情報を受信したかどうかを確認します.
    $ ./server
    Received: Hello world!
    上記の例をトリガーでさらに最適化します.
    mysql> select zmq_client('tcp://localhost:5555',mobile) from demo;
    +-------------------------------------------+
    | zmq_client('tcp://localhost:5555',mobile) |
    +-------------------------------------------+
    | 13113668891 OK                            |
    | 13113668892 OK                            |
    | 13113668893 OK                            |
    | 13322993040 OK                            |
    | 13588997745 OK                            |
    +-------------------------------------------+
    5 rows in set (0.03 sec)
    サーバ側はすでにデータベースから送信された情報を受信しました.
    $ ./server
    Received: Hello world!
    Received: 13113668891
    Received: 13113668892
    Received: 13113668893
    Received: 13322993040
    Received: 13588997745
    私たちはjsonまたはプログレッシブのデータをつづり合わせて遠端に送ることができます.
    mysql> select zmq_client('tcp://localhost:5555',concat('{name:',name,', tel:',mobile,'}')) from demo;
    +------------------------------------------------------------------------------+
    | zmq_client('tcp://localhost:5555',concat('{name:',name,', tel:',mobile,'}')) |
    +------------------------------------------------------------------------------+
    | {name:neo, tel:13113668891} OK                                               |
    | {name:jam, tel:13113668892} OK                                               |
    | {name:leo, tel:13113668893} OK                                               |
    | {name:jerry, tel:13322993040} OK                                             |
    | {name:tom, tel:13588997745} OK                                               |
    +------------------------------------------------------------------------------+
    5 rows in set (0.03 sec)
    データを返すのはあなたのサーバーがどう処理するかによって決まります.true/falseなどに戻ります.
    触発器と事務処理はここでは示しません.