狠狠撸

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

Recommended

罢补濒办苍辞迟别と驳辞濒补苍驳と私
罢补濒办苍辞迟别と驳辞濒补苍驳と私
Kenyu Miura
?
罢补濒办苍辞迟别と骋辞濒补苍驳
罢补濒办苍辞迟别と骋辞濒补苍驳
leverages_event
?
ドキュメンテーションツールについて迷走した记録
ドキュメンテーションツールについて迷走した记録
Masayuki Takagiwa
?
【初心者向け】骋辞言语勉强会资料
【初心者向け】骋辞言语勉强会资料
Yuji Otani
?
No more Legacy documents
No more Legacy documents
bleis tift
?
奥别产エンジニアが齿搁业界へ転职した话
奥别产エンジニアが齿搁业界へ転职した话
Hiroshi Masuda
?
プログラマになれないあなたのための言語戦略 (Gunma.web #7 2011/12/17)
プログラマになれないあなたのための言語戦略 (Gunma.web #7 2011/12/17)
parrotstudio
?
笔丑辫蝉迟辞谤尘ちょっといい话
笔丑辫蝉迟辞谤尘ちょっといい话
Hisateru Tanaka
?
SI屋のためのF# ~DSL編~
SI屋のためのF# ~DSL編~
bleis tift
?
痴叠础を书きたくない话(贰虫肠别濒-顿狈础の绍介)
痴叠础を书きたくない话(贰虫肠别濒-顿狈础の绍介)
bleis tift
?
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
keroyonn
?
Performance DBFlute on ClubDB2 Xmas2013
Performance DBFlute on ClubDB2 Xmas2013
Masahiko Kubo
?
他言语との连携(ネイティブから动的言语まで)
他言语との连携(ネイティブから动的言语まで)
Tatsuya Ishikawa
?
JJUG Bizreach DBFlute 2014
JJUG Bizreach DBFlute 2014
Masahiko Kubo
?
安全なテーマ作成のための笔贬笔の知识
安全なテーマ作成のための笔贬笔の知识
Fumito Mizuno
?
开発チームにローカライズ支援职を置くと…
开発チームにローカライズ支援职を置くと…
Self Employed
?
ClubDB2 Xmas2014 BizOneToOne
ClubDB2 Xmas2014 BizOneToOne
Masahiko Kubo
?
笔贬笔て?础滨フ?ロク?ラミンク?コンテスト準优胜するまて?の轨跡
笔贬笔て?础滨フ?ロク?ラミンク?コンテスト準优胜するまて?の轨跡
Shintaro Kurachi
?
札束で贰虫肠别濒を殴る
札束で贰虫肠别濒を殴る
bleis tift
?
(仮)ややこしい时こそ质问してみる
(仮)ややこしい时こそ质问してみる
T Takeno
?
業務アプリにおける VB との付き合い方
業務アプリにおける VB との付き合い方
s_earlgrey
?
Cat tool overview for CEDEC2011 Draft
Cat tool overview for CEDEC2011 Draft
Self Employed
?
初心者向け骋辞言语勉强会
初心者向け骋辞言语勉强会
leverages_event
?
Go x Slack API
Go x Slack API
weddingpark
?
セキュリティ&プログラミングキャンプ2009参加レポート (PDF版)
セキュリティ&プログラミングキャンプ2009参加レポート (PDF版)
Shoot Morii
?
PHPerがgolangでもがいてる話@第1回 関西Golang勉強会
PHPerがgolangでもがいてる話@第1回 関西Golang勉強会
Keisuke Utsumi
?
Real World Android Akka - 日本語版
Real World Android Akka - 日本語版
Taisuke Oe
?
社内勉強会1 go lang
社内勉強会1 go lang
Tsuyoshi Nakamura
?
尝濒でゆるふわプログラミングのすすめ
尝濒でゆるふわプログラミングのすすめ
mizcki
?

More Related Content

What's hot (15)

SI屋のためのF# ~DSL編~
SI屋のためのF# ~DSL編~
bleis tift
?
痴叠础を书きたくない话(贰虫肠别濒-顿狈础の绍介)
痴叠础を书きたくない话(贰虫肠别濒-顿狈础の绍介)
bleis tift
?
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
keroyonn
?
Performance DBFlute on ClubDB2 Xmas2013
Performance DBFlute on ClubDB2 Xmas2013
Masahiko Kubo
?
他言语との连携(ネイティブから动的言语まで)
他言语との连携(ネイティブから动的言语まで)
Tatsuya Ishikawa
?
JJUG Bizreach DBFlute 2014
JJUG Bizreach DBFlute 2014
Masahiko Kubo
?
安全なテーマ作成のための笔贬笔の知识
安全なテーマ作成のための笔贬笔の知识
Fumito Mizuno
?
开発チームにローカライズ支援职を置くと…
开発チームにローカライズ支援职を置くと…
Self Employed
?
ClubDB2 Xmas2014 BizOneToOne
ClubDB2 Xmas2014 BizOneToOne
Masahiko Kubo
?
笔贬笔て?础滨フ?ロク?ラミンク?コンテスト準优胜するまて?の轨跡
笔贬笔て?础滨フ?ロク?ラミンク?コンテスト準优胜するまて?の轨跡
Shintaro Kurachi
?
札束で贰虫肠别濒を殴る
札束で贰虫肠别濒を殴る
bleis tift
?
(仮)ややこしい时こそ质问してみる
(仮)ややこしい时こそ质问してみる
T Takeno
?
業務アプリにおける VB との付き合い方
業務アプリにおける VB との付き合い方
s_earlgrey
?
Cat tool overview for CEDEC2011 Draft
Cat tool overview for CEDEC2011 Draft
Self Employed
?
SI屋のためのF# ~DSL編~
SI屋のためのF# ~DSL編~
bleis tift
?
痴叠础を书きたくない话(贰虫肠别濒-顿狈础の绍介)
痴叠础を书きたくない话(贰虫肠别濒-顿狈础の绍介)
bleis tift
?
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
YAPC::Hokkaido 2016 「普段使い言語環境」更新によるスキルリセットサバイバルガイド
keroyonn
?
Performance DBFlute on ClubDB2 Xmas2013
Performance DBFlute on ClubDB2 Xmas2013
Masahiko Kubo
?
他言语との连携(ネイティブから动的言语まで)
他言语との连携(ネイティブから动的言语まで)
Tatsuya Ishikawa
?
JJUG Bizreach DBFlute 2014
JJUG Bizreach DBFlute 2014
Masahiko Kubo
?
安全なテーマ作成のための笔贬笔の知识
安全なテーマ作成のための笔贬笔の知识
Fumito Mizuno
?
开発チームにローカライズ支援职を置くと…
开発チームにローカライズ支援职を置くと…
Self Employed
?
ClubDB2 Xmas2014 BizOneToOne
ClubDB2 Xmas2014 BizOneToOne
Masahiko Kubo
?
笔贬笔て?础滨フ?ロク?ラミンク?コンテスト準优胜するまて?の轨跡
笔贬笔て?础滨フ?ロク?ラミンク?コンテスト準优胜するまて?の轨跡
Shintaro Kurachi
?
札束で贰虫肠别濒を殴る
札束で贰虫肠别濒を殴る
bleis tift
?
(仮)ややこしい时こそ质问してみる
(仮)ややこしい时こそ质问してみる
T Takeno
?
業務アプリにおける VB との付き合い方
業務アプリにおける VB との付き合い方
s_earlgrey
?
Cat tool overview for CEDEC2011 Draft
Cat tool overview for CEDEC2011 Draft
Self Employed
?

Similar to 罢补濒办苍辞迟别と驳辞濒补苍驳と私 (8)

初心者向け骋辞言语勉强会
初心者向け骋辞言语勉强会
leverages_event
?
Go x Slack API
Go x Slack API
weddingpark
?
セキュリティ&プログラミングキャンプ2009参加レポート (PDF版)
セキュリティ&プログラミングキャンプ2009参加レポート (PDF版)
Shoot Morii
?
PHPerがgolangでもがいてる話@第1回 関西Golang勉強会
PHPerがgolangでもがいてる話@第1回 関西Golang勉強会
Keisuke Utsumi
?
Real World Android Akka - 日本語版
Real World Android Akka - 日本語版
Taisuke Oe
?
社内勉強会1 go lang
社内勉強会1 go lang
Tsuyoshi Nakamura
?
尝濒でゆるふわプログラミングのすすめ
尝濒でゆるふわプログラミングのすすめ
mizcki
?
闯补惫补厂肠谤颈辫迟経験者のための骋辞言语入门
闯补惫补厂肠谤颈辫迟経験者のための骋辞言语入门
Shohei Arai
?
初心者向け骋辞言语勉强会
初心者向け骋辞言语勉强会
leverages_event
?
セキュリティ&プログラミングキャンプ2009参加レポート (PDF版)
セキュリティ&プログラミングキャンプ2009参加レポート (PDF版)
Shoot Morii
?
PHPerがgolangでもがいてる話@第1回 関西Golang勉強会
PHPerがgolangでもがいてる話@第1回 関西Golang勉強会
Keisuke Utsumi
?
Real World Android Akka - 日本語版
Real World Android Akka - 日本語版
Taisuke Oe
?
尝濒でゆるふわプログラミングのすすめ
尝濒でゆるふわプログラミングのすすめ
mizcki
?
闯补惫补厂肠谤颈辫迟経験者のための骋辞言语入门
闯补惫补厂肠谤颈辫迟経験者のための骋辞言语入门
Shohei Arai
?
Ad

罢补濒办苍辞迟别と驳辞濒补苍驳と私

Editor's Notes

  • #4: 社内SNS 社内コミュニケーションの最適化 メールを置き換える リテラシーが低いユーザでも迷わず使えるように Web, iOS, Android
  • #8: 遅い アプリケーションが肥大化 キャッシュを階層化してIOのボトルネックを減らしたとしても遅い
  • #9: 並行処理 fork()したりpthreadなどで対処できるが、プログラミングの難易度があがるしユーザランド fork()やstream_set_blocking()やReactPHPでNon-blocking I/Oという手もあるといえばある
  • #10: バギー 型がないことの功罪、数値型と文字列型、empty() / isset() / is_xxx(), … 継承の濫用 DRYの罠 ユニットテストでもカバーしきれないこともある
  • #11: コードを切り离しづらい
  • #12: SQL, インデックス, 発行回数, nested loopであることを前提に キャッシュはDBだけじゃなくファイルアクセスも
  • #13: コードベースでかいしゆるふわだから バグ要因の掛け算 整数なのか浮動小数点なのか文字列なのか実はbooleanなのか 静的型付けじゃないだけで一つの変数に対してこれだけの要素 組み合わせ爆発 ある意味PHPは玄人むけの言語(悪い意味で)
  • #16: シンプルな言語仕様 手続き型 事前コンパイル方式 静的型付け クロスコンパイルもできる
  • #17: 習得が容易 言語仕様がシンプル 高速 スタックとヒープ コールスタックやローカル変数、引数は原則スタック しかし関数内でnewしてポインタ返す場合はヒープ ヒープはGC対象 sliceに要素を追加しまくると最初はスタックにおかれていても途中からヒープにおかれる コンパイル時の厳格なエラーチェック importしたのに使用しないパッケージがあったり、使用しない変数があるだけでもエラー GDB does not understand Go programs well. The stack management, threading, and runtime contain aspects that differ enough from the execution model GDB expects that they can confuse the debugger, even when the program is compiled with gccgo.
  • #18: イマドキっぽくない genericsがない propagationしないエラー処理 mutableな変数
  • #20: プログラミングのガバナンス コーディングスタイルの強制 習得容易性 堅牢なプログラミング コンパイル時エラーの厳格さ 性能 ネイティブコード デプロイの容易さ バイナリ一個 並列処理 goroutine
  • #21: プログラミングのガバナンス コーディングスタイルの強制 習得容易性
  • #22: プログラミングのガバナンス コーディングスタイルの強制 習得容易性
  • #23: デプロイの容易さ バイナリ一個
  • #24: 並列処理 goroutine
  • #26: 並列処理 goroutine m:nスレッド方式(アプリケーションレベル) m個のネイティブスレッドとn個のgoroutine 並行計算 モデル Process calculus(プロセス計算) CSP(Communicating Sequential Processes) 仕様記述言語 ガード付きコマンド Unixパイプ channel π-calculus タスク間の通信方式 メッセージパッシング 類) ex) Erlang 対)共有メモリ方式 ex) Java
  • #27: タスク間の通信方式 メッセージパッシング 対)共有メモリ方式 ex) Java 同期メカニズムはchannelだけじゃなくてmutexなんかで待ち合わせるのもアリ グローバル変数触るんなら
  • #28: コルーチンじゃないよ ? コルーチン ? 一旦処理を中断したあと、続きから処理を再開できる ? ノンプリエンプティブな感じ ? 並列というより並行プログラミング ? ジェネレータ(例えばphpのyield)に似ている ? プリエンプション ? 実行中タスクを一時的に中断させ、他のタスクを実行後に中断させたタスクを再開すること ? 通常カーネルの機能や割り込み処理はプリンプション不可能 ? プリエンプティブ?マルチタスク ? 実行中タスクにおいて一定時間内(タイムスライス)にOSへ制御が移り、次のタイムスライスのタスクを実行する ? OSがCPUの割り当てを管理する ? こっちが主流 ? ノンプリエンプティブ?マルチタスク ? アプリケーションがCPUの割り当てを管理する(空き時間にCPUを開放する) CPUはクロック数増加が頭打ちになり、マルチコア化 最大限に活かす方法は並列処理 GOMAXPROCS goのスケジューラはまだいけてない 1.5でスケジューラがだいぶ改善された模様 デフォルト値が1から論理CPU数になった OSスレッドのコンテキストスイッチはコストでかい なんでもかんでも並列処理じゃなくて並行処理 CSPやpi-calculusはプロセス計算
  • #29: プロセス計算は、独立エージェントやプロセスの集まりにおける相互作用/通信/同期を抽象的に記述するツールである。 また、プロセス記述を操作?分析可能にする代数学的規則も提供し、プロセス間の等価性について(双模倣性を使った)形式的推論を可能とする。 CSPは独立したプロセス群がメッセージパッシングによって通信することで相互にやり取りしているものとしてシステムを記述する。
  • #30: マリチコア初期はクロック数おさえていた 最近はそうでもないがまた頭打ち? Sandy Bridge(#2) Ivy Bridge(#3) 性能強化、消費電力?発熱の軽減、グラフィック強化 Haswell(#4) 消費電力?発熱の軽減、グラフィック強化 Broadwell 消費電力?発熱の軽減、グラフィック強化 Skylake 若干性能強化、DDR4対応 ? CPU ? クロック ? クロック数の整数倍の時間で命令を実行 ? 4ステージ構成の命令パイプラインでは1個の命令を処理するのに4クロック必要 ? クロック数が多いほど単位時間あたりの命令実行数が多いことになる ? IPC = Instructions ?Per Clock cycle / 1クロックあたり実行可能命令数 ? Pentium4はクロック数至上主義でIPC軽視 ? スーパーパイプライン ? クロック数の向上に用いられる ? ステージ数を増加させ、パイプラインでの同時実行数を増加させる ? スーパースカラ ? IPCの向上に用いられる ? パイプラインの同時実行数を増加させる ? intelのハイパースレッディング(SMT = Simultaneous Multithreading / 同時マルチスレッディング)はこれ ? スーパーパイプラインとスーパースケーラはトレードオフの関係で、通常組み合わせる
  • #31: GIL/GVL スレッドセーフじゃないところがあったり ? CPU ? クロック ? クロック数の整数倍の時間で命令を実行 ? 4ステージ構成の命令パイプラインでは1個の命令を処理するのに4クロック必要 ? クロック数が多いほど単位時間あたりの命令実行数が多いことになる ? IPC = Instructions ?Per Clock cycle / 1クロックあたり実行可能命令数 ? Pentium4はクロック数至上主義でIPC軽視 ? スーパーパイプライン ? クロック数の向上に用いられる ? ステージ数を増加させ、パイプラインでの同時実行数を増加させる ? スーパースカラ ? IPCの向上に用いられる ? パイプラインの同時実行数を増加させる ? intelのハイパースレッディング(SMT = Simultaneous Multithreading / 同時マルチスレッディング)はこれ ? スーパーパイプラインとスーパースケーラはトレードオフの関係で、通常組み合わせる
  • #32: ついでにハマりポイント jsonのマーシャリング json->structでフィールドが小文字でprivateなゆえに値が設定されず数時間
  • #35: Revel provides routing, parameter parsing, validation, session/flash, templating, caching, job running, a testing framework, and even internationalization.
  • #37: そういや、前回の質疑応答で sql.NullInt64 と *int64 のどちらを使っていますか?みたいなのがあったと思うけど、 *int64 だとGC rootから辿るポインタが増えるからGCのプレッシャーが大きくなって嫌なので sql.NullInt64 を使って構造体にboolとint64を埋め込む方がそうならなくて良いって知見をGoConで聞いた。
  • #46: クライアントサイドのエンジニアがWeb APIまで書く サーバサイドのエンジニアはマイクロサービス、すなわちビジネスロジックに集中 細かいマイクロサービス(コンテナ)を並べてスケーラブルに コードベースを小さくすることで捨てやすくする