見出し画像

多様なナレッジ作成を支えるシステム

ナレッジワークで SWE をしている味野(@minodisk)です。

ナレッジワークは、ナレッジを蓄積し活用するためのプロダクトを提供しています。一口にナレッジと言っても、組織によってナレッジを作るソフトウェアは異なり、そのファイル形式はさまざまです。

ナレッジワークでは、さまざまなファイル形式をウェブブラウザ上で表示することをサポートするために、ファイルを前処理してプロダクトで取り扱える形式に変換する仕組みを作っています。
この一連の変換を、Content Processing System と呼んでいます。今回は、 Content Processing System のシステムデザインの概要を解説します。

システムデザイン

まず、Content Processing System は Initiator・Converter・Processor・Finalizer と大きく 4 つのステップに分かれています。

システム全容

あるステップのワーカーで処理が終わるとそのワーカーは Pub/Sub にメッセージを送信し、次のステップのワーカーはメッセージを受信し処理を始めます。 一部を除き全ての Pub/Sub は、ワーカーにメッセージを push します。
大量の前処理が一度にリクエストされる場合があるのですが、一部のワーカーは同時に利用可能なリソースが限られているため、Pub/Sub をメッセージキューとして利用することで大量のリクエストを徐々に処理することができるようになっています。

それぞれのワーカーにどのような責務を持つのか、またどのように構築しているのかみていきましょう。なお簡易のため、図には正常系のみを示しています。

Initiator

Initiator

ナレッジのもととなるファイルは Cloud Storage に置かれることになっています。Cloud Storage にファイルがアップロードされると、Cloud Storage trigger で Initiator を起動します。

Initiator はファイルの形式を判別し、形式別に適切なワーカーにメッセージングするのが責務です。
Office 系や iWork 系のファイルの場合は Converter へ、PDF や画像の場合は Processor にメッセージングします。サポートしていない形式の場合は Finalizer にメッセージングします。

Converter

Converter

Converter は受け取ったファイルを、後処理で利用しやすい形式に変換するのが責務です。
現在は後処理を PDF ファイルで扱うようにしているため、PDF ファイルに変換します。変換処理に失敗した場合は、 Finalizer にメッセージングします。

Content Processing System の中で最も大変なのは、この Converter の構築と運用です。PowerPoint や Keynote などのファイルを PDF に変換するために、それぞれのファイルを開くことのできるソフトウェアをサポートしている OS 環境を構築する必要があります。

PowerPoint などの Office 系ファイルは Windows OS でしか動作しないため、Windows OS 環境に Converter を構築しています。現在は、仮想専用サーバーにインストールした Windows OS 内で PowerShell を通して Office を操作し、ファイルを開いて PDF をエクスポートします。

また Keynote などの iWork 系ファイルは macOS でしか動作しないため、macOS 環境の Converter が必要です。現在は MacinCloud というサービス上の macOS 内で AppleScript を通して iWork を操作し、ファイルを開いて PDF をエクスポートします。

Processor

Processor

Processor は、サムネイル生成やテキスト抽出するのが責務です。
処理に失敗した場合は、 Finalizer にメッセージングします。

PDF の場合は、テキスト抽出を行います。ここで抽出したテキストは、ナレッジの全文検索に使用します。
また、1 ページ毎にキャプチャー画像を生成します。ここで生成した画像を使って、ナレッジの高速なレンダリングを実現しています。またこの画像を使って、ナレッジのサムネイル上でマウスを動かすと内容をパラパラとプレビューできる機能も実現しています。 ナレッジを開かずしてざっくりと中身を確認できるので、ナレッジを探す際に便利な機能です。

Finalizer

Finalizer

Finalizer は処理の成否を、メインのアプリケーションに通知します。
成功した場合は処理済みのデータを、失敗した場合はエラーの内容を通知します。

なお、Pub/Sub リクエストが何度も失敗し Pub/Sub メッセージが dead letter 入りしてしまった場合など、途中で処理がどこかで消えてしまったということが起こる可能性があります。
そのため、処理を開始してから一定時間経ったが Finalizer まで処理が到達していないものは変換処理に失敗したとみなす、という機構を入れています。

