質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.64%

raspberry piによる連続的・並列的な高速メッセージ配送の方法について

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 914

yosera45

score 4

 前提・実現したいこと

raspberry piで、ある測定を行い、得られる測定データの中でフィルタ条件を満たすものを、その都度、リアルタイムに通知したい。

・測定データは特定のフォーマットのテキストデータであり、軽量でメールに載せられます。

・測定データがフィルタ条件に一致するかの判定は、各測定データに対し、マルチスレッドを起動しており、同時並行的です。これを大量に取得される測定データに対して行い、フィルタ条件を満たすときは、メール通知しています。つまり、メール通知までもマルチスレッド化してます。

・メール通知までの一連のタスクの混雑の具合を見るため、
測定データの取得時刻と、それに対応するメールが作成完了する時刻も載せています。

・通信経路は暗号化を要求するので、現状ではpgpのメールで対応していますが、
メールを一件ごとに開く必要があり、使いづらいです。
そのため、表示を自由に変更可能なサーバに変更し、tlsへ移行するつもりです。

・rpi外のネットワークの品質には問題ないとします。

 発生している問題・エラーメッセージ

上記のメッセージ配送の仕様のため、非力なrpiでは、短時間に連続でフィルタ条件を満たす測定データが取得されるとき、一気に大量のタスクキューがたまるためか、
それらの通知を見ると、測定データの取得時刻とメールメッセージ作成時刻が1,2分空いてしまっており、リアルタイム性がないです。

これは、rpiで大量のタスクキューを発生させた事が原因なのか、
1回のメール作成が負荷の原因であり、その他のメッセージ配送プロトコルを利用すれば改善されるかは不明です。

rpiのネットワークの遅延は問題ないので、rpiのcpuの問題です。

 試す前にどのような機能を用いるべきか。

軽量のメッセージプロトコルとして,mqttやnanomsg,zeromqを考えています。
測定データを送信するrpiと、それを受信してwebアクセスしたユーザーに自由な形式(グラフとか)で表示するサーバのため、実質的には二者間通信であり、、ブローカーレスな構成です。

しかし、軽量のメッセージプロトコル以前に、例えば、最近5秒以内のフィルタ条件を満たす測定データはまとめて通知する、という方法にすれば、通知回数を減らして負荷を減らせるのでは、という期待もあります。(もちろん、遅延が最低でも5秒存在する事にはなるが)そのため、httpsでpost送信で対応すればよいのではとも考えました。

 補足情報(FW/ツールのバージョンなど)

raspbian (stretch)
python 3.6

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

質問内容を完全に把握していないのですが、Raspbianで普通に使える、セキュアでリアルタイム性がある軽量プロトコルといえば、WebSocketですね。

自由度が高いので、複数メッセージをまとめる等どの様にでも実装できますが、メッセージをまとめなくても、どの様に実装しても、置き換えればpgp+smtpよりは相当改善されると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/20 22:40 編集

    websocketを調べると、どうやら、なんらかのデータ(測定データや株チャート等)をサーバー側で保持し、グラフのリアルタイムな変動を見たいクライアントとの通信で利用されているようです。

    とりあえず、pythonのwebsoket関連のモジュールで測定データ送信のプログラムを実装しながら、
    回答をお待ちいたします。




    つまり、websocketの処理について、サーバ側はpythonでも良いが、クライアント側はwebアクセスとしてjsを利用しています。
    こうなると、rpiからサーバへの測定データ送信はサーバへのjsによるアクセスとなるのでしょうか?
    そうなると、pythonならjs利用可能なヘッドレスブラウズなどによる処理の重い実装になります。

    なので、rpiからデータ受信サーバへの通信は本来はwebsoketの役割ではないように思えるのですが、どうなのでしょうか。
    それとも、以下の三者間

    rpi -> 測定データ受信兼整形表示サーバ -> client

    のそれぞれで、websoketを使うと良いということでしょうか?

    websocetとともにasyncioが使用されているあたり、測定データの送信を素早く非同期にできるという意味ではこちらもありなのでしょうか。

    キャンセル

  • 2018/10/20 22:48

    http://www.raspberrypirulo.net/entry/2016/12/13/WebSocket通信の仕方(Webページの値更新編)

    でも、こういうのを見ると、rpiからwebsoketでデータを送るのもありなのかな

    キャンセル

0

「rpiのcpuの問題です」といってもRaspberry PiのCPUを取り替えたり、クロックを上げたりする訳にはいきませんから、ソフトウェア的な解決方法をとるしかないと思います。

まずは状況を把握するために、スレッドおよびタスクの生成時刻、消滅(完了)時刻、をログとしてメモリに記録してみてはどうでしょうか。(メモリ一杯までログが溜まったらプリンタなどに出力して内容を確認する)

また、個々の処理(測定データの取得、フィルター処理、pgpの暗号化、など)をシングルスレッド(他のスレッドは存在しない状態)で実行してみて、一連の処理に必要な時間を把握すべきだと思います。

raspberry pi側の状況把握をふまえて、ネットワークによる通信に関する検討を始めても遅くないのではないでしょうか。

P.S.
高負荷のRaspberry piの処理速度を上げる(温度上昇によって生じるCPUクロック速度低下を抑える)には、冷却能力の高いケース、大型のヒートシンクや冷却ファンを使うことが有効なようです。
ハードウェア的な対処方法として追記しておきます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる