真のサーバレスはFaaSではない

takezaki
vtecx
Published in
6 min readNov 4, 2019

--

箱根

補償トランザクションの悪夢

最近の流行りなんだと思いますが、マイクロサービスの流れで Lambda みたいな FaaS が主流な設計になっているのをよく目にします。
しかし、私は安易にFaaSを採用して後で苦労することにならないかとても心配しています。
イベントドリブンで様々なサービスを組み合わせて一つの大きなサービスを作るというFaaSのような分散アーキテクチャの考え方は実はとても難しいからです。

かつて、私の師である元IBM中島氏はこのようにおっしゃっていました。

「クラウドの名の下に、既に確立された現行のシステム作りのノウハウをスクラップにして、またまた現場のシステム造りが混乱するのではないかという心配です。努力の割には、余り付加価値を生まない新しいお作法作りや置き換えに、優秀で貴重な頭脳や時間を浪費してしまうのではないかという危惧です。」

これは十年以上前に私が分散アーキテクチャで業務アプリを作っていた頃におっしゃっていたことで、今では「クラウド」を「FaaS」に置き換えて読んでいただくとしっくりくるかと思います。

私は当時、複数のWebサービスを組み合わせて一つのシステムを構築していました。今のマイクロサービスに近い考え方です。
マイクロサービスはたしかに、I/Fがきっちり決めることで、プロタクト毎のチームに権限と責任を委譲して並行開発できるようになり、開発スピードが上がるというメリットはありました。

しかし、私達には補償トランザクションの悪夢が待っていました。
マイクロサービスには、TCCパターンやSagaパターンといったトランザクション処理パターンがありますが、どちらも結果整合性を利用する補償トランザクションパターンです。

はっきりいいましょう。ACIDトランザクションを採用しないで補償トランザクションなどで解決しようとするのは、時間の無駄であり、結果的に周りを不幸にします。補償トランザクションはむしろ腕に自信があるエンジニアが陥りがちな罠だと思っていますが、彼らはトランザクションを理解しているがゆえに運用を甘く見てしまう傾向があります。

TCCパターンやSagaパターンなどでしっかり設計されているケースはまだいい方で、実際には非同期の結果整合性だけで実装しているケースもよく見られます。特にFirebaseのcloud functionsが酷い。
あるFirebaseの商品管理アプリでは、商品に紐づくいいね数とユーザに紐づくいいね数をトランザクション更新ができないから一方を非同期更新してお茶をにごしているといった実装を見たことがあります。

非同期イベントドリブンを意識させない開発

さらに、非同期イベントドリブンを強要する設計は、サーバレスを採用しなかった理由に書いたように、開発運用工数を膨れさせます。
これは、サーバの開発管理における負担をなくすというサーバレスの趣旨からいえば本末転倒に思えます。つまり、FaaSは真のサーバレスではない。
例えば、全文検索ができないが故に、AlgoriaのAPIをコールするといった設計は何か間違っていると思います。
開発者にとって重要なのは、AlgoriaのAPIを個別にコールすることではなくて、全文検索をサポートする共通のAPIのはずです。

イベントドリブンを強要しない設計、トランザクションをしっかりサポートする、これはvte.cxの基本的なポリシーになっています。
これはFaaSと異なるBaaSの最大の特長だと考えています。

実は、vte.cx自体はkubernetesで動作しており、AP、DB、全文検索、バッチなどのPodの他、MemoryStoreなどのマネージドサービスを利用するマイクロサービスアーキテクチャになっています。

しかし、開発者には一切、vte.cxがマイクロサービスであることを意識させないようにしています。
データ更新では非同期イベントドリブンではなく同期的なトランザクションスクリプトパターンで一貫しており、検索においては、通常の検索の他に、全文検索、OR検索を同時に実行できる共通のAPIを利用できます。
全文検索だからといって、別のAPIだったり、Algoriaなどの別サービスを開発者が意識する必要はありません。
また、共通のAPIで通常の検索、全文検索、OR検索などで実行した結果をまとめてページネーションで表示できます。
ページネーションでそれぞれの検索結果をまとめることは非常に面倒な処理なのですが、それを開発者に押し付けることはせず、BaaSの共通機能として提供しているところがポイントです。

つまり、開発者が貴重な頭脳や時間を浪費してしまわないよう、面倒なことは何も考えなくていいように極力シンプルにしているのです。

これが本来のBaaSの姿であり、真のサーバレスであると思っています。

以下にvte.cxのチュートリアルのリンクを貼っておきますので、ご興味のある方はぜひお試しください。

vte.cxによるバックエンドを不要にする開発

  1. Getting Started
  2. データの登録と取得
  3. スキーマ定義と型の利用
  4. 全文検索とOR検索
  5. データの一貫性
  6. 採番
  7. サーバサイドJavaScript

また、上記を元にして作成された記事がいくつかあります。

React + TypeScript + vte.cxで簡単なWebアプリを作ってみる

React + TypeScript + vte.cxで簡単なWebアプリを作ってみる② ページネーション編

React + TypeScript + vte.cxで簡単なWebアプリを作ってみる③ 検索機能編

vte.cxとReact Hooksで簡単なアプリ作成

vte.cxとReact Hooksでページネーションの実装

vte.cxとReactで検索フォームの実装

vte.cxとReactでPDF出力機能の実装

--

--

顔がアイコンに似てますねといわれると喜びます。/ (株)コントラーズCTO/(有)バーチャルテクノロジー代表 / フロントエンドが主役のシステム開発を実現するバックエンドサービス vte.cxを作っています