推しアイデア
プログラミング言語が3DでリアルなPOKEMONに変身! レイドバトルで協力してPOKEMONを倒し、個性豊かなアイテムを駆使して捕獲しよう!
プログラミング言語が3DでリアルなPOKEMONに変身! レイドバトルで協力してPOKEMONを倒し、個性豊かなアイテムを駆使して捕獲しよう!
プログラミング言語をPOKEMONにしたらおもしろいとおもった。
①マイクロサービスでドメイン領域ごとに独立実装 ②HTTP3に対応したWebTransportで高速リアルタイム通信 ③Kubernetes
POlymorpwhism KEnel MOdule Network (ポリモーフィズム・カーネル・モジュール・ネットワーク)
縮めてPOKEMON!!
複雑なビジネスプロセスやドメインの知識を共有、可視化、そして理解するための協同作業ベースのモデリング手法
今回のプロダクトを作るにあたり、プロセスが複雑であることが予想していた。 なので、誰がどのような行動を行い、どんなイベントが起こり、どんな流れで進行していくのかを把握する必要があると思い行なった。 始点はログインするところから始まり、終点はポケモンを捕まえるところ
初めてEvent Stormingを行ったが、考えないといけないことが多く大変ではあったが、チームメンバー間での認識のすり合わせや、考慮もれが潰れていったのでとても効果を感じた。

Event Stormingで洗い出したドメイン領域ごとに、サービスを切っているため独立して作業を進めることが可能。 また、Apache Kafka互換のメッセージングブローカーであるRedPandaを使っており、Pub/Subのようになっているため、呼び出し元を知らなくて済む疎結合な構成になってい流。 他には、Argocdを使いGitHubを監視して自動でデプロイ(GitOps)したり、分散トレーシングのための監視基盤、 ゲームサーバー用にAgonesを使っていたり、k8sのCNIはカーネル空間で動くeBPFのCiliumを使用している。
基本的に、通信はgRPCを使っているが、ゲーム部分においてはHTTP/3 上で動くWebTransportを使用 (なお、iPhoneでは使えない; w ;)。 一部、WebTransportが使えない層のために、fallbackでWebSocketに繋いでいる。

auth / gateway / capture / item / lobby / masterdata / raid-lobby / projector / game-server / frontend の全サービスをAmazon EKS上にデプロイ。ArgoCDがGitHubのmainブランチを監視し、マージと同時に自動でクラスタへ反映するGitOps構成を採用。k8sのCNIにはeBPFベースのCiliumを使用しており、カーネル空間でのパケット処理により低レイテンシなサービス間通信を実現している。ゲームサーバーはAgonesで管理し、バトルセッションごとにPodを動的にアロケーション・ライフサイクル管理している。
commit前、PR、mainマージ後にCIが動く これで本番環境でのエラーを未然に防げた
contract(buf lint + breaking change検出)/ go-check(ビルド+テスト+race検出)/ frontend-check(tsc + Vite build)/ node-check の4ジョブが並列で走るnix-build(各サービスのDockerイメージをghcr.ioにpush)と render-manifests(K8s YAMLをNixidyで自動生成)が動き、ArgoCDが差分を検知して本番クラスタへ自動デプロイevent_store / outbox_events / idempotency_keys / snapshots の4テーブルを統一仕様で実装。Transactional Outboxパターンにより「DBへの書き込みとKafkaへの発行が不可分」な設計を実現し、at-least-once配信保証を達成したplatformパッケージとして共通化したbuf v2でProtoを唯一の真とし、Go(connect-go)とTypeScript(connect-query)の両クライアントを自動生成。型安全性をフロントエンドからバックエンドまで貫通させたVITE_USE_MOCK=true でバックエンド不要のフロントエンド開発環境を整備し、サービス間の依存を断ち切って並列開発を加速したinvocation.failed→invocation.compensatedのイベントフロー設計に時間がかかったC:\...)とLinuxパス(/mnt/c/...)の混在でDockerのvolumemountが壊れ、原因特定に時間を溶かした