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
2k
AIを導⼊しても、 開発⽣産性は"爆増"していない なぜ?
kinosuke01
4
6.4k
長年続く手動E2Eテストを自動化で救いたい
kinosuke01
0
180
バックエンドエンジニアによるフロントエンドテスト拡充の具体的手法
kinosuke01
1
2.1k
生成AIで加速するテスト実装 - ロリポップ for Gamersの事例と 生成AIエディタの活用
kinosuke01
0
370
カンファレンス登壇資料を毎日読む習慣
kinosuke01
0
290
Other Decks in Technology
See All in Technology
SoccerMaster: A Vision Foundation Model for Soccer Understanding
kzykmyzw
0
160
生成 AI 時代にいま一度「問い合わせ」について考えてみる
kazzpapa3
1
130
Amazon Quick 入門!
ysuzuki
2
130
41歳でAWSが好きすぎてITエンジニアになったおっさんの話
yama3133
1
730
事業成長とAI活用を止めないデータ基盤アーキテクチャの設計思想
hiracky16
0
450
設計レビューとAIハーネスで向き合う AIが生み出した新しいボトルネックの対処法 / Design Reviews and AI Harnesses Against New Bottlenecks Created by AI
nstock
4
420
AIが当たり前の組織で エンジニアはどう育つか
nishihira
1
950
”AIを使う” から ”AIに任せる” へ ─ 開発プロセスを再設計してAIを組織標準にするまで
cyberagentdevelopers
PRO
1
140
そのドキュメント、自動化しませんか?
yuksew
1
410
シンガポールで登壇してきます
yama3133
0
340
AI時代のYAGNI:「爆速で無駄になった機能」からの学び / 20260720 Naoki Takahashi
shift_evolve
PRO
3
520
AI、CDK と協働する Full TypeScript アプリケーション開発 / Full TypeScript Application with AI and CDK
geekplus_tech
2
480
Featured
See All Featured
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
550
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
67
56k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Automating Front-end Workflow
addyosmani
1370
210k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.7k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.7k
Building the Perfect Custom Keyboard
takai
2
820
Designing Powerful Visuals for Engaging Learning
tmiket
1
450
Optimising Largest Contentful Paint
csswizardry
37
3.8k
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 ありがとうございました!