RustでRedisのpub/subを実装する

2024年3月23日土曜日

Redis Rust

t f B! P L

RUST

この記事では、RustでRedisのパブリッシュ/サブスクライブシステムを実装する方法を見ていきます。

RedisのPub/Sub とは

Redisは、高速なキー値ストアです。さらに、パブリッシュ/サブスクライブ(pub/sub)モデルをサポートしています。このモデルでは、メッセージの送信者(パブリッシャー)がチャネルにメッセージを発行し、そのチャネルを購読している受信者(サブスクライバー)がメッセージを受け取ることができます。

Redisのpub/subイメージは次のとおりです。

Redisのpub/subイメージ

スポンサーリンク

Redisのクレートを設定

RustプロジェクトでRedisを使い始めるには、まずredisクレートをプロジェクトの依存関係に追加する必要があります。これを行うには、プロジェクトのCargo.tomlファイルに以下の行を追加します。

[dependencies]
redis = "0.24.0"

パブリッシャーの実装

パブリッシャーの実装は、Redisサーバーへの接続を確立後、特定のチャネルにメッセージを発行する機能を実装します。


use redis::Commands;

fn publish_message() -> redis::RedisResult<()> {

    // Redisへ接続
    let client = redis::Client::open("redis://127.0.0.1/")?;
    let mut con = client.get_connection()?;
    
    // 「my_channel」にメッセージを送信
    con.publish("my_channel", "Hello, world!")?;
    Ok(())
}

サブスクライバーの実装

サブスクライバーは、指定したチャネルを購読し、新しいメッセージが到着するたびにそれを処理します。

use redis::Commands;

fn subscribe_channel() -> redis::RedisResult<()> {

    // Redisへ接続
    let client = redis::Client::open("redis://127.0.0.1/")?;
    let mut con = client.get_connection()?;
 
    // 「my_channel」を購読するための準備
    let mut pubsub = con.as_pubsub();
    pubsub.subscribe("my_channel")?;
    
    // 「my_channel」からメッセージが到着するたびに、コンソールにメッセージを表示するループ
    loop {
        let msg = pubsub.get_message()?;
        let payload : String = msg.get_payload()?;
        println!("channel '{}': {}", msg.get_channel_name(), payload);
    }
}

このコードは、my_channelチャネルを購読し、新しいメッセージが到着するたびにコンソールに表示します。これはシンプルな例ですが、応用することで複雑な分散システム内での非同期メッセージングの基盤として使用できるでしょう。

まとめ

本記事では、Rust言語を使用してRedisのpub/sub機能の実装方法について詳しく説明してきました。
pub/subの機能を使う際には、いくつかの重要な注意点があります。特に、以下の2点は開発者が特に留意すべきです。

1. メッセージは保存されない

Redisのpub/subシステムは、メッセージの永続化は行いません。これは、subscribeしていない期間に発行されたメッセージは受け取ることができないことを意味します。つまり、あるクライアントが一時的にオフラインになってしまった場合、その間に送信されたメッセージは、そのクライアントが再度オンラインになったとしても、取得することができません。この特性は、リアルタイム通信を主目的とした用途には適していますが、すべてのメッセージを確実に受け取りたい場合は使えません。

2. Subscriberが存在するかどうかに関係なく、publishメッセージは揮発する

pub/subシステムでは、publishされたメッセージは、その時点でアクティブなsubscriberにのみ配信されます。subscriberが存在しない場合、またはそのメッセージを受け取るべきsubscriberがいない場合でも、メッセージは単純に破棄されます。そのため、メッセージの配信を保証したい場合は、メッセージキューシステムの使用や、subscriberの監視といった追加の仕組みを導入することが重要になります。

スポンサーリンク
スポンサーリンク

このブログを検索

Profile

自分の写真
Webアプリエンジニア。 日々新しい技術を追い求めてブログでアウトプットしています。
プロフィール画像は、猫村ゆゆこ様に書いてもらいました。

仕事募集もしていたり、していなかったり。

QooQ