Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
時雨堂 MQTT ブローカー Akane 開発ログ

時雨堂 MQTT ブローカー Akane 開発ログ

日時:2016-02-07
作:時雨堂
バージョン:2.0.0
URL:https://shiguredo.jp/

概要

時雨堂 がフルスクラッチで開発し、販売している MQTT ブローカー Akane の開発ログです。

製品自体の詳細な仕様や金額については以下のサイトからご確認ください。

MQTT Broker Akane

リリースノート

1.2.2 から 1.3.0

日付:2016-02-09 予定
  • 大量接続要求時の高速化を行いました
  • TLS 1.2 接続時の高速化を行いました
  • CentOS 7.1 と CentOS 6.7 のパッケージを提供開始しました

1.2.0 から 1.2.2

  • MQTT over TLS で ECDSA をサポートしました
  • certfile としてサーバ証明書と中間証明書を結合したものを指定できるようにしました
  • cacertfile オプションは未使用であるため廃止しました
  • サンプルの証明書を cert.pem と key.pem に分割されているものに修正しました

1.1.1 から 1.2.0

  • クラスタ時のパケット転送処理の高速化を行いました
  • バッファリングを最適化し処理の高速化を行いました
  • エラー関連のログのローテーションを停止しました
  • シングルノード時の akane-admin leave コマンド動作を修正しました
  • メモリ情報を Graphite 形式で送信する機能を実験的に追加しました

1.1.0 から 1.1.1

  • クライアント ID が 0 バイトで、CleanSession が有効時にクライアント ID をサーバ側で動的生成するように修正しました
  • 同一クライアント ID の接続が来た場合は、既存の接続を切断するように修正しました

1.0.7 から 1.1.0

  • Retain 処理の高速化を行いました
  • Retain の永続化に対応し、ブローカーを再起動しても Retain が残る設定が可能になりました
  • クラスターで使用するポートの範囲を指定できるようになりました
  • ブローカー起動時に証明書に問題がないかどうかをチェックする機能を追加しました
  • ユーザ名単位で、接続とセッションを強制終了する TerminateConnections API を追加しました
    • セッションや Will を有効にしていたとしても無視されます
  • 指定したトピックフィルターに一致する Retain 一覧が取得できる ListRetainTopics API を追加しました
  • 指定したトピックフィルターに一致する Retain 一括削除が行える DeleteRetains API を追加しました
  • $SYS で取得できる情報を追加しました
    • セッションで保持されているメッセージと Retain されているメッセージ数の合計を取得できるようになりました
      • $SYS/broker/messages/stored
    • Retain されているメッセージ数の合計を取得できるようになりました
      • $SYS/broker/messages/retained/count

下位互換性なしの変更

アップデート時に注意してください

  • HTTP API Unregister を Deregister に変更しました
  • 設定項目名 session_expires を session_expiration に変更しました
  • 設定項目名 retain_expired_at を retained_expiration に変更しました
  • 同時接続数 $SYS/broker/clients/active を $SYS/broker/clients/connected に変更しました
  • TLS で使用するサーバ証明書と秘密鍵の項目を certfile と keyfile に分割しました
    • 今までは certfile に秘密鍵も含めていましたが、明示的に分割するようにしました

1.0.5 から 1.0.7

  • 意図しないログローテーションを無効にしました
  • ログフォーマットから不要な情報を削除しました

1.0.4 から 1.0.5

  • Akane ver.1.0.5 をリリースしました
  • WebSocket のパスを指定できる ws_path 設定を追加しました
  • $SYS で取得できる情報を追加しました
  • $SYS の配信を有効/無効にできる設定を追加しました
  • トピック名の長さを厳密にチェックする仕組みを追加しました
  • クライアント ID の最大長を 65535 文字に変更しました
  • CONNECT 時にパスワードは存在しているにもかかわらず、ユーザ名が存在しない場合をエラーとしました
  • インフライト (配信中) のメッセージの最大数の設定を追加しました

1.0.3 から 1.0.4

  • API を使いユーザ単位で取得する場合 JSON に対して username 情報を追加しました

1.0.1 から 1.0.3

  • $SYS で取得できる情報を追加しました
  • 最大同時接続数のチェックを厳密にしました
  • akane-admin status の表示に SerialCode を追加しました

