技術ブログ

【Rust/axum】Websocketでグループ単位のブロードキャストをする

はじめに

RustaxumWebsocketを使う際に, サーバが,受信したデータを同じグループに属するクライアントにだけ転送する方法を探してみました.


TL;DR

axum-ws-roomsを使おう!!


ライブラリはないの?

あります.パッケージとして公開されているものでは,例えば axum-ws-rooms があります.内部でRoom構造体が定義されていて,これが持つ broadcast をグループ内のクライアントが購読することで,範囲を限定したブロードキャストが実現されています. また,1つのセッションで複数のRoomに所属でき, 1つのセッションで複数のRoomに所属している場合, 各Roomが転送してきたメッセージはセッションを管理するプロセス側で1つの Receiver でまとめて受け取る仕様になっています.


使ってみる

Cargo.tomlaxum-ws-rooms = "0.6.0"を追加するだけでライブラリを使うことができます. ただ,まだcrate.ioの方では公開されていないみたいですが, Github の最新のソースではRoombroadcast に使用するデータの型を指定できるようになっているようで,気になるのでこちらを使ってみることにします.


さいごに

今回は,メッセージに送信者IDを付与して,クライアントが自分から発信したメッセージを受信しないようにしていますが, broadcastで特定の購読者を無視する方法はあるのでしょうか? マルチキャストがしたい場合は,HashMapなどを使って自分で実装しないといけない(?)