Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Notionで作るWebサイト「MuuMuu Sites」の裏側
Search
kinosuke01
December 15, 2023
Technology
2.8k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Notionで作るWebサイト「MuuMuu Sites」の裏側
kinosuke01
December 15, 2023
More Decks by kinosuke01
See All by kinosuke01
Playwright x GitHub Actionsで実現する「レビューしやすい」E2Eテストレポート
kinosuke01
1
1.9k
AIを導⼊しても、 開発⽣産性は"爆増"していない なぜ?
kinosuke01
4
6.3k
長年続く手動E2Eテストを自動化で救いたい
kinosuke01
0
180
バックエンドエンジニアによるフロントエンドテスト拡充の具体的手法
kinosuke01
1
1.6k
生成AIで加速するテスト実装 - ロリポップ for Gamersの事例と 生成AIエディタの活用
kinosuke01
0
360
カンファレンス登壇資料を毎日読む習慣
kinosuke01
0
280
Other Decks in Technology
See All in Technology
AI-DLCを “そのまま導入しなかった”話 ~組織に合わせてアジャストした 私たちの実践共有~
hiroramos4
PRO
0
130
Agent Skills設計で柔軟性と硬さのバランスが難しい話
nassy20
0
140
気づかぬうちにセキュリティ負債を生むAPIキー運用
sgwrmctk
0
180
iAEONの段階的リアーキテクト戦略 / iAEON's_Gradual_Re-architecture_Strategy
aeonpeople
0
230
Bucharest Tech Week 2026 - Reinventing testing practices in the AI era
edeandrea
PRO
1
170
白金鉱業Meetup_Vol.24_「AIエージェントは分けるほど良い」は本当か? / Is it true that “the more you divide AI agents, the better”?
brainpadpr
1
410
AI時代のコスト管理を考えよう〜明日から使える実践AWSノウハウ~
yoshimi0227
0
230
アンオフィシャルな、オフィシャルからのお願い
wyamazak_devrel
0
140
【Cyber-sec+】経営層を"動かす"ための考え方
hssh2_bin
0
190
ロボティクスの技術 / Robotics Technology
ks91
PRO
0
100
マルチアカウント環境での コーディングエージェントを使った障害調査が大変なので AIエージェントにReadOnly権限を付与してみた / ReadOnly AI Agents for Multi-Account AWS Incident Response
yamaguchitk333
2
110
2026TECHFRESH畢業分享會 - Lightning Talk - 打造精準高效的 MCP 設計模式與測試實務
line_developers_tw
PRO
0
1.3k
Featured
See All Featured
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
210
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
730
GraphQLとの向き合い方2022年版
quramy
50
15k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
How STYLIGHT went responsive
nonsquared
100
6.2k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
420
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
330
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Designing Experiences People Love
moore
143
24k
Agile that works and the tools we love
rasmusluckow
331
21k
WENDY [Excerpt]
tessaabrams
11
38k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.5k
Transcript
1 Notionで作るWebサイト 「MuuMuu Sites」の裏側 きのすけ (⻄⽥ 貴之) ホスティング事業部 事業開発チーム 2023.12.13
2 ⾃⼰紹介 ホスティング事業部 事業開発チーム 2020年 中途⼊社 きのすけ kinosuke01 • Webアプリケーションエンジニア •
バックエンドの開発がメインですが、 職種を越境してフルサイクルな動きをしがち。 • ディレクターや デザイナーとわいわい仕事しています。 • X(Twitter) : @kinosuke01
3 アジェンダ • MuuMuu Sitesというサービスをリリースしました。 • 新しいサービス、裏側の仕組み気になりますよね。 • 今回は、そういった好奇⼼を少しでも満たせれば。
4 アジェンダ 1. MuuMuu Sites の 紹介 2. MuuMuu Sites
の 設計 3. ⼯夫した点 3.1. jobの死活監視 3.2. サイト公開フロー
1. MuuMuu Sites の 紹介 5
MuuMuu Sites の 紹介 6 MuuMuu Sites ってなに? Notionに書いたページに 独⾃ドメインをあてて
デザインをカスタマイズして Webサイトとして 公開できるサービス
MuuMuu Sites の 紹介 7 MuuMuu Sites ってなに? - 補⾜
• ドメインの購⼊管理ができるサービス 「ムームードメイン」 の 1機能として提供 • 必要な費⽤は「ドメインの取得更新費」のみ ドメインがあれば無料でサイトが作成可能 • 読みは「ムームーサイト」
MuuMuu Sites の 紹介 8 1. ムームードメインでドメインを取得 2. Notionにコンテンツを書く 3.
MuuMuu Sites でWebサイトを作成 使い⽅
MuuMuu Sites の 紹介 9 • MuuMuu Sitesで案内に従って選択肢から選ぶだけ MuuMuu SitesでWebサイトを作成
ドメインを 選ぶ 公開する Notionページ を選ぶ サイトの テーマを選ぶ Notion連携 \!完成!/
MuuMuu Sites の 紹介 10 設定項⽬が厳選されているので、選択肢から選ぶだけで 「あ、これもいいな」と思えるサイトに。 デザインのカスタマイズ
2. MuuMuu Sites の 設計 11
MuuMuu Sites の 設計 12 Notion API ホスティングサーバ ページの情報を取得 取得したデータから
サイトデータ (html,cssなど)を生成 生成したファイルを ホスティングサーバに アップロード Webサイトとして 閲覧できる
MuuMuu Sites の 設計 13 サイト公開フロー - 概略 ⼩さくて読めないので 次のスライド以降でわけて説明
14 MuuMuu Sites の 設計
15 MuuMuu Sites の 設計
16 MuuMuu Sites の 設計
17 MuuMuu Sites の 設計 サイト公開 - 概略 • サイト公開に⾄るまで、このフローを何回も繰り返し動かしている
• たとえば • DNS設定とVirtualHostの設定 → 処理終了 → 再度動かす → http疎通チェック → NG → 処理終了 → 再度動かす → http疎通チェック → NG → 処理終了 → 再度動かす → http疎通チェック → OK → 証明書発⾏へ進む
MuuMuu Sites の 設計 18 サイト作成API - 概略 WebAPI Job
MuuMuu Sites の 設計 19 サイト作成API - 概略 WebAPI Job
サイトビルド&デプロイ リクエスト
MuuMuu Sites の 設計 20 サイト作成API - 概略 WebAPI Job
WebAPIで受けた ビルド&デプロイリクエストは RedisStreamsを流れます
MuuMuu Sites の 設計 21 サイト作成API - 概略 WebAPI Job
メッセージを受け取ったら、 Next.jsアプリケーションを 外部コマンドで起動し、 静的サイトをビルドします。 Next.jsアプリケーションは 内部でNotionAPIを呼び出し ビルドに必要な情報を取得します。
MuuMuu Sites の 設計 22 サイト作成API - 概略 WebAPI Job
⽣成された静的サイトのファイルを、ホスティングサーバへデプロイします。
MuuMuu Sites の 設計 23 サイト作成API - 概略 WebAPI Job
新しいサイトのデプロイを検知したら、 ユーザにその案内を表⽰します。
3. ⼯夫した点 - jobの死活監視 24
⼯夫した点 25 • WebAPIは、ヘルスチェック⽤のエンドポイント⽣やしておけば • jobの場合は? ◦ 「正常に動作している」という状態をどう表現する? ◦ それをどのようにしてPod外から監視するか?
jobの死活監視どうする?
⼯夫した点 26 • 「正常に動作している」という状態をどう表現する? ◦ jobは定期的にRedisStreamsからメッセージを読み取っている ◦ 読み取る直前にRedisにホスト名をキーにした値をsetする (Heart Beatをsetする)
◦ その値はTTLつきとする (たとえば180秒とか) • 定期的な読み取りがストップしていた場合、HeatBeatが揮発する • HeartBeatがある状態を正常、ない場合を異常と扱う jobの死活監視はこうした
⼯夫した点 27 • それをどのようにしてPod外から監視するか? ◦ jobと同じプロセス内でexpressでhttpサーバを起動 ◦ ヘルスチェック⽤のエンドポイントを準備 ▪ HeartBeatの有無によって、
レスポンスのステータスコードを変える(200 or 500) • これを、k8sのDeploymentのLivenessの設定に⼊れておく jobの死活監視はこうした
3. ⼯夫した点 - サイト公開フロー 28
MuuMuu Sites の 設計 29 まず思い出してほしい - サイト公開フロー サイト公開に⾄るまで、このフロー を何回も繰り返し動かしている
たとえば DNS設定とVirtualHostの設定 → 処理終了 → 再度動かす → http疎通チェック → NG → 処理終了 → 再度動かす → http疎通チェック → NG → 処理終了 → 再度動かす → http疎通チェック → OK → 証明書発⾏へ進む
⼯夫した点 30 • サイト公開フローは5分に1回のバッチ処理で実⾏している • しかしそれだと無駄が多い側⾯がある ◦ 例)サーバ証明書の発⾏リクエストが実⾏ → 1分後にhttps疎通できるようになった
→ でも、https疎通チェックと次のアクションの実⾏は4分後... この4分間無駄に待たされるのはどうなの? サイト公開フローをいい感じに連投したい - 課題
⼯夫した点 31 • バッチ処理とは別ラインで、サイト公開処理を実⾏するようにした • 「MuuMuu Sites」のコンパネ開きっぱなしのとき、 定期的(⼗数秒おき)にXHRで公開処理を実⾏するAPIを叩いている。 • これにより、5分を待たずとも公開処理を先に進めることができている。
(※他にもやりようはあったのだけど、諸般の事情でそうした) サイト公開フローをいい感じに連投したい - こうしてみた
⼯夫した点 32 • もちろんそうすることで新たな問題も。 • 同じサイトの公開処理が並列で実⾏されうるので、 レースコンディション発⽣による、データの不整合など発⽣しないか。 レースコンディション - 新たな問題
⼯夫した点 33 • シンプルに排他制御を設けて対応。 ◦ 公開処理を実⾏する前に、サイト単位で公開処理をロックする。 ◦ ロック中に他のプロセスがサイトの公開処理を実⾏した場合、 何もせずに終了する。 ◦
公開処理が終了したらロック解除。 • 排他制御はDBを⽤いて実現。 レースコンディション - こう対応した
⼯夫した点 34 レースコンディション - こう対応した ロック処理の実装 (をかなり簡略化したもの)
⼯夫した点 35 • ポイント: Transaction内でREAD時にレコードロックをかけることで、 ロック処理⾃体のレースコンディションも防⽌している。 レースコンディション - こう対応した
⼯夫した点 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 として更新(=ロックする) メイン処理を実⾏してしまう
⼯夫した点 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のトランザクションが終了するまで 取得できない
まとめ 38
まとめ 39 みなさんの好奇⼼を多少満たすことは できたでしょうか。 サービスに興味がありましたら、 ぜひ「ムームーサイト」で 検索してみてください。
40 ありがとうございました!