次世代ウェブカンファレンス #nextwebconf に参加できませんでしたのでお詫びします

去る10月18日に行われた次世代ウェブカンファレンスは、わたしもサーバーアーキテクチャーというセッションにスピーカーとして呼ばれていた。わたしも話す気満々だったが、当日の朝になって次男が発熱してしまい家庭の予定を変更して妻は次男、わたしは長男を連れて彼の予定をこなすことにした。ので泣く泣く当日朝に参加を断った。当日は盛況だったようで何よりである。

100ND610-DSC_2702

当日はスタッフが充実していて、ストリーミングや録画も行われた。わたしが出るはずだった server_arch セッションの動画も公開されている。ここでは、当日言おうと思っていたことと、この動画を見て言いたいことをここに書いて当日参加できなかった詫びとしたい。すまんかった。

ウェブ is 何 / 次世代 is 何

CERN発祥のHTTP/HTMLで情報伝達する仕組み(昔WWWとか言われていたもの)が普及しきって、あらゆる情報がインターネットを介して繋がる今、ウェブはもう世間のITシステムそのものになってしまったと思う。ので、まあウェブという言葉に意味はなくてコンピューターシステム、くらいなものだと考えるのがよろしい。じゃあ次世代のコンピューターシステムとはなんぞやというと、まあムズカシイというか、Googleとアマゾンの中にある未公開のものがいちおう最先端といわれている。まだ論文になっていない技術や、公開されていないソフトウェアがおそらく沢山あって…というのは期待しすぎかな? じゃあなぜこういうものが大学から出ないかというと、もうデータも設備もないから。コンピューター技術が脳内の思考実験とすこしのコンピューターで発展する時代は終わっていて、21世紀になってからは完全に設備産業になってしまった。設備を持っていないところは次世代なぞ作り出せない。全てはクラウドになるのだ。

…っていうのがビジネス的な考えで、まだ諦めるには早い。全てがクラウドに載ってしまえば、他のセッションのようにプロトコルやデザイン表現の問題が議論の中心になりやすいだろうが、本当にそれでよいのか? みんなオープンソース大好きなんじゃないの? AWSGCPも肝心のところは一切公開していなくて、それが非常に優れているのは認めるけれども、中身が分からないものを使い続けるのにオープンソース大好きとかいってたら、私が呪いをかけておいてさしあげよう*1。その手のプロプライエタリクラウドは、実装が公開されていないことはともかく、仕組みが分からないことが問題で、謎テクノロジーを使ったサービスはAWSGCPから山のように出ているわけだ。みんなそれでいいの?って思う。その上で自分の大事なビジネスを動かすのは短期的にはいいしビジネス的には正しい判断だと思うけど、技術者としてはそれは許せないよね?

かくいう私は iPhone も持っているし、この記事もMacで書いているが、まあOSそのものはもうコモディティ化してしまっているので別に何でもよいのである。最近はSurfaceに興味がある。

まあつまり次世代がどうとか以前に、いまは多くの人がブラックボックスの上に立っているわけでそれはどうなのとまず言いたい。それが分からないことには次世代もクソもないし前に進めない。それを無視できないのを忸怩たる思いで見てきた(中の人になるというのは選択肢としてなくはない)。

サーバーアーキテクチャー is 何

歴史的には、クラサバがあって、LB-AP-DBの三層とLAMPみたいな流れがあったのだけど、今はそれが多様化していてMQなりHadoopなりが裏側で動いているし、データベースもRDBMSだけじゃなくていろんなもの(いわゆるNoSQLと十把一絡にされているやつ)が登場している。コイツラをどう使い分けてサービスを構築するか、みたいなのがひとつの課題。

もうひとつは、そういうサービスの構成要素は「サーバー」ではなく、そういったひとつの役割を持ったサーバー群(クラスタとか言ったりする)が提供する機能(レプリケーションしたMQとかDBとか、もしくはLBの下でスケールアウトするAPとか、etc)をどう組み合わせてサービスを構築する時代になったのだけど、その個々のクラスタ的なやつをどう作るか、どう動くかというのももうひとつの課題。

マイクロサービスとかいうのは、更にもうひとつ屋上屋を重ねた感じで、大きくなりすぎたものを疎結合に分割していくこと。こいつはまあ、相当にビジネスが大きくなってから考えることでテクニカルにはそんなに考えることないんじゃないかと思う。むかしマッシュアップとか言ってたアレと相似形だと思えばよろし。