機能

  • 3.1.0 と 3.1.1 の両方に対応しています。
    • 2.0.0 リリース時には 3.1.0 は非サポートとする予定です
  • QoS 0,1,2 対応済み
    • QoS ダウングレード対応済み
    • リトライインターバルの指定 対応済み
    • リトライ回数機能 対応済み
  • DupFlag 対応済み
  • KeepAliveTimer 対応済み
  • Clean Session 対応済み
    • Session Present flag 対応済み
    • QoS 0,1,2 対応済み
    • QoS ダウングレード 対応済み
    • バッファーサイズの指定 対応済み
      • バッファのデフォルトは 5,000 メッセージ
    • リトライ 対応済み
      • PUBREL のリトライ対応済み
      • DupFlag 対応済み
    • 期限 対応済み
  • Will 対応済み
    • QoS 0,1,2 対応済み
    • QoS ダウングレード対応済み
  • Retain 対応済み
    • payload ゼロバイトでの Retain 削除対応済み
    • 既存の接続に対する PUBLISH の Retain フラグ削除対応済み
    • 期限 対応済み
    • 永続化 対応済み
      • LevelDB を使用
  • 重複 ClientID による後勝ち 対応済み
  • $SYS 対応済み
    • memory を独自に追加
  • Auth 対応済み
    • Username / Password 認証
  • WebSocket 対応済み
    • MQTT 3.1 と 3.1.1 両方に対応済み
  • TLS 対応済み
  • dynamic topics 対応済み
    • ACL は MUST ではなく、 適用可能 という仕組みを取る予定です
  • MQTT / MQTTS 両方同時起動
  • ACL
    • UserName ベース
    • PUBLISH (write)
    • SUBSCRIBE (read)
  • クラスター
    • QoS 0,1,2 対応済み

性能試験

  • Tsung の MQTT plugin を使用
    • サーバ 1 台が捌ける処理数です
      • CPU は 6 ~ 8 コア使用
    • Erlang/OTP ノーパッチ
    • Ubuntu 14.04 (LXC 同士での通信)
    • clean session true
    • QoS 0 で 秒間約 25,000
    • 約 10 万同時接続
    • 秒間接続数 500 を想定

interop test

MQTT Conformance/Interoperability Testing

url:http://www.eclipse.org/paho/clients/testing/

一通りクリアしています

% python3.4 interoperability/client_test.py -d -z
hostname localhost port 1883
clean up starting
clean up finished
Basic test starting
Basic test succeeded
Retained message test starting
Retained message test succeeded
This server is queueing QoS 0 messages for offline clients
Offline message queueing test succeeded
Will message test succeeded
Overlapping subscriptions test starting
This server is publishing one message per each matching overlapping subscription.
Overlapping subscriptions test succeeded
Keepalive test starting
Keepalive test succeeded
Redelivery on reconnect test starting
Redelivery on reconnect test succeeded
Zero length clientid test starting
Zero length clientid test succeeded
$ topics test starting
$ topics test succeeded
test suite succeeded

ロードマップ

予定は未定

TODO

リリース:未定
  • 軽量化によりステートフルデータレスなサーバに切り替える
    • 現在は API で提供している機能を撤廃し、状態のみを持つサーバへと変更する
  • 管理アプリ
    • Electron で開発予定
  • ユーザ単位以外にレルム単位機能を追加する

機能紹介

$SYS

統計情報のサンプル

$ mosquitto_sub -h 127.0.0.1 -p 1883 -t '$SYS/#' -v
$SYS/broker/bytes/received 3552
$SYS/broker/bytes/sent 1787
$SYS/broker/messages/inflight 0
$SYS/broker/messages/received 274
$SYS/broker/messages/sent 224
$SYS/broker/messages/publish/received 47
$SYS/broker/messages/publish/sent 29
$SYS/broker/subscriptions/count 1
$SYS/broker/clients/connected 1
$SYS/broker/clients/disconnected 0
$SYS/broker/clients/total 1
$SYS/broker/clients/maximum 2
$SYS/broker/memory/total 36629792
$SYS/broker/memory/processes 9819544
$SYS/broker/memory/processes/used 9787056
$SYS/broker/memory/system 26827888
$SYS/broker/memory/atom 429569
$SYS/broker/memory/atom/used 406061
$SYS/broker/memory/binary 95608
$SYS/broker/memory/code 10981061
$SYS/broker/memory/ets 4850416
$SYS/broker/uptime 545
$SYS/broker/time 63597853067
$SYS/broker/version 1.0.7
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment