LoginSignup
10
8

More than 3 years have passed since last update.

firestoreで実現するランダムマッチングを考えてみた(未実装)

Last updated at Posted at 2019-07-20

考えてみただけなのですが、もしご意見等あればコメントいただけると幸いです!自分も正解がよくわからないので議論したいです!

前提

  • 1:1でランダムマッチングして対戦等を行いたい
  • ピーク時は結構リクエストが跳ねて、秒間1000リクエストとかでも対応したい
  • クライアントはネイティブアプリ

テーブル

  • waitingUsers: Collection
    • documentID
      • userIDにする
    • status: string
      • 待機状況
      • WAITING, MATCHED
    • updatedAt: timestamp
      • 待機ユーザーの足切り用
    • roomID?: string
      • 参加が決まった部屋のID
  • rooms
    • userIDs: array
      • 参加するユーザーのID
    • participants: Collection
      • 参加するクライアント一覧。参加するユーザーが明示的に書き込む。

シーケンス

本当はシーケンス図にしたかったんですが面倒だったので一旦箇条書きです、すみません。
PlantUMLでシーケンス図書きました!とりあえず箇条書きも残しておきます。

ランダムマッチング.png

  1. マッチングを望むユーザーは waitingUsersstatus = WAITING and updatedAt = now でドキュメントを作成または更新
  2. ユーザーは自身のドキュメントを監視(タイムアウトの設定は必要)
  3. waitingUsers の更新をフックしたCloudFunctionsが起動する(なんかの制限引っかかるか…?)
    1. waitingUsersから status == WAITING and updatedAt > 1分前(適当) のデータを取得(limitいる気がする)
    2. ランダムな1件を取得してくる
    3. transactionで下記を実行
      1. 取得したデータと更新をフックしたデータをgetAllする
      2. 各データが status == WAITING であることをチェック
        1. だめだったら3−1.からやりなおし
      3. それぞれ status = MATCHED, roomID = uniqueID で更新
      4. /rooms/uniqueIDの userIDs = [userID1, userID2] で作成
  4. マッチングしたユーザーはドキュメントの変更を受け取って、roomIDを取得する
  5. roomを取得して、room.participantsを監視
  6. room.participantsに自身のユーザー情報を書き込む
  7. participantsが2名になったら対戦スタート

懸念点

  1. CloudFunctionsの呼び出し数上限とかに引っかからないか?
  2. ちゃんと10人がWAITINGだったら5組できるのか(理論上は大丈夫なはずだが…)
10
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
8