Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Talknoteとgolangと私

4,084 views

Published on

TalknoteにおけるGo言語採用事例です。

Published in: Engineering
  • Be the first to comment

Talknoteとgolangと私

  1. 1. TalknoteとGolangと私 三浦 堅右 2016/04/11(Mon) 実践Go言語勉強会 at 21cafe
  2. 2. Talknote
  3. 3. 利用企業数No.1の社内SNS (2014年8月:シード・プランニング調べ)
  4. 4. Talknoteの課題
  5. 5. Talknoteのアーキテクチャ(一部)
  6. 6. PHP
  7. 7. PHPで苦しくなってきたところ 遅い(性能の問題)
  8. 8. PHPで苦しくなってきたところ 並行処理を簡単に書けない(言語仕様の問題)
  9. 9. PHPで苦しくなってきたところ カジュアルに書ける反面、堅牢なプログラミングになりづ らく、バグが増加していく(言語仕様の問題) テストケース数
  10. 10. PHPで苦しくなってきたところ モノリシックで肥大化したコードベース(設計の問題)
  11. 11. 対策 • 性能の問題 • I/Oを中心に対策 • DB周りのチューニング • キャッシュの効率化 ↓ PHP自体がボトルネックに
  12. 12. 対策 • 言語仕様の問題 • テストの充実 • リファクタリング ↓ 指数関数的に増す複雑さを カバーしきれない
  13. 13. 対策 • 設計の問題 • 可能であれば新機能は独立したコードベースに ↓ コードの再利用性を捨てることになるため 、当然適用できるケースは少ない
  14. 14. Golang
  15. 15. 特徴 • Googleが開発 • シンプルな言語仕様 • 事前コンパイル方式 • 並列処理のサポート • オブジェクト指向っぽくない • クラスではなく構造体 • 継承ではなく委譲
  16. 16. メリット • 習得が容易 • 高速 • コードフォーマットの統一 • 並列処理 • コンパイル時の厳格なエラーチェック
  17. 17. デメリット • イマドキの言語と比べると見劣りする言語仕様 • コンパイル時の厳格なエラーチェック
  18. 18. 華やかさはなく いわば質実剛健
  19. 19. Talknoteの採用理由 • プログラミングのガバナンス • 堅牢なプログラミング • 性能 • デプロイの容易さ • 並列処理
  20. 20. プログラミングのガバナンス 例)厳格なコードフォーマット(OK)
  21. 21. プログラミングのガバナンス 例)厳格なコードフォーマット(NG)
  22. 22. デプロイの容易さ • ランタイムいらず • =デプロイ先のセットアップがいらない • 極端な話、ビルドしてコピーでデプロイ完了 • go build -o app app.go scp app server:/usr/local/bin
  23. 23. 並列処理 関数を非同期に実行 例)キャッシュの作成
  24. 24. 並列処理 クロージャを非同期に実行 例)キャッシュの削除
  25. 25. 並列処理 Channelによるメッセージパッシング
  26. 26. Channel
  27. 27. goroutine • タスク間の通信方式 • メッセージパッシング • Erlangが同方式を採用 • 下記に影響を受けている言われている • CSP • pi-calculus
  28. 28. CSP • Communicating Sequential Processes • プロセス計算の一つ • プロセス計算=並行システムモデリング技法 • 仕様記述言語 • Golang以外に影響を与えた技術 • Unixのパイプ
  29. 29. CPUを有効活用 • 最近のCPUはクロック数が頭打ちでコアを増やす方向へ • スクリプト言語の多くはマルチコアを活かしづらい • GIL/GVLによってネイティブスレッドを複数同時実行で きない ↓ シングルスレッドアプリケーションでは CPUを有効活用できない
  30. 30. CPUを有効活用 Golangはgoroutineなど 言語レベルで並列処理をサポートしている ↓ CPUを有効活用しやすい
  31. 31. Talknoteの例 メール投稿サブシステム
  32. 32. Talknoteの例 OAuth Client & OAuth Server & Web API
  33. 33. メール投稿サブシステム • 2014/11リリース • Go 1.4 • フレームワーク • Revel (Web API) • ORM • gorp • OAuth • osin
  34. 34. Revel • フルスタック • 基本Railsライク • scaffoldingも当然あり • しかしORMはなし • ホットデプロイ • 性能もそんなに悪くない • https://github.com/revel/revel
  35. 35. Revel
  36. 36. gorp • シンプルなORM「的」ライブラリ • 基本はSQL叩いて結果を対応する構 造体にぶち込む • なのでRevelと組み合わせた場合、基 本modelのコードがSQLを含む • https://github.com/go-gorp/gorp
  37. 37. gorp
  38. 38. gorp
  39. 39. osin • OAuth2のライブラリ • OAuthクライアントだけじゃなくOAuthサー バもつくらなきゃなかったので採用 • 割とちゃんと動いている • https://github.com/RangelReale/osin
  40. 40. 認証サブシステム • 2016/03リリース • Go 1.6 • パッケージマネージャ • glide • フレームワーク • grpc-gateway
  41. 41. 認証サブシステム
  42. 42. glide • パッケージマネージャ • Go 1.5以上で公式採用されたvendoring機能 を利用 • https://github.com/Masterminds/glide
  43. 43. glide
  44. 44. grpc-gateway • gRPC (HTTP/2 + Protocol Buffers) をラップし て JSON API (HTTP/1.1 + JSON) を提供するリ バースプロキシを生成する • https://github.com/gengo/grpc-gateway
  45. 45. マイクロサービス化 コードベースを小さく分割し、スケーラブルに
  46. 46. そんな訳でトークノートでは 技術大好きエンジニアを 絶賛募集中です。
  47. 47. ご清聴ありがとうございました

×