Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHP を Go にする mercari.go #4

3c86b5e68b972038efd6c5cd1553d46b?s=47 sters
November 09, 2018

PHP を Go にする mercari.go #4

Transpile PHP code to Go like something code.

3c86b5e68b972038efd6c5cd1553d46b?s=128

sters

November 09, 2018
Tweet

Transcript

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

  2. @sters • https://twitter.com/sters9 • https://gomiba.co.in/ やったことなど書いてます • Go 歴半年+ くらいになりました

    • マイクロサービスちょっとだけ分かってきた
  3. メルカリのイマ -マイクロサービス化-

  4. マイクロサービス化 • メルカリのAPIはPHPを主体とした、大きなアプリケーション • 切り崩してマイクロサービス化を進めています メルカリがマイクロサービスに舵を切った大きな理由は、組織をどんどん拡大していくという目標で す。現時点でのメルカリのエンジニア数は 300人ですが、我々はその 3倍の、1000人規模のエンジニア リング組織を目指しています。

    そして今まで以上のスピードとパフォーマンスを保ってプロダクトを開発し、お客様により 良いサービスを提供していくことを目指しています。 from @deeeet in Mercari Tech Conf 2018
  5. マイクロサービス化 • それぞれのマイクロサービスの開発は順次始まり 続々と本番リリースへ向けて進んでいます。 • と、いう話は Mercari Tech Conf 2018

    でされました。 https://techconf.mercari.com/2018 • 記事が様々なところで公開されています。 !!!!!見てほしい!!!!!
  6. マイクロサービス化 • メインの言語として Go を採用している • ※これは個人の感想です ◦ "マイクロサービス" であって、個々のサービスが複雑になりにくいという前提

    ◦ 大規模なパッケージ、フレームワークなどを学ばなくてもよい ◦ Go 周辺知識を学ぶべきことが少ない = Go がわかればコードが分かる ◦ シンプル。疎結合。非同期。 ◦ gRPC!!! ◦ まとめ: ええやん
  7. @sters の取り組んでいるところ

  8. “通知” のマイクロサービス • メルカリにある通知を広く取り扱っていこうと考えている • 通知全体として、オーナーシップをもってチーム化できたほうがやりやすい ◦ プロダクト施策として考えても、通知に関してはココと調整すれば解決! という状態がよいのでは。 •

    とはいえ後々分割するかも。e.g. Email service, Push service ◦ 実装として依存を少なく分割しておく ◦ あとでサービスとして分割することも容易
  9. • 「こういうデータタイプのときは、この専用クラスを使う」 • その “専用クラス” がそこそこな数ある メルカリAPI の “通知” 実装

    ※コードはイメージです [ PHP ]
  10. メルカリAPI の “通知” 実装 • 移行期、なるべく現行のものに互換性を高く作っていきたい ◦ ロールバックのしにくい変更を加えることが難しい ◦ リリースに向けて多数の変更があると

    QA 項目が無限に膨らむ ◦ API の Input と Output の形が変わると他チームとの調整が必要になる ◦ ビジネスロジックを変えるなら Product Manager な人達との調整が必要になる ◦ → 時間が無限にかかっていく!
  11. メルカリAPI の “通知” 実装 • Input と Output を変えない、データの持ち方も変えない •

    → PHP から Go に実装を移すだけ • 「こういうデータタイプのときは、この専用クラスを使う」 • その “専用クラス” がそこそこな数ある • 淡々と人間が手作業で翻訳するの… • プログラムに任せよう!!!
  12. PHP を Go にする

  13. [ PHP Golang xxxxx ][検索] • xxxxx = convert, translate,

    transpile ◦ そりゃまあ無いよね。 • https://github.com/deuill/go-php ◦ Go による PHP のバインディング • https://github.com/kitech/php-go ◦ Go で PHP Extension を書ける • どちらも面白いが、欲しいものはちょっと違う
  14. PHP to Go の機運 • ないものは作ろう! ◦ 同じものを欲している人が他にもいるかもしれない ◦ というか自分がいますぐ欲しい

    • PHP to Go の方針 ◦ 100% 完璧な変換はできなくていい、というか無理。 ◦ 職人による手作業を加えることで 愛あるコード Go way, パフォーマンスなどの要素を入れる ◦ 変換した Go っぽいコードと元のコードを並べて見ることができれば コードの意図も汲んで手で修正も容易のはず
  15. Version.1 of PHP to Go • nikic/php-parserを使うと PHP → AST

    → PHP と行き来できる ◦ https://github.com/nikic/PHP-Parser ◦ PHP で実装された PHP パーサ • 1. コード表記の統一目的でいったん AST を経由してコードを出力 • 2. 出力されたものを文字列置換で頑張って変換 • 3. それっぽいコードが手に入る!
  16. Version.1 of PHP to Go • Before ◦ 一番最初は全部手作業で、解読してコピペの繰り返してた ◦

    1つあたり 20-40分 くらい。 • After ◦ 文字列置換していく実装は 3-4 時間 程度 ◦ 変換しつつバグ修正しつつドメイン特化していった ◦ 最終的には 1つあたり 5-10分 で移植完了 • “そこそこな数ある” うちの 50-60クラスくらいは PHP to Go で楽した
  17. Version.1 of PHP to Go ※イメージ図です [ PHP ]

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

  19. Version.1 of PHP to Go • メルカリなドメイン知識に紐づく記述だらけなので公開できない ◦ 世の中の使いたい人ゴメン •

    @morikuni < それ mercari.go #4 で話してくださいよ! • 圧倒的汎用化のチャンス!!
  20. Version.2 of PHP to Go • 冷静に nikic/php-parser の実装を見てみると… •

    AST 自体に PHP の書き方が入っているわけではない(そりゃそうだ) • AST を整形するための Pretty Printer が PHP コードを作っている • そこをオーバーライドしたら良いのでは?
  21. Version.2 of PHP to Go • できた • https://github.com/sters/phptogo ◦

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

    ]
  23. 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 なのでそこそこ…?)
  24. まとめ

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

    ◦ 世の中のPHPデベロッパーが Go に困ったときにでも。