TodorokiKohei / mqttv5-broker

The fully compliant, embeddable high-performance Go MQTT v5 server for IoT, smarthome, and pubsub
MIT License
0 stars 0 forks source link

PINGREQで受信できるデータを拡張する #1

Closed TodorokiKohei closed 1 year ago

TodorokiKohei commented 1 year ago

PINGREQでSubscriberの情報を受信することでBrokerの分散配信を高度化する。そのために、以下のタスクを実行する。

TodorokiKohei commented 1 year ago

クライアントへのパケットはClientRead -> ReadPacketでTCPソケットから受信され、Packetにデコードされる。現在PingReqのデコードが実行されていないため、ペイロードの値が設定されていない。

https://github.com/TodorokiKohei/mqttv5-broker/blob/62659e17baa4e3e0862f529886ffc25327b3c53a/clients.go#L331-L356

https://github.com/TodorokiKohei/mqttv5-broker/blob/62659e17baa4e3e0862f529886ffc25327b3c53a/clients.go#L422-L480

TodorokiKohei commented 1 year ago

受信したパケット毎の処理はServerreceivePacket -> processPacketで実行される。

https://github.com/TodorokiKohei/mqttv5-broker/blob/62659e17baa4e3e0862f529886ffc25327b3c53a/server.go#L409-L424

https://github.com/TodorokiKohei/mqttv5-broker/blob/62659e17baa4e3e0862f529886ffc25327b3c53a/server.go#L556-L619

TodorokiKohei commented 1 year ago

サブスクライバへの配信はpublishToSubscribersで実装されている。共有サブスクリプションの送信先の選択はSelectSharedで実装されている。選択の実装はトピックフィルター($share/{group}/{topic})毎に1つのクライアントをランダムで選択するようになっている。go言語のmapをrangeでループさせると順序はランダムになる。https://zenn.dev/sinozu/articles/c02cecbab039795d071a

https://github.com/TodorokiKohei/mqttv5-broker/blob/62659e17baa4e3e0862f529886ffc25327b3c53a/server.go#L766-L793

https://github.com/TodorokiKohei/mqttv5-broker/blob/62659e17baa4e3e0862f529886ffc25327b3c53a/topics.go#L255-L268

TodorokiKohei commented 1 year ago

サブスクライバ選択の直前にOnSelectSubscribersのHookがあり、このHookを実装してServer.AddHookで追加することで独自の選択アルゴリズムを実装することが可能だと考えられる。Hookの実装はexample/hooksにある。サンプルが充実しているのは助かる。。。

https://github.com/TodorokiKohei/mqttv5-broker/blob/master/examples/hooks/main.go