Slide 1

Slide 1 text

PHPをGoにする mercari.go #4 @sters

Slide 2

Slide 2 text

@sters ● https://twitter.com/sters9 ● https://gomiba.co.in/ やったことなど書いてます ● Go 歴半年+ くらいになりました ● マイクロサービスちょっとだけ分かってきた

Slide 3

Slide 3 text

メルカリのイマ -マイクロサービス化-

Slide 4

Slide 4 text

マイクロサービス化 ● メルカリのAPIはPHPを主体とした、大きなアプリケーション ● 切り崩してマイクロサービス化を進めています メルカリがマイクロサービスに舵を切った大きな理由は、組織をどんどん拡大していくという目標で す。現時点でのメルカリのエンジニア数は 300人ですが、我々はその 3倍の、1000人規模のエンジニア リング組織を目指しています。 そして今まで以上のスピードとパフォーマンスを保ってプロダクトを開発し、お客様により 良いサービスを提供していくことを目指しています。 from @deeeet in Mercari Tech Conf 2018

Slide 5

Slide 5 text

マイクロサービス化 ● それぞれのマイクロサービスの開発は順次始まり 続々と本番リリースへ向けて進んでいます。 ● と、いう話は Mercari Tech Conf 2018 でされました。 https://techconf.mercari.com/2018 ● 記事が様々なところで公開されています。 !!!!!見てほしい!!!!!

Slide 6

Slide 6 text

マイクロサービス化 ● メインの言語として Go を採用している ● ※これは個人の感想です ○ "マイクロサービス" であって、個々のサービスが複雑になりにくいという前提 ○ 大規模なパッケージ、フレームワークなどを学ばなくてもよい ○ Go 周辺知識を学ぶべきことが少ない = Go がわかればコードが分かる ○ シンプル。疎結合。非同期。 ○ gRPC!!! ○ まとめ: ええやん

Slide 7

Slide 7 text

@sters の取り組んでいるところ

Slide 8

Slide 8 text

“通知” のマイクロサービス ● メルカリにある通知を広く取り扱っていこうと考えている ● 通知全体として、オーナーシップをもってチーム化できたほうがやりやすい ○ プロダクト施策として考えても、通知に関してはココと調整すれば解決! という状態がよいのでは。 ● とはいえ後々分割するかも。e.g. Email service, Push service ○ 実装として依存を少なく分割しておく ○ あとでサービスとして分割することも容易

Slide 9

Slide 9 text

● 「こういうデータタイプのときは、この専用クラスを使う」 ● その “専用クラス” がそこそこな数ある メルカリAPI の “通知” 実装 ※コードはイメージです [ PHP ]

Slide 10

Slide 10 text

メルカリAPI の “通知” 実装 ● 移行期、なるべく現行のものに互換性を高く作っていきたい ○ ロールバックのしにくい変更を加えることが難しい ○ リリースに向けて多数の変更があると QA 項目が無限に膨らむ ○ API の Input と Output の形が変わると他チームとの調整が必要になる ○ ビジネスロジックを変えるなら Product Manager な人達との調整が必要になる ○ → 時間が無限にかかっていく!

Slide 11

Slide 11 text

メルカリAPI の “通知” 実装 ● Input と Output を変えない、データの持ち方も変えない ● → PHP から Go に実装を移すだけ ● 「こういうデータタイプのときは、この専用クラスを使う」 ● その “専用クラス” がそこそこな数ある ● 淡々と人間が手作業で翻訳するの… ● プログラムに任せよう!!!

Slide 12

Slide 12 text

PHP を Go にする

Slide 13

Slide 13 text

[ PHP Golang xxxxx ][検索] ● xxxxx = convert, translate, transpile ○ そりゃまあ無いよね。 ● https://github.com/deuill/go-php ○ Go による PHP のバインディング ● https://github.com/kitech/php-go ○ Go で PHP Extension を書ける ● どちらも面白いが、欲しいものはちょっと違う

