
gRPC Kotlin + MQTT Brokerでリアルタイムデーター配信
-
2021年5月24日
はじめまして、サーバー開発の J です。
新規プロジェクトの開発を担当しています。様々な技術を検討している段階ですが、チャット、キャラクターの移動情報…リアルタイム情報のデーター配信を gRPC Kotlin、MQTT(Message Queuing Telemetry Transport)Broker を組み合わせて実装してみました。その内容を紹介いたします。
概要
MQTT は TCP/IP による軽量なデーター配信プロトコルです。軽量、柔軟性、メッセージ品質調整… 様々なメリットがあり、複雑なロジックを組まず Pub/Sub 型データー配信ができるプロトコルです。
Pub/Sub 型データー配信は、ある topic (話題) にメッセージを publish (発行)、subscribe(講読)ができて、subscribe している多数のクライアントにデーターを配信することができます。
例えば、図のように MQTT Client A がある topic、topic/room/aaa に ”hello!” というメッセージをpublish すると、topic/room/aaa を subscribe していたクライアントは MQTT Broker を通して ”hello!” のメッセージを受信することになります。
ルーム(topic)、参加者(subscribe)、移動・チャット(publish)の例
構成
検討段階ではシンプルですが、今回試してみたサーバー構成です。
MQTT Broker
Pub/Sub 型データー配信にはメッセージブローカーが必要です。
MQTT Broker のサービス、アプリケーションは多くあります。
また、AWS IoT Core、Google Cloud IoT Core、Active MQ、Mosca などのライブラリを使ってアプリケーションサーバーに組み込むこともできます。
今回は Mosquittoを利用して実装しました。
Mosquitto( https://mosquitto.org/ )
gRPC Kotlin + Server Side MQTT Client
クライアントからリクエストの認証、ユーザー状態管理、ビジネスロジックの処理を行い MQTT Broker に publish, subscribe する役割です。アプリケーションサーバーは Kotlin gRPC で実装しています。
MQTT Broker にデーター配信する部分は spring-integration-mqtt を組み合わせで実装しました。
spring-integration-mqtt( https://spring.pleiades.io/spring-integration/reference/html/mqtt.html )
リアルタイム情報を配信する流れ
主なリアルタイムデーター配信する流れは下記のようになっています。
- クライアントのアクションが発生してその情報を gRPC にリクエストする
(ルームに参加、チャットメッセージ送信、キャラクターの移動) - アプリケーションサーバーはリクエストをもらって認証処理、DB 処理を行う
- gRPC レスポンスはリクエストによってルームの状態、subscribe する topic 情報などを返す
- またアプリケーションサーバーでリクエストによって同じルームに接続しているクライアントにデーター配信が必要だと判断した場合は MQTT Broker に配信データーを publish する
- topicをsubscribeしているクライアントはMQTT Broker経由でリアルタイム情報を受信して処理する
※ アプリケーションサーバーで MQTT Broker を subscribe している部分があります。上記の流れには書いてありませんが、MQTT とクライアントの接続が切れた時にルームの退室処理で利用しています。
最後に
テスト用のアプリで MQTT を利用したクライアントのチャット、キャラクター移動情報のリアルタイムデーター配信を実装してみました。
MQTT プロトコルの特性を利用し簡単にリアルタイムデーター配信の実装ができて楽ですね。
まだ新規プロジェクトはリアルタイム配信を含め、構成の検討段階で、リリース時には違う構成になるかも知れませんが、今度リアルタイムデーター配信が必要な案件などがあれば使ってみるといいかと思います。
ココネでは一緒に働く仲間を募集中です!
ご興味のある方は、以下のリンクから是非ご応募ください。