Open8
RustでMQTTブローカーを作る
ピン留めされたアイテム
MQTTを作ろうと思って作ったときに参考にした先人達の情報へのポインタです。
なぜやろうとおもったか
- Rustを書いてみたかった
- 普段MQTTを使っているので理解を深めたかった
使うだけなら巷のやつを使った方が良いです。
MQTTとは
下記が非常に参考になる
仕様は、
仕様は実装する際に何度も見ることになる
Rustについて
the bookを一通り読む
「20. 最後のプロジェクト: マルチスレッドのWebサーバを構築する」は類似の事例
他、書籍等 は興味があれば
tokioを使う
複数のthreadでtcpのパケットをうける必要がある。
非同期I/Oライブラリとしてtokioを使うことにする。下記が非常に参考になる。
特に Chapter 08 フレーミングと同様のMQTT版を実装することになる
やること
受信処理
- MQTTヘッダーを処理し⇒パケットの種類判別 / パケットの残りサイズを把握する
- パケットの種類に応じて内部の状態を変更する
送信処理
- つながっているソケットにデータを送りつける
状態
複数のスレッドで状態(Connection Info /Subscribe topic filter)を共有する必要がある。スレッド間はArc/Mutexを使うと思うので、the book「16. 恐れるな!並行性」を参考
MQTT Topic
Subscribeで受診するトピックフィルターを指定できるが、httpのURLとは異なり、ワイルドカード的なものを指定できる。 例:a/+/c だと a/b/cやa/d/cなどのトピックを受信できる。
DBのインデックスで実装されるのと同様にTree構造を形成すれば正規表現を回すよりも良さげ(未実装)
ただし、他のブローカーの実装を(あえて)見ていないのでよくわからない。
完成したあとに調査しようと思ってる。
他やることいっぱい
- QoS
- Will/Retain
逆に👆の実装が面倒なのでちゃんとした(プロプラの/OSSの)MQTTブローカーを使っとけという話だと思います。
つまらないものですが
半端な実装ですが拙作
トピックフィルターを構造化したい試験実装(Tree)
今後やりたい
分散でスケールする仕組み