Slide 14

Slide 14 text

PHP to Go の機運 ● ないものは作ろう! ○ 同じものを欲している人が他にもいるかもしれない ○ というか自分がいますぐ欲しい ● PHP to Go の方針 ○ 100% 完璧な変換はできなくていい、というか無理。 ○ 職人による手作業を加えることで 愛あるコード Go way, パフォーマンスなどの要素を入れる ○ 変換した Go っぽいコードと元のコードを並べて見ることができれば コードの意図も汲んで手で修正も容易のはず

Slide 15

Slide 15 text

Version.1 of PHP to Go ● nikic/php-parserを使うと PHP → AST → PHP と行き来できる ○ https://github.com/nikic/PHP-Parser ○ PHP で実装された PHP パーサ ● 1. コード表記の統一目的でいったん AST を経由してコードを出力 ● 2. 出力されたものを文字列置換で頑張って変換 ● 3. それっぽいコードが手に入る!

Slide 16

Slide 16 text

Version.1 of PHP to Go ● Before ○ 一番最初は全部手作業で、解読してコピペの繰り返してた ○ 1つあたり 20-40分 くらい。 ● After ○ 文字列置換していく実装は 3-4 時間 程度 ○ 変換しつつバグ修正しつつドメイン特化していった ○ 最終的には 1つあたり 5-10分 で移植完了 ● “そこそこな数ある” うちの 50-60クラスくらいは PHP to Go で楽した

Slide 17

Slide 17 text

Version.1 of PHP to Go ※イメージ図です [ PHP ]

Slide 18

Slide 18 text

Version.1 of PHP to Go ※イメージ図です [ Go ]

Slide 19

Slide 19 text

Version.1 of PHP to Go ● メルカリなドメイン知識に紐づく記述だらけなので公開できない ○ 世の中の使いたい人ゴメン ● @morikuni < それ mercari.go #4 で話してくださいよ! ● 圧倒的汎用化のチャンス!!

Slide 20

Slide 20 text

Version.2 of PHP to Go ● 冷静に nikic/php-parser の実装を見てみると… ● AST 自体に PHP の書き方が入っているわけではない(そりゃそうだ) ● AST を整形するための Pretty Printer が PHP コードを作っている ● そこをオーバーライドしたら良いのでは?

Slide 21

Slide 21 text

Version.2 of PHP to Go ● できた ● https://github.com/sters/phptogo ○ 各 AST ノードの成形時に対して、フックを仕込めるようにした ○ ドメイン知識っぽいところはそれぞれで実装しよう!! ○ というか基礎的な構文くらいしか対応していない ○ 各関数は各自で

Slide 22

Slide 22 text

Version.2 of PHP to Go [ PHP ] [ Go ]

Slide 23

Slide 23 text

Version.X of PHP to Go ● PHP じゃなくて、ワンバイナリでシュッとやりたい… ● PHP to Go written by Go with converted "PHP to Go written by PHP" ○ 要はセルフホスティング。 ○ でも nikic/php-parser 他依存ライブラリもあるし …、ちょっとパワーかかり過ぎでは!! ● https://github.com/stephens2424/php ○ Go で書かれた PHP パーサを見つけた(今週の話) ○ 「トランスパイルしたいよな!」みたいなことも言っている模様 ○ その流れに合流していくとよさそう ○ そもそも需要高さはわからない(このリポジトリで over 400 stars なのでそこそこ…?)

Slide 24

Slide 24 text

まとめ

Slide 25

Slide 25 text

まとめ ● メルカリ、マイクロサービスやっているってよ ● 課題はいろいろたくさんあるのでテクノロジーも駆使していきたいよね ○ バランスを取って。とはいえ泥臭さも必要なときも。 ● sters/phptogo は適宜出番が来てくれると嬉しい ○ 世の中のPHPデベロッパーが Go に困ったときにでも。