かまたま日記3

プログラミングメイン、たまに日常

embulk-executor-remoteserverを作った #Embulk

Embulkのexecutor pluginの仕組みとネットワークプログラミングを学びたかったので、勉強がてらこのようなプラグインを作ってみました。

github.com

できること

  • Embulkのタスクの実行を別に立てた専用のサーバ(以下Embulkサーバと呼びます)上で実行できる
  • 複数サーバにタスクの処理を分散させる
  • サーバとの接続が切れたときに再接続する

できないこと (TODOs)

使い方

2019/04/06時点の最新は 0.2.1 です

Embulkサーバを起動する

基本的にはDockerコンテナ上で動かすことを想定していて、DockerHubにイメージをホストしているので、それをrunすれば起動できます。クライアント(plugin)と同じバージョンのイメージを使うことをおすすめしますが、多少違ってもたぶん動きます。コンテナ側は 30001 番のポートを開くので*2それを公開します。

$ docker run -p 30001:30001 -it --rm kamatama41/embulk-executor-remoteserver     
14:55:48.805 [main] INFO  c.g.kamatama41.nsocket.SocketServer - Starting server..

Embulkを起動する

exectype: remoteserver を指定して hosts に起動中のEmbulkサーバのホストを登録します。

exec:
  type: remoteserver
  hosts:
    - localhost:30001

この状態でEmbulk runをすると、サーバに接続に行き、タスクの実行を依頼します。 もっと詳しいチュートリアルは、こちらのexample を参照してください。

中身の話

このプラグインは、指定されたEmbulkサーバとTCPコネクションを張り、そのコネクションを通じてクライアントとサーバが相互にデータのやり取りを行います。例えばクライアントからはEmbulkEmbedを構築するのに必要なタスクの情報やシステムコンフィグ、OSSプラグインを実行に必要なgemをZIPファイルにまとめて送ったりしています。逆にサーバからはクライアントに各タスクの進捗状況を送っており、クライアント側は終了の通知が来るまで待受をします。

いわゆるWebSocket的な双方向通信をしているのですが、この仕組みを自作しました。

github.com

まあnettyとか使ってWebSocketにしても良かったのですが、あんまり依存ライブラリを増やしたくなかったのとネットワークプログラミングの勉強も兼ねてスクラッチで作ってみたかったという次第です。nsocketNIOで作ったノンブロッキングsocketサーバとクライアント の略です。大変だったけど結構いい勉強になりました。

実用性があるかは微妙なところですが、よかったら使ってみて感想をいただけると喜びます。

*1:現状Maven pluginは(たぶん)無いので、あんまり実害はないかもしれません

*2:変えることもできます