スカラ祭りお疲れ様でした!っていつの話だよですが、、、今回は niwさんが発表された「twitterのサービスの作り方」のレポートをします。貴重な大規模サービスの知見を外に出してくれてniwさんには感謝!です。
前いた会社(別に隠すこともないのでニコニコの会社)もめっちゃでかくてマイクロサービスでありサービスオリエンテッドアーキテクチャであり、でかいシステムについては一家言ももやもやするところもあったのですべてがそうだよな〜と感心する発表でした。あと finagle (twitterの作ったScalaの分散ライブラリ)を追いかけているのでtwitterでfinagleを使っている人のお話が聞けるのは大変貴重でした。懇親会ではここぞとばかりに質問しまくりましたw
以下感想です。発表内容と懇親会で聞いたことと自分の感想が混ざってます。
MonoRepo
リポジトリを1個にするってのがこれはみんな(誰?)おお〜って思ったらしい。
FBやGoogleもやってるらしい。有名らしいが知らなかった
ただファイル数多いとgitが遅くなるので、そのためにgit に手を入れてるわけでそんじゃそこらのパワーないとできんよねと思った。あとただ歴史的経緯?によりAndroidとiPhone Appは別とのこと。他に例えば Vine や Periscope とかはどうなってるんだろうとあとで思って聞きそびれた。
Mesos について。
今で言うコンテナだしいまさらよくねとのこと。EC2 とか GCPとか確かに。twitterやそれのもととなったgoogleのインフラ(borg?) ってAWSといったクラウドが登場する以前に開発されたものであって今となっては自前でMesosを持つみたいなのはナンセンスなのかも、そこまで自社で持つことにこだわるのは…。
サービスの単位
発表では finagle を使って map や flatMap でサービスを組み合わせますという話でした。で、ではサービスの単位は?という質問をして、チームですというそのままな回答をいただきました。マイクロサービスって責任範囲をわけるためであって、サービスの単位は結局チームになる。まあ1チームで複数サービス持つこともあるだろうが。
逆に、明らかにチームが分かれてるのなら絶対にサービスをわけたほうがいいみたいな。
つまり会社が小さかったり、人数も少ないんならモノリシックで全然いいんよね。ってずっと思ってて、前の会社ではマイクロに作ってあったものを一枚岩アプリに作り直すというのはやったことがあってこれはこれでよかった。
インフラ
仮想化されたインフラがあって、オレオレtwitterがシュシュっと建てれてプロトタイピングとかできるという。まあーーーーこういうの必須よな。データについてはリードだけなら本番のデータを使うんじゃないかと予想。この辺の話はniwさんの発表の後半に詳しいです。
finagleの機能であるdtabもこれと関連するんでしょうがよくわかっていません。
データストア
無限のKey Value Storeみたいなのがあるとのこと。これもやっぱりかーーーーって思ったポイントです。てかこういう無限KVSのって何をつかうんでしょう??Hbase?
以前仕事でフィールド増やすのにMySQLの制約で1カラムに収まらなくなって調整するみたいなのをやっててなんか2016年なのに…って思ってたのでそうだよね…って納得した。
監視
twitter-server はいろんなmetricsがとれるがどうしてるんだろうという疑問。これはマシンごとに毎秒とか集計サーバに送っているとのこと(送る方法は確かバッチかな?)。
みんなやると思うけど、 zabbixで同じ仕組み作ってた。ただzabbixはもう触りたくない。
zipkin
いる?とのことwこれは笑った。まあちゃんと動き出したらいらんよね、、、俺もそう思う。まあもうちょっとsystemsよりのひと(systems software engineer、日本だと基盤エンジニアというのかなインフラかもしれない)だったらいるのかもしれない。
feature flag や シャドーデプロイ
finagle-toggle (feature flagとか feature toggle っていうかっこいい概念。シャドーデプロイも関連)も使ってます?と聞いたらなにそれとのこと。シャドーデプロイとかバリバリ使ってて〜ってイメージだったんですがsystemsの人しか使ってないっぽい。イメージだが、例えば内部で使ってるライブラリのバージョンアップする場合(それをオンにするフラグを用意して)systemsの人がtoggleを使ってちょっとフラグをオンにしていくのでは???でもこれはすごいいと思うし正しいインフラエンジニアとアプリエンジニアの分業に思える。
thrift
困ってない?例えばフィールドが増えるときとか?その場合はバージョン上げていくとのことだが基本的に破壊的変更をしないようにしているので困ってないとのこと(thrift 詳しくないので曖昧。。)。
finagle vs finatra
どっちがいい?って懇親会で質問してまあどっちでもいいんじゃないって回答してもらったんだけど、個人的には finatra 一択かなという気が。理由はDIで、finagleにはDIがないけど finatra にはあるので。今時はDIは必須な気がする。
おまけ
今回聞けなかったことも gitter にいる twitterの開発者たち
https://gitter.im/twitter/finagle に聞いたら普通に教えてくれると思う。
(例えば、 monorepo https://gitter.im/twitter/finagle?at=5914a8ce8a05641b1171d73d の説明をしてくれてる場面)だから今回懇親会で聞いたようなことも gitter で聞けるような気もしなくもない。