はじめに
RustのaxumでWebsocketを使う際に, サーバが,受信したデータを同じグループに属するクライアントにだけ転送する方法を探してみました.
TL;DR
axum-ws-roomsを使おう!!
ライブラリはないの?
あります.パッケージとして公開されているものでは,例えば
axum-ws-rooms
があります.内部でRoom
構造体が定義されていて,これが持つ
broadcast
をグループ内のクライアントが購読することで,範囲を限定したブロードキャストが実現されています.
また,1つのセッションで複数のRoom
に所属でき,
1つのセッションで複数のRoom
に所属している場合,
各Room
が転送してきたメッセージはセッションを管理するプロセス側で1つの
Receiver
でまとめて受け取る仕様になっています.
使ってみる
Cargo.toml
にaxum-ws-rooms = "0.6.0"
を追加するだけでライブラリを使うことができます.
ただ,まだcrate.ioの方では公開されていないみたいですが,
Github
の最新のソースではRoom
がbroadcast
に使用するデータの型を指定できるようになっているようで,気になるのでこちらを使ってみることにします.
さいごに
今回は,メッセージに送信者IDを付与して,クライアントが自分から発信したメッセージを受信しないようにしていますが,
broadcast
で特定の購読者を無視する方法はあるのでしょうか?
マルチキャストがしたい場合は,HashMap
などを使って自分で実装しないといけない(?)