データベースの値の変更をリアルタイムに取得したい時ありますよね。例えばチャットのメッセージとか何かのログとか。
そのときに便利なのがFirebase Realtime Databaseです。
無料でも利用できて、データベースの値に追加があったり変更があったらそれを受け取ることができるNoSQLなデータベースです。
今回私は研究プロジェクトの関係で大量のリクエストが発生する問題がありました。
Firebaseだと保存容量が無料枠に収まらない可能性もあり、もともとログ保存用に立っていたMongoDBサーバーでリアルタイムに値を取れないか試してみました。
Change Streamsを使う
Change Streams
MongoDB3.6以降の機能にChange Streamsというものがあります。
これはデータベースに追加された値をストリームで受け取れる機能です。
以下のような簡単なコードでリアルタイムに値を取得することができます。
from pymongo import MongoClient
client = MongoClient('localhost', 8001)
db = client['db']
collection = db['logs']
st = collection.watch()
while True:
print(next(st))
collectionに.watch()
をしてあげるだけです。こんなに簡単にできてしまいます。
ただ、この機能はレプリケーションを組んでないMongoDBサーバーだとエラーになってしまいます。
データベースのリアルタイム処理では一貫性を保つことが重要なためです。
MongoDBでレプリケーションの構築
MongoDB で 2台構成 の レプリカセット を 構築する 方法
このブログがとても詳細にわかりやすく載っているためここでは省略します。
まとめ
レプリカセットさえ組んでしまえば非常に簡単にリアルタイムに値の取得をすることができますね。
とくにMongoDBのようなNoSQLデータベースはテーブルを組まないため、ログのような即時性が必要なデータとの相性が良いので、このような機能は大変便利だと思います。