More Related Content Similar to Talknoteとgolangと私 (20) Talknoteとgolangと私44. grpc-gateway
• gRPC (HTTP/2 + Protocol Buffers) をラップし
て JSON API (HTTP/1.1 + JSON) を提供するリ
バースプロキシを生成する
• https://github.com/gengo/grpc-gateway
Editor's Notes 社内SNS
社内コミュニケーションの最適化
メールを置き換える
リテラシーが低いユーザでも迷わず使えるように
Web, iOS, Android 遅い
アプリケーションが肥大化
キャッシュを階層化してIOのボトルネックを減らしたとしても遅い 並行処理
fork()したりpthreadなどで対処できるが、プログラミングの難易度があがるしユーザランド
fork()やstream_set_blocking()やReactPHPでNon-blocking I/Oという手もあるといえばある
バギー
型がないことの功罪、数値型と文字列型、empty() / isset() / is_xxx(), …
継承の濫用
DRYの罠
ユニットテストでもカバーしきれないこともある コードを切り離しづらい SQL, インデックス, 発行回数, nested loopであることを前提に
キャッシュはDBだけじゃなくファイルアクセスも コードベースでかいしゆるふわだから
バグ要因の掛け算
整数なのか浮動小数点なのか文字列なのか実はbooleanなのか
静的型付けじゃないだけで一つの変数に対してこれだけの要素
組み合わせ爆発
ある意味PHPは玄人むけの言語(悪い意味で) シンプルな言語仕様
手続き型
事前コンパイル方式
静的型付け
クロスコンパイルもできる 習得が容易
言語仕様がシンプル
高速
スタックとヒープ
コールスタックやローカル変数、引数は原則スタック
しかし関数内で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. イマドキっぽくない
genericsがない
propagationしないエラー処理
mutableな変数 プログラミングのガバナンス
コーディングスタイルの強制
習得容易性
堅牢なプログラミング
コンパイル時エラーの厳格さ
性能
ネイティブコード
デプロイの容易さ
バイナリ一個
並列処理
goroutine
プログラミングのガバナンス
コーディングスタイルの強制
習得容易性 プログラミングのガバナンス
コーディングスタイルの強制
習得容易性 デプロイの容易さ
バイナリ一個 並列処理
goroutine 並列処理
goroutine
m:nスレッド方式(アプリケーションレベル)
m個のネイティブスレッドとn個のgoroutine
並行計算
モデル
Process calculus(プロセス計算)
CSP(Communicating Sequential Processes)
仕様記述言語
ガード付きコマンド
Unixパイプ
channel
π-calculus
タスク間の通信方式
メッセージパッシング
類)
ex) Erlang
対)共有メモリ方式
ex) Java タスク間の通信方式
メッセージパッシング
対)共有メモリ方式
ex) Java
同期メカニズムはchannelだけじゃなくてmutexなんかで待ち合わせるのもアリ
グローバル変数触るんなら コルーチンじゃないよ
• コルーチン
◦ 一旦処理を中断したあと、続きから処理を再開できる
◦ ノンプリエンプティブな感じ
◦ 並列というより並行プログラミング
◦ ジェネレータ(例えばphpのyield)に似ている
• プリエンプション
◦ 実行中タスクを一時的に中断させ、他のタスクを実行後に中断させたタスクを再開すること
◦ 通常カーネルの機能や割り込み処理はプリンプション不可能
◦ プリエンプティブ・マルチタスク
▪ 実行中タスクにおいて一定時間内(タイムスライス)にOSへ制御が移り、次のタイムスライスのタスクを実行する
▪ OSがCPUの割り当てを管理する
▪ こっちが主流
◦ ノンプリエンプティブ・マルチタスク
▪ アプリケーションがCPUの割り当てを管理する(空き時間にCPUを開放する)
CPUはクロック数増加が頭打ちになり、マルチコア化
最大限に活かす方法は並列処理
GOMAXPROCS
goのスケジューラはまだいけてない
1.5でスケジューラがだいぶ改善された模様
デフォルト値が1から論理CPU数になった
OSスレッドのコンテキストスイッチはコストでかい
なんでもかんでも並列処理じゃなくて並行処理
CSPやpi-calculusはプロセス計算 プロセス計算は、独立エージェントやプロセスの集まりにおける相互作用/通信/同期を抽象的に記述するツールである。
また、プロセス記述を操作・分析可能にする代数学的規則も提供し、プロセス間の等価性について(双模倣性を使った)形式的推論を可能とする。
CSPは独立したプロセス群がメッセージパッシングによって通信することで相互にやり取りしているものとしてシステムを記述する。 マリチコア初期はクロック数おさえていた
最近はそうでもないがまた頭打ち?
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 / 同時マルチスレッディング)はこれ
▪ スーパーパイプラインとスーパースケーラはトレードオフの関係で、通常組み合わせる
GIL/GVL
スレッドセーフじゃないところがあったり
• CPU
◦ クロック
▪ クロック数の整数倍の時間で命令を実行
▪ 4ステージ構成の命令パイプラインでは1個の命令を処理するのに4クロック必要
▪ クロック数が多いほど単位時間あたりの命令実行数が多いことになる
▪ IPC = Instructions Per Clock cycle / 1クロックあたり実行可能命令数
▪ Pentium4はクロック数至上主義でIPC軽視
▪ スーパーパイプライン
▪ クロック数の向上に用いられる
▪ ステージ数を増加させ、パイプラインでの同時実行数を増加させる
▪ スーパースカラ
▪ IPCの向上に用いられる
▪ パイプラインの同時実行数を増加させる
▪ intelのハイパースレッディング(SMT = Simultaneous Multithreading / 同時マルチスレッディング)はこれ
▪ スーパーパイプラインとスーパースケーラはトレードオフの関係で、通常組み合わせる ついでにハマりポイント
jsonのマーシャリング
json->structでフィールドが小文字でprivateなゆえに値が設定されず数時間 ついでにハマりポイント
jsonのマーシャリング
json->structでフィールドが小文字でprivateなゆえに値が設定されず数時間 シンプルな言語仕様
手続き型
事前コンパイル方式
静的型付け
クロスコンパイルもできる Revel provides
routing,
parameter parsing,
validation,
session/flash,
templating,
caching,
job running,
a testing framework,
and even internationalization. シンプルな言語仕様
手続き型
事前コンパイル方式
静的型付け
クロスコンパイルもできる シンプルな言語仕様
手続き型
事前コンパイル方式
静的型付け
クロスコンパイルもできる シンプルな言語仕様
手続き型
事前コンパイル方式
静的型付け
クロスコンパイルもできる シンプルな言語仕様
手続き型
事前コンパイル方式
静的型付け
クロスコンパイルもできる シンプルな言語仕様
手続き型
事前コンパイル方式
静的型付け
クロスコンパイルもできる シンプルな言語仕様
手続き型
事前コンパイル方式
静的型付け
クロスコンパイルもできる シンプルな言語仕様
手続き型
事前コンパイル方式
静的型付け
クロスコンパイルもできる シンプルな言語仕様
手続き型
事前コンパイル方式
静的型付け
クロスコンパイルもできる シンプルな言語仕様
手続き型
事前コンパイル方式
静的型付け
クロスコンパイルもできる シンプルな言語仕様
手続き型
事前コンパイル方式
静的型付け
クロスコンパイルもできる クライアントサイドのエンジニアがWeb APIまで書く
サーバサイドのエンジニアはマイクロサービス、すなわちビジネスロジックに集中
細かいマイクロサービス(コンテナ)を並べてスケーラブルに
コードベースを小さくすることで捨てやすくする