以前の投稿で、Elixirでthriftの構造体を定義しました。
その際に利用したライブラリriffedが提供している以下の3つの機能のうち、最後に1つを利用してみました。
- thriftコードから、erlangのコードを自動生成するMixタスク[mix compile.thrift]を提供
- Riffed.Structを利用して、thriftで定義、erlangで生成した構造体にElixirからアクセスできる機能を提供
- Riffed.Server, Riffed.Clientを提供することで、生成したコードを利用したデータ通信の簡易サーバを簡単に構築できる機能を提供
サンプルのリポジトリは以下になります。
1. thrift構造体の用意
以下の構造体を用意しました。
struct MyChatMessage
{
1: i32 senderId,
2: i32 recieverId,
3: string message
}
service MyChatService
{
void sendMessage(1: i32 senderId, 2: i32 recieverId, 3: string message);
void recieveMessage(1: i32 senderId, 2: i32 recieverId, 3: string message);
}
2. mix compile.thriftでerlangコードを生成
ここはサブタイトルそのままです。
プロジェクト直下に、src
フォルダが出来上がります。
3. Server, Client, Handler, Modelの4つの役割を持ったexファイルを実装
riffedのexampleフォルダを参照しながら実装しました。
- https://github.com/letusfly85/use_elixir_thrift/blob/qiita/lib/my_chat_server.ex
- https://github.com/letusfly85/use_elixir_thrift/blob/qiita/lib/my_chat_client.ex
- https://github.com/letusfly85/use_elixir_thrift/blob/qiita/lib/my_chat_handler.ex
- https://github.com/letusfly85/use_elixir_thrift/blob/qiita/lib/my_chat_message.ex
4. 動かしてみる
terminalを2つ立ち上げます。
- terminal1
ServerとHandlerを立ち上げます。
これで2112ポートで待ち受けが始まります。
iex(1)> UseElixirThrift.MyChatServer.start_link
11:08:25.795 [info] thrift service listening on port 2112
{:ok, #PID<0.191.0>}
iex(2)> UseElixirThrift.MyChatHandler.start_link
{:ok, #PID<0.200.0>}
- terminal2
Clientを立ち上げます
iex(1)> UseElixirThrift.MyChatClient.start_link
{:ok, #PID<0.195.0>}
terminal2 から、sendMessageメソッドを読んでみます。
iex(2)>UseElixirThrift.MyChatClient.sendMessage(1, 2, "test")
:ok
すると terminal1 側では以下のように出力されます。
"got a message: test"
5. ユースケースを考えてみる
こいつ自体を利用して以下のような用途で利用可能かを探ってみようと思います。
- Cassandraにレコード登録できるかどうか
- Zipkin操作できるか
- 他言語のThrift Server/Clientとの併用が可能か
本日は以上となります。