Closed TodorokiKohei closed 1 year ago
クライアントへのパケットはClient
のRead
-> ReadPacket
でTCPソケットから受信され、Packet
にデコードされる。現在PingReqのデコードが実行されていないため、ペイロードの値が設定されていない。
受信したパケット毎の処理はServer
のreceivePacket
-> processPacket
で実行される。
サブスクライバへの配信はpublishToSubscribers
で実装されている。共有サブスクリプションの送信先の選択はSelectShared
で実装されている。選択の実装はトピックフィルター($share/{group}/{topic})毎に1つのクライアントをランダムで選択するようになっている。go言語のmapをrangeでループさせると順序はランダムになる。https://zenn.dev/sinozu/articles/c02cecbab039795d071a
サブスクライバ選択の直前にOnSelectSubscribers
のHookがあり、このHookを実装してServer.AddHook
で追加することで独自の選択アルゴリズムを実装することが可能だと考えられる。Hookの実装はexample/hooks
にある。サンプルが充実しているのは助かる。。。
https://github.com/TodorokiKohei/mqttv5-broker/blob/master/examples/hooks/main.go
PINGREQでSubscriberの情報を受信することでBrokerの分散配信を高度化する。そのために、以下のタスクを実行する。