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

なぜYahoo!カレンダーはPHPからKotlinへ技術移行を進めるのか

BulBulPaul
September 28, 2018

 なぜYahoo!カレンダーはPHPからKotlinへ技術移行を進めるのか

Developers Summit 2018 Kansaiで発表したYahoo!カレンダーのサーバーサイド技術移行に関して。

BulBulPaul

September 28, 2018
Tweet

More Decks by BulBulPaul

Other Decks in Technology

Transcript

  1. !4 カレンダーの拠点 Ho Chi Minh ⼤阪 東京 / 紀尾井町 東京

    / 豊洲 ⾼知 • 国内4拠点 • 国外1拠点
  2. !5 @サーバーサイド  東京(紀尾井町) Engineer x 3 + SRE x 2

     ⼤阪       PM x 1 + Engineer x 2  東京(豊洲)   Engineer x 7 + SRE x 1  ホーチミン   PM x 1 + Engineer x 2 + 通訳 x 1          合計: 20名のチーム
  3. 構成 !35 GSLB VIP VIP FE, Proxy FE, Proxy VIP

    App App FE, Proxy FE, Proxy DB Secure NW ৽നՏDC ๺۝भDC
  4. サーバ増設 !36 GSLB VIP VIP FE, Proxy FE, Proxy VIP

    App App FE, Proxy FE, Proxy DB Secure NW ৽നՏDS ๺۝भDS VMを作成
  5. サーバ増設 !37 GSLB VIP VIP FE, Proxy FE, Proxy VIP

    App App FE, Proxy FE, Proxy DB Secure NW ৽നՏDS ๺۝भDS Chefで
 環境構築
  6. サーバ増設 !38 GSLB VIP VIP FE, Proxy FE, Proxy VIP

    App App FE, Proxy FE, Proxy DB Secure NW ৽നՏDS ๺۝भDS L4認証設定
  7. サーバ増設 !39 GSLB VIP VIP FE, Proxy FE, Proxy VIP

    App App FE, Proxy FE, Proxy DB Secure NW ৽നՏDS ๺۝भDS VIPへ追加
  8. サーバ増設 !40 GSLB VIP VIP FE, Proxy FE, Proxy VIP

    App App FE, Proxy FE, Proxy DB Secure NW ৽നՏDS ๺۝भDS L4認証設定
  9. !44

  10. Scale out !47 Node Node Node Node k8s Cluster Pod

    Pod Pod Pod Pod Pod Pod Pod Pod Pod Pod Pod
  11. Auto healing !49 Node Node Node k8s Cluster Pod Pod

    Pod Pod Pod Down… Node Pod Pod
  12. Auto healing !50 Node Node Node k8s Cluster Pod Pod

    Pod Pod Pod Down… Pod Node Pod Pod
  13. Auto healing !51 Node Node k8s Cluster Pod Pod Pod

    Pod Node Pod Pod Down… Node Pod Pod
  14. Auto healing !52 Node Node k8s Cluster Pod Pod Pod

    Pod Node Pod Pod Down… Node Pod Pod Pod Pod
  15. Auto healing !53 Node Node k8s Cluster Pod Pod Pod

    Pod Node Pod Pod Down… Node Pod Pod Pod Pod
  16. kubernetes !54 Node Node k8s Cluster Pod Pod Pod Pod

    Node Pod Pod Down… Node Pod Pod Pod Pod 認証は?
  17. !56

  18. Appの追加 !61 VM VM VM VM CF Cluster App App

    App App App App App App App App App App
  19. Appの追加 !62 VM VM VM VM CF Cluster App App

    App App App App App App App App App App
  20. !66 Why Kotlin? • Null Safe • sealed class •

    型 / 型推論 • Smart Cast • data classが便利 • IDEのサポートが強⼒ • Javaのエコシステムを使える
  21. • Null Safe • sealed class • 型 / 型推論

    • Smart Cast • data classが便利 • IDEのサポートが強⼒ • Javaのエコシステムを使える !67 Why Kotlin? 制約と規律
  22. • Null Safe • sealed class • 型 / 型推論

    • Smart Cast • data classが便利 • IDEのサポートが強⼒ • Javaのエコシステムを使える !68 Why Kotlin? ⾼い利便性
  23. !69 Why Kotlin? 巨⼈の肩に乗れる • Null Safe • sealed class

    • 型 / 型推論 • Smart Cast • data classが便利 • IDEのサポートが強⼒ • Javaのエコシステムを使える
  24. !72 Sealed class // sample.kt sealed class Protocol{ abstract val

    seq abstract val id } data class SampleProtocol(val seq, val id) : Protocol 同⼀ファイル内のみ継承可能 ※異なるファイルから継承しようとするとコンパイルエラー
  25. !73 型推論 val name = “デブサミ” // String, val name: Stringとなる

    val count = 2018 // Int, val count: Intとなる // Spring JDBCのコード例 val count: Long = jdbcTemplate.queryForObject( “SELECT count(*) FROM user”) 左辺の型推論
  26. !75 Null Safe val task: String? = null  // nullable

    val name: String = “okada” // non null name.contains(“ok”) // 実⾏可能 task.contains(“ok”) // コンパイルエラー
  27. !78 Framework • 基本的にJavaのエコシステムを活⽤できる • Spring Framework v5からKotlin Support •

    SpringBootも使えるので導⼊コストも低い • Kotlinで実装されたFWもある(Ktor, Spring Fu, etc ) • 現時点ではSpringBootが周辺ライブラリも揃っている状況
  28. • Athenz(認証 / 認可) • Pulsar Client (MQ) • Hystrix


    (サーキットブレーカー) Use library • SpringBoot (Framework) • MVC • Batch • Moshi (Json parser) Javaライブラリ Kotlin対応ライブラリ !80
  29. public class Example { public <T> T create(Class<T> clazz) {

    try { return clazz.newInstance(); } catch (Exception e) { e.printStackTrace(); } } !83 example 1
  30. // Kotlin val example = Example() example.create(Foo::class.java) !84 example 1

    // Java Example example = new Example() example.create(Foo.class)
  31. val example = Example() example.create(Foo::class.java) !85 example 1 Example example

    = new Example() example.create(Foo.class) kotlin.reflection.KClass java.lang.Class
  32. import kotlin.reflect.KClass fun <T: Any> Example.create(kclass: KClass<T>) = create(kclass.java) val

    example = Example() example.create(Foo::class) !86 example 1 Kotlinらしい書き⽅!!
  33. @Controller class ExampleController(val foo: Foo, val bar: Bar?) { @GetMapping(“/article”)

    fun article(@RequestParam id: String, @RequestParam tag: String?) } !87 example 2 オプション 必須 @RequestParam(required = false) String name
  34. !91 Challenge • システム • 部分的にPHP -> Kotlinへ移⾏中 • 後々Java

    -> Kotlinも移⾏したい • インフラ • Istio, Envoy を使ってカナリアリリース可能な環境の構築
  35. !96 期待値合わせ • お互いの期待値を合わせるために
 以下の項⽬を ➡ 得意なコト ➡ 貢献しようとしてるコト ➡

    メンバーからの期待されているコト 必ずしも期待されてることが正じゃないように注意
  36. !99 まとめ • 技術移⾏はあくまで⼿段 • より「ユーザーのための時間を最⼤化」させるという⽬的の為に
 技術移⾏をし、適切な技術選択を進めている • KotlinやFWの仕様や特性を⽣かして、品質や⽣産性を⾼める •

    インフラもよりモダンな環境へ移⾏することで
 ユーザーが増えても変わらない価値提供をする
 取り組みをしています • 技術だけじゃなくチームづくりも並⾏して⾏うことで
 前向きな選択ができる強いエンジニアリング組織にしていく事も重要