スタートアップでマイクロサービスするなら、並列処理が楽で軽量な技術スタックを1つ持っとくといいかも


4日目にして割と挫折気味ですが、ポエムでなんとかつなごうと思います。


技術会社ではないスタートアップで、開発を始めていくことを念頭に置きます。

スタートアップの会社でマイクロサービスとか無理/無駄でしょ、っていう意見もあります。
が、スタートアップでも、ある程度多角的にビジネスをやっていると、マイクロサービスらしくなくても明らかにビジネスの境界が明確なときに、サービス分けといた方がむしろ無難なケースもあると思います。(そもそもユーザから見ても全く別々のサービスだとか)

しかし、このタイミングから技術スタックをどんどん増やしていくのは、いかにも考えものです・・・。たいていの場合、最初の数個のサービスは同じ技術スタックを使っていくことになるでしょう。

仮にそれがRuby on Railsだとします。実装コストが低い、枯れていてハマリが少ない、技術者もそこそこ確保しやすい、いい選択ですね!


1年くらい経つとRuby on Railsの知見も社内に溜まりはじめ、書き方や使うライブラリがこなれてくるはずです。幸いビジネスも順調に進んで、事業は4つくらいのサービスに分解されています。

そんなときに、例えば、サービスをまたがる管理画面を作りたいという話が出ました。そして、作る前にたまたま、昨日の記事、「管理画面」のマイクロサービスを立ち上げる前に考えるべきこと を見たとしましょう。

  • 選択1. SPA (Single Page Application) で作る
  • 選択2. DBをほぼ持たないようなサーバで作り、HTMLをレンダリングする
  • 選択3. 新しく責務を担うサービスを作る

検討した結果、まず責務ではないので3ではない。SPAにしたい気持ちはあるが今の技術状況で行くのは危険。
熟慮の結果、2を選択しました。


では、2をやるときに技術スタックは何にしようか少し悩みます。普通のサービスならノータイムでRailsですが、ここは少し悩みどころかもしれない・・・。

  • DBがほぼ不要 => ActiveRecordが不要。
  • API呼び出しが多い。並列にリクエスト送りたい。

というあたりで、Railsのスタックとちょっとミスマッチが心配される。

しかし現実的には、社内の技術はRuby+Railsしかなく、新しいものを習得するコストは非常に高い。

どうするか?

  1. Node.jsにする。(理論派案)
  2. Railsにする。(現実派案)
  3. 同じRubyだけど軽量のフレームワークのsinatraにする。(折衷案)

正直に言って、正解はなさそうです。2にするかもしれませんね。

ただ、2を選ぶとするときに気になることが一つあります。

RailsでMVCする方法は知っていても、「Railsで外部API叩きながらViewをつくる」方法にこなれてるわけじゃない

逆にRailsを下手に知ってる分、

  • 責務をもってしまう
  • DBにデータもってActiveRecordつくってViewでレンダリングしてしまう

・・・的なことが起きうる危惧があります。


下は、技術的負債の種別を、軽い順に並べたものです。

  1. 小さめのサービス内で完結している負債
  2. 大きめのサービスに積もってきている負債
  3. サービスをまたがる設計の負債

もっとも避けたいのは3のタイプです。3を避けるためには、ある程度矯正ギプスが必要なのかなと思っています。

いつもと違う・・というか本来それに向いているやり方(Node.jsとか)しておいたほうが、一時的コストはかかっても最終的に設計ミスって辛くなるという最大の問題は避けやすい気がしています。


逆に言うと、このサービスはこう設計するべきという指針が固くあり、それが十分浸透できるのであれば、そこにあるものは、その指針に向いてない言語やフレームワークだろうが、最初はなんでもいいと思うのです。できないってことはないので。

個人的には、スタートアップではそれって結構難しいのではないか、という気がしたりしています。

いやでも、スタートアップにおいては常に正しいアーキテクチャなんて多分ないので、逆にそういう取り決めごとみたいのをしっかりしておく方がもしかしたら大事なのかもしれません。そう考えると、もうRailsだと決め打って、そのかわり方針の取り決めをしっかりする、という戦略もあり得ると思います。

ちょっと答えは出せないです。一旦両論併記(?)してみました。


で、ここまで書いてタイトルに戻ります。

スタートアップでマイクロサービスするなら、並列処理が楽で軽量な技術スタックを1つ持っとくといいかも

きっと後々使うんだから、Node.jsか、Goか、何か使えるものを持っておきましょうよ、こういう使うタイミングがあれば、せっかくだからやっておきましょう、と。

あるいはそもそも最初からそれをバックエンドでもメインに使う、というのも、NodeにしてもGoにしても今なら全然ありだと思います。

最後に

はい、今日は正直パスの予定でしたが、初のAdventCalendar次回予告をしたいがためにポエムを書いてしまいました。

明日、5日目は、初心者詐欺で名を轟かす ovrmrw (ちきさん) さんです!!