<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Firebase :: 태그 :: MoonGameServer.Lab</title>
    <link>https://hugo.moonsd.work/tags/firebase/index.html</link>
    <description></description>
    <generator>Hugo</generator>
    <language>ko</language>
    <lastBuildDate>Thu, 23 Jul 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://hugo.moonsd.work/tags/firebase/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>랜덤 매칭이 두 번 교착에 빠진 이야기</title>
      <link>https://hugo.moonsd.work/%EA%B2%8C%EC%9E%84%EC%84%9C%EB%B2%84%EA%B4%80%EB%A0%A8cs/%EC%8B%A4%EC%8B%9C%EA%B0%84%EB%8F%99%EA%B8%B0%ED%99%94/01-%EB%9E%9C%EB%8D%A4%EB%A7%A4%EC%B9%AD-%EA%B5%90%EC%B0%A9/index.html</link>
      <pubDate>Thu, 23 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://hugo.moonsd.work/%EA%B2%8C%EC%9E%84%EC%84%9C%EB%B2%84%EA%B4%80%EB%A0%A8cs/%EC%8B%A4%EC%8B%9C%EA%B0%84%EB%8F%99%EA%B8%B0%ED%99%94/01-%EB%9E%9C%EB%8D%A4%EB%A7%A4%EC%B9%AD-%EA%B5%90%EC%B0%A9/index.html</guid>
      <description>왜 공부했나 블로그에 붙여둔 오목에 온라인 대전을 넣고 싶었다. 다만 조건이 하나 있었다. 서버 프로세스를 띄우지 않는다. 정적 사이트에 붙는 미니게임인데 매칭 서버를 따로 운영할 생각은 없었다.&#xA;그래서 Firebase Realtime Database(이하 RTDB) 하나만 놓고, 클라이언트끼리 알아서 짝을 짓게 만들기로 했다. 전용 서버가 있었다면 매칭 대기열은 그냥 서버 메모리 안의 큐 하나고 락 한 번이면 끝난다. 그게 사라지니 매칭이 통째로 분산 합의 문제가 됐고, 결과적으로 교착에 두 번 빠졌다.&#xA;만들려던 구조 omok_queue/{티켓키} → { t: 서버시각, g: 매칭된 게임ID } omok_games/{게임ID}/m/{수번} → { r, c } 착수&#xD;대기열에 티켓을 하나 올리고 기다린다 → 누가 나를 잡으면 나는 흑(선수) 대기열에 누가 있으면 그 티켓을 잡는다 → 내가 백(후수) 착수는 m/{수번}에 트랜잭션으로 기록하고 양쪽이 onChildAdded로 받는다 티켓과 대국방 모두 onDisconnect로 자동 삭제 — 대국이 끝나면 DB에 남는 게 없다 문제는 전부 “대기열에 누가 있으면 잡는다&#34;는 저 한 줄에서 터졌다.</description>
    </item>
  </channel>
</rss>