セキュリティを担保するためのデザイン

ナレッジワークは、お客様から預かる大切なナレッジを扱っています。そのためセキュリティを担保することは、システムデザインにおいて最も重要な要素です。
ここでは、セキュリティを担保するための仕組みをいくつかご紹介します。

権限管理

Initiator は、変換前のファイルをバケットから GET するための Signed URL と、変換後のファイルをバケットに PUT するための Signed URL を生成して後続のワーカーに渡します。
こうすることで Converter と Processor はバケットにアクセスする権限を持たず、必要なファイルにだけアクセス可能な状態で処理を行います。

分別管理

ソースとなるファイルを保存するバケット、変換中のファイルを保存するバケット、変換後のファイルを保存するバケットに分けることで、誤ってファイルを上書きするリスクを軽減しています。
ソースとなるファイルさえあれば変換中のファイルや変換後のファイルは再生成できるので、冪等性を担保しているともいえます。

ウィルススキャン

図からは省略していますが、Initiator は後続のワーカーに処理を流す前に Scanner と呼ばれるワーカーにファイルを送ります。 Scanner では、ウィルススキャンを行います。
ウィルスが検出された場合は、後続のワーカーに処理を流さずに Finalizer にメッセージングします。

解決すべき課題

システムは運用していく中で、課題が見つかります。Content Processing System も例外ではなく、いくつかの課題があります。
ここでは課題のいくつかを紹介します。

トレーサビリティ

いくつかのワーカーを跨いで動作するので、特定のナレッジの変換がどのステップにいるのか分かりづらいです。そのため失敗した際にも、どのステップで失敗したのか追いづらく運用が大変です。
トレーサビリティを上げるために、処理の初めから最後まで同一 ID をメッセージに含めて引き回し、常にログに出力する必要があります。

Converter のスケーラビリティ

オートスケールのような便利なものはないので、スケールさせるにはサーバーを手動で構築して増やす必要があります。特に Windows サーバーや Mac サーバーは 0 から構築すると、構築した時期によって OS バージョンや使っているソフトウェアのバージョンが異なる可能性があります。
この課題を解決すべく、OS イメージが作成可能なサービスへの移行を検討しています。

Converter の監視

Converter は Office 製品や iWork 製品をスクリプトで操作しており、エラーの原因が分かりづらいです。
エラーパターンの網羅性を増やし、エラーの原因を特定できるように監視を強化していく必要があります。

システムデザインの手法

このように、ナレッジワークでは必要な場合にはシステムをゼロからデザインします。システムデザインは DesignDoc という形式で記述し、プロダクトを使ってナレッジとして共有されています。

今回紹介した Content Processing System はナレッジワークのプロダクトの根幹となるシステムデザインといえます。
このシステムは CTO の @mayah が 2021 年 11 月ごろにデザインしました。私は、2022 年の 11 月に入社したのですが、DesignDoc を通してシステムの概要を理解することができました。

このように、システムデザインを DesignDoc という形でナレッジとして蓄積することで、新しいメンバーが入社したときのシステムの理解の助けになっています。このようなドキュメントが存在しない場合、全容を把握することは困難を極めます。
今回のような大物のシステムだけでなく、小さな粒度のものもたくさん書かれており、システムを理解する助けになっています。

共に課題解決していただける方を募集しています

最後まで読んでいただき、ありがとうございます。
ナレッジワークでは DesignDoc をベースに議論しながら、共に課題を解決してくれるバックエンドエンジニアを募集しています。興味のある方は @minodisk に DM いただくか、以下の採用情報よりカジュアル面談やバックエンドエンジニアの選考にご応募ください!

まずは話を聞いてみたいという方も大歓迎ですので、その場合は下記カジュアル面談フォームよりご応募ください!


みんなにも読んでほしいですか?

オススメした記事はフォロワーのタイムラインに表示されます!