... という前提があったところで、録画を見た感想

  • gRPCのはなし: まあこれはHTTP/XMLJSONみたいなテキストプロトコルがバイナリになって高速化・効率化されましたって以上の話はないと思う。RPCの決定版という意味では、プログラミング言語の決定版でGoを出してきたのと相似形だと思えばよろし。
  • Thriftのはなし: gRPCが出た今、そっ閉じでいいんじゃないでしょうか。Facebookの中の人になるなら話は別だけど、実装やプロトコルとしてそんなに違うことはない。Hadoopまわりで使われているらしいけど、まあ別に何でもいいでしょ。
  • リアクティブがどうのこうのという話: N:Mのスレッドモデルがない処理系だとコールバック地獄になって非同期でコード書かないといけないっていう、そういう問題を啓蒙してみんなで取り組みましょうってことなんだけど僕はそれが既に解決されているErlangを書いてる人なので価値がわからない。N:Mの軽量なスレッドモデルがあればいいんでしょ。
  • Backpressureの話: これは push 型のアーキテクチャで、かつpushされるモノが非常に多い時に受け側が死ぬ問題を解決するもの。そうじゃなかったら必要じゃないし、必要ならフレームワークでも標準化でもなんでもやればよろし。たとえばスマホのpush通知なんかだと必要ないでしょ?
  • 非同期は人類には早すぎたとかいう話: 別にミドルとかカーネルのレイヤならみんなやってることなので、人類が進歩すればよろし。ってだけじゃあアレなので…どうやってCPU数よりも数桁多いIOなりコネクションを捌くって話で、効率的に1:1のスレッドモデルで複雑な非同期プログラミングをするか、多少効率は落ちるけどN:Mのスレッドモデルで同期プログラミングにするかっていうトレードオフでしかないと思う。パフォーマンスが欲しければ非同期で苦労してください。
  • ネットワークに限界が来ている話:海底ケーブルを引いたりGCPを使えばよいという話にはならない。データはどうやっても光の速さを超えられないわけで、たとえば地球の裏側のDBと同期レプリケーションが現実的な性能でできるか?といえば今のところTrueTimeしかないのだけど、それでレイテンシは10~30ms程度なわけだ(一般的な水晶振動子の精度が確かその程度だと記憶しているので、現実的にはそれ以上は無理だと思う)。そこが一番ムズカシイと思うけど、たとえばクラスタ間の連携とかサービス間の連携、接続についてはよくしらないので割愛。
  • Scala / Go の話: バージョン依存関係はいまのところ銀の弾丸はないので、どれ使っても大変だと思う
  • Erlangの話: 特にコメントはないです
  • 並行処理は人類には早すぎたとかいう話: 別に早すぎないと思うけど… 難しいのは設計よりもテストで、プロパティテスティングとかFault injectionとかその手の技術は発展してきているので必要な場面では苦労して使えばいいと思うけど。
  • マイクロサービスがあって初めて非同期になる: 耐障害性を考えるとそうかも?投機実行にも非同期は必要だね
  • Eventual Consistencyの話: どうしてマイクロサービスになったらそうなるのかはよく分かってないけど、2相コミットすればなんとかなるんじゃない?
  • kubernetesの話: 最近は分散スケジューラにも興味があるので、調べないと…

話そうと思っていたこと

ウェッブシステムを構築するためにはまあとにかく有象無象のツールなりミドルウェアを理解して運用しないといけない。全部見守らないといけない。大変。そういうときにはOpenStackなりでマシンを仮想化して監視やルーティング、デプロイをきれいにしてTerraformとかAnsibleとか使えるようにして…っていうのが Service as a Code を実現するために必要なことなんだけど、それってまあ「使う側」の考え方で、もうちょっと悪くいうと使うだけの話になってしまう。使うだけじゃなくて先導して作る側にまわるためにはもうちょっとビジョンが必要だと思う。

ここまでコンピューター技術の発展ってハードウェアの発達、つまり工業技術の発展に駆動されてできることが増えてきたから、ソフトウェア側の人間はそれを追いかけるだけでよかった。でも、近年は発達し尽くして端末も普及し尽くして、できないことはないっていうくらい格段に増えてきた。もちろん、連続的でリニアな発展を続けるなら、ハードウェアの進歩に立脚してそれに対応できるソフトウェアなりミドルウェアを設計すればよかったんだけど、非連続な進歩のためには「何でもできるんだけど、どうやったらいいか分からん」みたいな状況だった。それが、ここ数年で明らかに変わってきたことがある。

それは、ソフトウェア技術の発展が、ハードウェアの発展ではなくてビジネスや社会状況の変化によって生まれた新しいワークロードによって駆動されるようになってきたということ。まあビジネスや社会状況の変化はインターネットの発達によって駆動されてきたんだけど…新しい技術を生み出している先端企業というやつはデータ駆動でビジネスを動かしていて、そのビジネスのためにソフトウェア(ミドルウェア)を開発しているわけだ。インターネット上のデータを全部アーカイブして最適な広告を売れるようにするとか、世界中の人間にネットを通して物を推薦して売るシステムを組むとか、世界中の人間関係を全部オンラインに持ってくるとか、まあそういうクレイジーなスケールなり仕組みなりが今の人類の限界なので、そこからじゃないとコンピューター技術の発展も見えてこないんじゃないかなあというのが僕の持っている感覚です。そこからじゃないとアーキテクチャの変化は分からないし、それのはるか後ろを追いかけるだけで面白いの?という煽りをやりたかった。


で、その煽りのあとで最近だとBorg, YARN, Mesosとかがその例なわけで、デプロイのためのHashicorpプロダクトがやけにバズってる日本でデプロイは大した問題じゃないんだよって、あえてちょっと違うアプローチのものを紹介したかったんだけど、まあそれはまたの機会に。

あとは、マイクロサービスの文脈で可用性とかネットワーク分断の話ってわりと日本だとスルーされがちだよねえと思うので、これをはっておきますね。

kuenishi.hatenadiary.jp

まとめ

徒然なのでまとめる気はあまりない。読む方、聞く方は大変だけど、まとめなくていいって楽だよ…

*1:OSSという文字がゲシュタルト崩壊して、手足をくねらせて横たわる人間に見える呪いです