LoginSignup
5
3

More than 5 years have passed since last update.

ElixirでThriftの簡易サーバーのRiffed.Serverを使ってみた

Posted at

以前の投稿で、Elixirでthriftの構造体を定義しました。

その際に利用したライブラリriffedが提供している以下の3つの機能のうち、最後に1つを利用してみました。

  1. thriftコードから、erlangのコードを自動生成するMixタスク[mix compile.thrift]を提供
  2. Riffed.Structを利用して、thriftで定義、erlangで生成した構造体にElixirからアクセスできる機能を提供
  3. 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フォルダを参照しながら実装しました。

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との併用が可能か

本日は以上となります。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3