Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Notionで作るWebサイト「MuuMuu Sites」の裏側

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.
Avatar for kinosuke01 kinosuke01
December 15, 2023

Notionで作るWebサイト「MuuMuu Sites」の裏側

Avatar for kinosuke01

kinosuke01

December 15, 2023
Tweet

More Decks by kinosuke01

Other Decks in Technology

Transcript

  1. 2 ⾃⼰紹介 ホスティング事業部 事業開発チーム 2020年 中途⼊社 きのすけ kinosuke01 • Webアプリケーションエンジニア •

    バックエンドの開発がメインですが、 職種を越境してフルサイクルな動きをしがち。 • ディレクターや デザイナーとわいわい仕事しています。 • X(Twitter) : @kinosuke01
  2. 4 アジェンダ 1. MuuMuu Sites の 紹介 2. MuuMuu Sites

    の 設計 3. ⼯夫した点 3.1. jobの死活監視 3.2. サイト公開フロー
  3. MuuMuu Sites の 紹介 6 MuuMuu Sites ってなに? Notionに書いたページに 独⾃ドメインをあてて

    デザインをカスタマイズして Webサイトとして 公開できるサービス
  4. MuuMuu Sites の 紹介 7 MuuMuu Sites ってなに? - 補⾜

    • ドメインの購⼊管理ができるサービス 「ムームードメイン」 の 1機能として提供 • 必要な費⽤は「ドメインの取得更新費」のみ ドメインがあれば無料でサイトが作成可能 • 読みは「ムームーサイト」
  5. MuuMuu Sites の 紹介 9 • MuuMuu Sitesで案内に従って選択肢から選ぶだけ MuuMuu SitesでWebサイトを作成

    ドメインを 選ぶ 公開する Notionページ を選ぶ サイトの テーマを選ぶ Notion連携 \!完成!/
  6. MuuMuu Sites の 設計 12 Notion API ホスティングサーバ ページの情報を取得 取得したデータから

    サイトデータ (html,cssなど)を生成 生成したファイルを ホスティングサーバに アップロード Webサイトとして 閲覧できる
  7. 17 MuuMuu Sites の 設計 サイト公開 - 概略 • サイト公開に⾄るまで、このフローを何回も繰り返し動かしている

    • たとえば • DNS設定とVirtualHostの設定 → 処理終了 → 再度動かす → http疎通チェック → NG → 処理終了 → 再度動かす → http疎通チェック → NG → 処理終了 → 再度動かす → http疎通チェック → OK → 証明書発⾏へ進む
  8. MuuMuu Sites の 設計 19 サイト作成API - 概略 WebAPI Job

    サイトビルド&デプロイ リクエスト
  9. MuuMuu Sites の 設計 20 サイト作成API - 概略 WebAPI Job

    WebAPIで受けた ビルド&デプロイリクエストは RedisStreamsを流れます
  10. MuuMuu Sites の 設計 21 サイト作成API - 概略 WebAPI Job

    メッセージを受け取ったら、 Next.jsアプリケーションを 外部コマンドで起動し、 静的サイトをビルドします。 Next.jsアプリケーションは 内部でNotionAPIを呼び出し ビルドに必要な情報を取得します。
  11. MuuMuu Sites の 設計 22 サイト作成API - 概略 WebAPI Job

    ⽣成された静的サイトのファイルを、ホスティングサーバへデプロイします。
  12. MuuMuu Sites の 設計 23 サイト作成API - 概略 WebAPI Job

    新しいサイトのデプロイを検知したら、 ユーザにその案内を表⽰します。
  13. ⼯夫した点 26 • 「正常に動作している」という状態をどう表現する? ◦ jobは定期的にRedisStreamsからメッセージを読み取っている ◦ 読み取る直前にRedisにホスト名をキーにした値をsetする (Heart Beatをsetする)

    ◦ その値はTTLつきとする (たとえば180秒とか) • 定期的な読み取りがストップしていた場合、HeatBeatが揮発する • HeartBeatがある状態を正常、ない場合を異常と扱う jobの死活監視はこうした
  14. ⼯夫した点 27 • それをどのようにしてPod外から監視するか? ◦ jobと同じプロセス内でexpressでhttpサーバを起動 ◦ ヘルスチェック⽤のエンドポイントを準備 ▪ HeartBeatの有無によって、

    レスポンスのステータスコードを変える(200 or 500) • これを、k8sのDeploymentのLivenessの設定に⼊れておく jobの死活監視はこうした
  15. MuuMuu Sites の 設計 29 まず思い出してほしい - サイト公開フロー サイト公開に⾄るまで、このフロー を何回も繰り返し動かしている

    たとえば DNS設定とVirtualHostの設定 → 処理終了 → 再度動かす → http疎通チェック → NG → 処理終了 → 再度動かす → http疎通チェック → NG → 処理終了 → 再度動かす → http疎通チェック → OK → 証明書発⾏へ進む
  16. ⼯夫した点 30 • サイト公開フローは5分に1回のバッチ処理で実⾏している • しかしそれだと無駄が多い側⾯がある ◦ 例)サーバ証明書の発⾏リクエストが実⾏ → 1分後にhttps疎通できるようになった

    → でも、https疎通チェックと次のアクションの実⾏は4分後... この4分間無駄に待たされるのはどうなの? サイト公開フローをいい感じに連投したい - 課題
  17. ⼯夫した点 36 Transactionとロック読み取りがないと、こんなケースがありうる レースコンディション - こう対応した プロセスA (バッチ) プロセスB (XHR)

    muu_sites_publish_processes レコードを取得 muu_sites_publish_processes レコードを取得 is_locked == 0 だから ロックかかってないと判断し処理継続 is_locked == 0 だから ロックかかってないと判断し処理継続 is_locked = 1 として更新(=ロックする) メイン処理を実⾏ is_locked = 1 として更新(=ロックする) メイン処理を実⾏してしまう
  18. ⼯夫した点 37 Transactionとロック読み取りがあると安⼼ レースコンディション - こう対応した プロセスA (バッチ) プロセスB (XHR)

    トランザクション開始 トランザクション開始 muu_sites_publish_processes レコードを取得 ([DB]ロック読み取り) is_locked == 0 だから [APP]ロックかかってないと判断し処理継続 is_locked = 1 として更新(=[APP]ロックする) トランザクション終了 メインの処理を実⾏ muu_sites_publish_processes レコードを取得 is_locked == 1 なので[APP]ロックありと判断 トランザクション終了 [APP]ロックありなので、メイン処理はスキップ Aのトランザクション内で [DB]レコードロックがかけられているので、 Aのトランザクションが終了するまで 取得できない