推しアイデア
Goのキャッシュを用いることで爆速な記事提供をしつつ、常に最新の記事を提供できるようにした部分が一番の推しアイデアです。
Goのキャッシュを用いることで爆速な記事提供をしつつ、常に最新の記事を提供できるようにした部分が一番の推しアイデアです。
GitHubとブログ記事というのは、特に複数人で運用するようなブログであればかなり相性が良いです。そのようなニーズをから、このプロダクトが生まれました。
Obisidan向けのマークダウンパーサを一から作成した部分、特に構文解析をしてトークン列を生成する部分が一番の推し技術です。
Blog on GitHubは、ブログ記事をマークダウンで管理したいエンジニアを対象としたプロダクトです。
Git/GitHubにはブログ記事を複数人で運用においてusefulな機能があります。例えば、ブランチ機能はブランチを適切な名称をつけて分けることにより「誰がどのような記事を書いているか」というのが簡単にわかります。また、PullRequestの機能には、執筆者が特に見て欲しい部分をPRの本文に書いたり、レビュアーが誤字訂正や内容の誤りなどをどこで間違っているかを明示した状態で指摘したり、はたまた内容についての議論をPRごとに独立して行えたりといったブログ記事運用において使いやすい機能がたくさんあります。
これらの背景から、GitHub上でforkすることですぐにブログを始められるような、サーバサイドユーティリティ群を作成しました。
大きく2つのパートに分かれて構成されています。1つはmarkdownをパースしてHTMLを生成するパートで、これはarMPが担います。 もう一方、HTMLなどの配信はGo言語を使ったサーバが担います。サーバサイドとマークダウンパーサはは切り離して開発されているので、必要に応じて異なるマークダウンパーサを運用することも可能としています。
以下がシステム全体の俯瞰図です。
なお、EC2としているのはあくまでhttp://trail.ardririy.net/ で使用しているというだけであって、その他のクラウドコンピューティングサービスやオンプレミスでの運用も可能です。同様に、Supabaseとしている部分も開発上の都合で運用が楽という理由からであり、そのほかのデータベースを代わりに用いることがきます。このような代替可能性を保って開発することで、万人に開かれたサーバサイドにするということを目指しました。
GitHub Repository: arMP Obisidianというマークダウンで記述するメモ帳のようなものがあり、arMPはこの記法をもとにHTMLを生成するマークダウンパーサです。マークダウンを読み取って構文解析を行いトークン列に変換し、そのトークン列をもとにHTMLを標準出力するという機能を持ちます。 arMPは概ねよくあるマークダウンの記法をサポートするマークダウンパーサですが、一方で内部リンクの解決という特殊な機能を持ちます。Obsidianではある記事内でを[[他の記事のタイトル]]という表記をすることで、記述した他の記事へのリンクを作成することができます。これをパースするにあたって、リンク先の記事が公開状態に設定されていればその記事へのリンクをHTMLに埋め込み、非公開であれば何もせずにプレーンなテキストとしてタイトルだけを載せるという形で解決を行います。
言語としてRustを選定したのは、後述しますがパースにかかる時間が記事を提供する時間に直結するので、可能な限り高速にパースを行えるようにしたいという理由があります。
GitHub Repositroy: blog 固有の名称はつけていませんが、バッグエンドサーバに当たる部分です。 ユーザからのリクエストを受けて対応するページを返却します。また、GitHub Webhookを用いることでプッシュされた新規記事をすぐに公開することを可能にしています。
HTML/CSS/JSを配信するだけのサービスであればGo言語という高機能なサーバは不要ですが、以下の理由から採用に至りました。
最も大きい理由は、記事更新時の手間を最小に抑えるためです。ユーザからのリクエストに対してオンラインにパースを行い、その結果をキャッシュします。記事の変更をGitHub Webhookで検知した場合はキャッシュ結果を全て破棄することで、定数時間での記事更新を可能にします。この結果、記事の更新によるダウンタイムがほぼ0に抑えつつ爆速での記事配信を可能にしました。 また、数あるバックエンドの言語・フレームワークからGo + Gin + Bunという構成を選択した理由は、多くの人に使われておりかつ多くの人に使いやすいと言われている構成にすることで、メンテナンスを容易にし誰もが安心して運用可能するという意図があります。