IBM Bluemix からも提供されている、オープンソースのイベント駆動型サービス OpenWhisk が正式版としてリリースされました:
2016121401


この OpenWhisk は最近流行りの "Function as a Service" をオープンソースで実装したものです。Bluemix の機能の1つとしても提供されていますが、オープンソース版をこちらから入手して利用することもできます:
https://github.com/openwhisk/openwhisk


OpenWhisk ではイベント等のきっかけ(Trigger)に対する個別の処理が、アクション(Action)として紐付け(Rule)られています。この Trigger - Action - Rule の組み合わせでアプリケーションを実装し、その処理が実行されるタイミングで必要なだけのマシンリソースが必要なだけ割り当てられて実行されます。そしてその際に利用したリソース(CPU 時間やメモリ量)に応じて料金が発生します。すなわち CPU を使わない待ち時間などには料金が発生しないことになるので、その意味でもリーズナブルな料金体系になっていると言えます。

なお 2016/Dec/14 時点での料金表はこちらです:

https://console.ng.bluemix.net/openwhisk/learn/pricing
2016121402


↑128MB メモリを使って、0.5 秒実行するようなアクションを月 5,000,000 回実行するまでであれば無料枠内で収まる、ということになります。ある程度は無料でも使えそうです。 また上の表をみてもわかりますが、時間のかかるアクションや多くのメモリを必要とするアクションは(比例的とは言えないくらいに)割高になります。個々のアクションを小さく分割して実行した方が割安な運用ができそうです。


さて、このアクションですが、2016/Dec/14 現在の OpenWhisk では初めからシステムで用意されているアクション以外に以下のプログラミング言語を使って実装することが可能です:
  • JavaScript
  • Python
  • Swift
  • Java

このうち最も新しいのが Java です。他の比較的新しめの言語は苦手というエンジニアもいらっしゃると思いますが、最近になって Java でも OpenWhisk のアクション実装が可能になりました。以下にその手順を紹介します。

まず前提の準備として OpenWhisk のコマンドラインインターフェースである wsk コマンドをセットアップします。Bluemix ダッシュボードからの指示にしたがって、以下から自分の環境にあった wsk コマンドをダウンロードし、インストールします(UNIX 系システムでは wsk バイナリをダウンロードして、パスを通して、実行権限を付けます):
https://openwhisk.ng.bluemix.net/cli/go/download/
2016121404


そして名前空間と許可キーの初期セットアップを行います。具体的には以下のサイトの 2. の中にあるコマンドを「コピー」し、wsk をインストールしたシステムのコマンドラインにペーストして実行するだけです:

https://console.ng.bluemix.net/openwhisk/learn/cli
2016121405


これで wsk コマンドの設定は完了です。

更に今回は Java を使ってアクションを実装/実行します。Java で OpenWhisk のアクションを実装するには JDK 1.8 が必要です。またコンパイル時に Google GSON ライブラリが必要になります。以下のサイトからソースを入手してビルドするなどして gson-2-X-X.jar ファイルを入手し、CLASSPATH に登録しておきます:
https://github.com/google/gson


改めて、実際に処理を行うアクションを Java で記述します。サンプルとして以下を用意しました(JavaHello.java)。必要に応じて処理内容を変更してください。最後に実行結果をcom.google.gson.JsonObject 型の JSON オブジェクトで返すような内容にしてください:
import com.google.gson.JsonObject;

public class JavaHello{
  public static JsonObject main( JsonObject args ){
    String name = "World";
    if( args.has( "name" ) ){
      name = ( String )args.getAsJsonPrimitive( "name" ).getAsString();
    }
    JsonObject obj = new JsonObject();
    obj.addProperty( "greeting", "Hello " + name + "!" );
    return obj;
  }
}

↑ちなみにこのサンプルを実行すると { "greeting": "Hello XXXX!" } という JSON を返します。XXXX 部分には実行時の name パラメータで与えた文字列が入ります(デフォルトは World)。

このアクションソースファイルを JDK 1.8 でコンパイルして JAR アーカイブします:
$ javac JavaHello.java
$ jar cvf JavaHello.jar JavaHello.class

OpenWhisk アクションとして(JavaHello という名前で)登録します:
$ wsk action create JavaHello JavaHello.jar --main JavaHello

OpenWhisk アクションとして実行してみます(青字は実行結果):
$ wsk action invoke --blocking --result JavaHello  (パラメータなし)
{
  "greeting": "Hello World!"
}

$ wsk action invoke --blocking --result JavaHello --param name DOTNSF  (パラメータ指定)
{
  "greeting": "Hello DOTNSF!"
}

動きました! これで Java でも OpenWhisk のアクションを実装できることが確認できました。



(参考)
https://github.com/openwhisk/openwhisk/blob/master/docs/actions.md