複数箇所の気温を測定して収集するというようなことを,センサー & ラズパイ & サーバ とかでやる場合に,Redis を使うと処理が簡単になる というお話です.
想定する環境
機器構成として
- データをシリアル出力できるセンサー
- 複数のセンサーからのデータを受けるラズパイ(とか)
- 複数のラズパイ(とか)からのデータを集約するサーバ
を考えます.
ラズパイは,Raspbian が走っているものとして,この上で Perl とか Python とか Ruby (とか C言語 )で処理プログラムを開発するものとします.
「IoT的な処理」
このような環境では,センサーからの定期的なデータの受信と,他のサーバに渡すというような処置が必要になります.
ただ,他のサーバに渡す処理が REST である場合には,データ送信に割と時間がかかってしまう場合があります(セッションの確立とか).
そこで,このような場合には,受信処理や送信処理を別々にして,プロセス間通信でデータのやりとりをするのが一般的です.
このプロセス間通信に Redis を使うと便利というのが,本稿のお話です.
メッセージキューでやってほしいこと
IoT的な処理では,
- 異常値観測 -> 警報発報 のような常時監視
- 一定時間毎に,過去数点のデータの平均を求めるようなサマリ情報収集
- 簡単な解析
を,上記の構成におけるラズパイの部分でやらせると,システム全体の構成が簡単になります(よね).
このうち,「一定時間毎に,過去数点のデータを処理」というのは,ちょっと面倒です.受信したデータを,常に,一定数記憶しておく必要があります.ですが,メッセージキューが,長さの指定ができる FIFO であれば話は簡単になります.
FIFO(First In First Out) は,メッセージキュー (Queue) の処理方法の1つで,先に入れたものが先にでてきます.また,長さを指定があれば,その長さ以上のデータを受け付けません.
今回の FIFO では,新しいデータがキューに入るたびに,一番古いデータが捨てられるものとします.
このようにすることで,FIFO の長さを 10 にしておけば,過去10点のデータを定期的に読み出すという処理を簡単に実現することができます.
また,目的のプロセス毎に長さの違うキューを用意することもできます.
Redis を使うとうれしいこと
本稿は,長さ指定のできる FIFO のメッセージキューとして Redis を使うと便利だよ というのが趣旨です.
うれしいこと その1 実装が簡単
送信側 : rpush & ltrim
受信側 : lpop
を使うことで,長さ指定のある FIFO が,とっても簡単に実装できます.
以下は,送信側の実装例です.
use Redis;
use Redis::List;
my $redis = Redis->new(server => 'localhost:6379');
my $data = "Recieved Data";
$redis->rpush('hoge', $data);
$redis->ltrim('hoge', -10, -1); # 最新10回分
うれしいこと その2 データ形式が自由
うれしいことの大半は, Redis の機能によるものなので,あまり列挙する意味もないのですが,文字列の引き渡しが簡単というのは,かなり重要なメリットです.
センサーからのデータは,文字列として渡されてくるので,この文字列をそのまま渡すことができるのは,うれしいですね.
うれしいこと その3 多言語対応
この多言語は,プログラミング言語のことです.
自分の得意,あるいはその処理が得意が言語を選択できるのは,うれしいことですよね.
Redis が間にはいることで,送信側と受信側を別の言語で開発することが,かなり楽になります. Redis インターフェースを使えばよいですからね.
まとめ
IoT的な処理でプロセス間通信をするときに,Redis が便利という話でした.「超絶」は,ちょっと釣りです.
実際に,ラズパイを使った案件で Redis を使ったのですが,複数人による並行開発が円滑に進みました.
最近のラズパイが高性能というのもあるのですが,Webサービス技術で IoT 処理がかなり簡単にできますね.