YAPC::Asiaの2日チケット(Tシャツあり)を購入して、1日目参加してきました。僕が聞いたセッションはこちら。
ベストトーク賞(1日あたり2件、計4件投票できる)は、★付きの講演に投票しました。この2講演を中心に、メモしていた内容を共有します。
ちなみに、大規模でも小中規模サービスでも捗る microservices な Web サービスのつくりかた (Kazuhiro Osawa)(スライド) も聞きたかったんですが、立ち見も含めて満席で入れませんでした。残念……。
講演内容
メリークリスマス! (Larry Wall)
- Perlの生みの親であるLarry Wallが、Perl 5〜Perl 6の開発にかかったこれまでの15年について、J. R. R. トールキンがHobbitのプロットを一部踏襲・一部改善してLord of the Ringを執筆したことになぞらえて話したセッション。
- セッションの最後には、Perl 6が、「今年の」クリスマスまでにはかなりの確度でリリースできると発表し、会場の喝采を浴びていた。
世界展開する大規模ウェブサービスのデプロイを支える技術
Miiverseのインフラを担当するはてな社員、アプリを担当する任天堂社員による共同発表
- 中澤亮太(はてな): これまでにはてなブログ、はてなブックマーク、Miiverseを担当
- 灘友良太(任天堂): Miiverseを担当
Miiverse
- ゲーム交流中心のSNS、ゲームのスクリーンショットを取ってコメントするとか
- すべてのデバイスのアプリをWebベースで実装。3DSなども、ネイティブアプリ内でWebブラウザが動作
- 専用ライブラリを使うことで、ゲーム内からのMiiverseへの投稿が可能
- JP/US/EUの3リージョンに展開(AWS利用。リージョン内でレプリケーション)
- Miiverseについては、過去にJAWS DAYSやデブサミで発表済み
今日の講演は、Miiverseをデプロイする、主に「成果物配布」の部分
従来の成果物配布方法
- Capistrano2系+Gitを利用。いわゆるPull型の手法
- 複数リージョン:海を超えたgit pullつらい問題
- 対策:各リージョンにgit slaveを立てる
- デプロイ対象が数百台規模:Gitサーバがgit pullに耐えられない問題
- 対策:ロールごとにデプロイ、かつホストごとにランダムスリープ。MackerelとCapistranoで同じロールを設定し、デプロイ対象はMackerelのAPIで取得
- それでも残る問題
- lsyncdのディレクトリ監視数上限
- rsync途中でgit fetchしてしまい、ホストごとにリビジョンが異なる
2つのGitリポジトリ
- Redmine+GitHub Enterprise (GHE)(主にコードレビューと、一部のタスク管理)
- デプロイ用とコードレビュー用、2つのリポジトリを使っている
- git push先が2個
- git push ghe master
- git push origin master
- GHEのmerge pull requestは使わない運用
- git push先が2個
- 不便なので、2つのGitリポジトリを同期したい
既存の同期ツールの検討
- google/hesokuri
- Google製のGit同期ツール。リリース時に同期を止めたい、などのMiiverseでのニーズに合わない
- ghm
- 3年くらい前からはてな社内で開発・運用しているツール(第2回 GREE Tech Talkで紹介)
- ghmの導入を当初検討したが、問題あり。Miiverse開発チームで使うには、並列化されていなく、遅い。同期が終わる前にデプロイして、古いリビジョンがデプロイされたことがあった
- そして、新リポジトリ同期システムを開発することに
- google/hesokuri
新リポジトリ同期システムの開発
- JSON over HTTPなAPI群
- 改善された同期アーキテクチャ
- スケーラビリティ
- 保守性
- masterからgit pullし、その結果をslaveにgit pushするシンプルなツール
- GHEのWeb Hookで、同期開始。どのリポジトリを同期するかは、DBから取得
- 同期ジョブは、複数リポジトリに対して同時に実行可能
これから採用しようとしている新しいデプロイ手法
- Git によるPull型の一般的な問題
- リリースするものをすべてcommitする → リポジトリの肥大化
- 各マシンでコンパイルする → 細かい環境の差異で成果物が異なる、ビルドが長くなる
- Consul + stretcher
- Amazon S3経由で成果物を配布し、そのイベントをconsulが拾って、stretcherがデプロイ
- Gitサーバの負荷が解決すると共に、Gitリポジトリには成果物を含めなくて良くなる
- 成果物の作成〜S3へのアップロードはJenkinsで実行
- 従来 1142秒 → 29秒に短縮(carton installありで210秒)
- Git によるPull型の一般的な問題
Q: 新同期システムの言語は?
- A: Perl5。MiiverseおよびサブシステムもPerl5で開発されているため。手慣れた言語を選択。
- Q: デプロイの頻度
- A: 基本的に2週間に1回の頻度。バグがあればhotfix。
- Q: 新同期システムで、1台だけ失敗した場合の検出はどうする?
- A: stretcherでは、成功時に実行するコマンド、失敗時に実行するコマンドをマニフェストに書ける。評価時は失敗したらikachanを通じてIRCに通知していた。
- Q: AWSのCodeDeployを検討した?
- A: してない。開発時にはまだリリースされてなかった。時期的な問題。
[★]HTTP/2時代のウェブサイト設計 (奥 一穂)
DeNAで、HTTP/2対応のWebサーバ "H2O"を開発している奥 一穂さんによる講演。
背景:バンド幅を増やしてもページロード時間は短くならない。しかし、レイテンシが短いほど短くなる。
- その裏付けとなるデータ
- MSとGoogleの共同発表の資料: 遅延を足すと、クリック率がどれくらい下がるか
- httparchive.orgのデータ: 転送データ量が増大中
- Nielsen's Law of Internet Bandwidth: エンドユーザの使えるバンド幅も増大中
- More Bandwidth Doesn’t Matter (Much) « Mike's Lookout: 実効バンド幅は1.6Mbps程度で頭打ちに
- バンド幅の時代は終わった。今はレイテンシが問題
- HTTP/1.1は多重性がない。同時6本のTCP接続を使うのが一般的だが、それでも遅い。
- HTTP/1.1パイプラインがある→問題があって使われていない
- 国内で東京につなぐだけなら10msくらいのレイテンシだが、LTEだと50msくらいのレイテンシ。アメリカまで光ファイバーで往復して80ms。遅くなっている。というのが背景知識
- その裏付けとなるデータ
HTTP/2の技術要素
- バイナリプロトコル
- 多重化
- ヘッダ圧縮
- 優先度制御
- サーバプッシュ
バイナリプロトコル
- 第1の目標は脆弱性を防ぐこと。パーサによる解釈の差(プロクシとサーバで違う、など)を突く攻撃がいっぱいあった。
- 転送データ量の低減。ヘッダ圧縮する→ボディも圧縮していいのでは。
- h2iコマンドを使ったデモ(HTTP/2を手で試すことができる)
多重化
- 同時に100以上のリクエストを発行可能。
- DATAのstream ID
ヘッダ圧縮
- Cookieのサイズが大きい。Google AnalyticsなどのCookie。
- よくあるヘッダは1バイトに圧縮される。直前に送ったリクエストと同じヘッダは、1バイトに圧縮できる。画像などのアセットへのリクエストが繰り返されると圧縮効率高くなる。
- デモ: Compare resource loading between HTTP/2 (H2O) and HTTP/1.1 (Nginx) | Symfony Finland
優先度制御
- 重み付け、依存関係をクライアントが指定する。
- Firefoxの場合:first-paintが大幅短縮。headタグにあるCSS、JSを優先取得したあとで、画像などを取得。body末尾のJS(Google Analyticsなど)は別の優先度で取得。
- Chromeの場合:依存関係を使っていないので、あまり速くならない。
- Edge、Safariは優先度制御を全くしていない。サーバ側でなんとかしないと速くならない。
- サーバ側のreprioritize-blocking-assetsオプションで、優先度制御対応。
- 実装が悪いために、パイプラインのように実用にならない可能性がある。
サーバプッシュ
- サーバ側から事前にプッシュすることで0 RTTに。H2O, nghttpxが対応。
- 問題:CSSやJSをプッシュしたい。しかし、ブラウザキャッシュにある場合はプッシュしたくない(プッシュしたら却って遅くなる)。
- cache-aware server-push: H20 1.5の新機能。fingerprint(キャッシュしてそうか)をクッキーに添付。
HTTP/2ではレイテンシではなく、バンド幅が再びボトルネックになる → Webサイトの作り方が変わる。
HTTP/2でオワコンになる最適化
- アセットの結合(asset pipeline)
- expiresの利用
- ドメインシャーディング
- 優先度制御できなくなるので、かえってfirst-paintが遅くなる。
- CDNを使う場合→最近はHTTPレスポンスもCDN経由で送れるようになっている。
HTTP/2にするとクリック数が増える→収益が上がる!
H2OはHTTP/2が一番速いWebサーバ
- HTTP/2はHTTPS前提。Let's Encryptが11月16日からサービス開始予定(無料でサーバ証明書をもらえるようになる)
- Forward Secrecy
- session ticketをオフにしないと、forward secrecyにならない
- H2OはWebサーバクラスタでのresumptionに対応。session ticketの秘密鍵の自動更新機能を実装。
Q: REST APIなどのサーバ間通信のためにHTTP/2を使うなら、クライアントライブラリは何を使えばいい?
- A: HTTP/2に対応したクライアントライブラリは、現状1個しかない。libcurl。
- Q: first-paint timeの計測方法。Chromeについては計測機能がないのでは。
- A: timing chartで、最後のCSS、JSを受信した時刻をfirst-paint timeとみなした。
- Q: HTTP/2はいつ頃普及するか?
- A: Webブラウザ、Firefox、Chrome、Edgeは対応済み。Safariも秋には対応する。サーバ側も秋にはNginxが出る。HTTPSにならないと恩恵が得られない。LetsEncryptが出てこないと。今はHTTP/2が(なにの?)1割。うまくいけば、年末までに3〜4割に上がるのではないか。
Conway's Law of Distributed Work (Casey West)
PivotalおよびCloud Foundryに所属。10年ほどリモートワークをしている。
Effective Communication Saves Time
- リモートワークでは透明性がデフォルトで必要
- 意思決定の理由を記録する必要がある
- 例えば、boolean型を使うべきと思われるところで、なぜboolean型を使っていないのか? 意思決定されたときの当時の情報が必要になる。
Tools
- Text Chat
- 4 primary aspects: archive, group chat, private chat, full participation
- Slack, HipChat, IRC, Google Hangout
- ChatOps
- lita (ruby), hubot (nodejs)
- audio/video communication
- headphones, microphone, camera: よい設備重要
- HipChat, Google Hangouts, appera.in, sqwiggle
- screen sharing
- Screenhero (for Slack), HipChat, join.me, WebEx
- Text Chat
Development Tools
- Commit Messages
- critically important
- Code review
- Pull Requests, Gerrit, ReviewBoard, Code Collaborator
- 一時的に開発のスピードを落とすが、欠陥を見つける、などの理由で結果的に早くなる
- Digital Progress Board
- Pivotal Tracker, Trello, GitHub Issues, waffle.io for GitHub Issues
- カンバンスタイルが好き。Jiraは好きじゃないのでリストに入ってない。
- 質疑応答の時間に、個人的な経験上、Jiraを使う場合はワークフローをカスタマイズしすぎないほうがよい、という話があった。
- Collaborative Writing
- Etherpad, Hackpad, Google Docs, GitHub Wiki
- 共同編集できて、編集結果を誰でも見られるツール
- File Storage
- Dropbox, Box.net, Google Drive, NFS
- Shared Calendar
- Google Calendar, Exchange
- Email
- collaborationのための良いツールではない。非同期。テキストチャットのほうが良い選択肢。
- Commit Messages
Techniques
- Everyone should experience remote work. 経験してみないと、リモートワークする人の気持ちはわからない
- Have on-site meetups.
- Invite remote workers into hallway conversations.
- 難しい。ビデオチャットなどで。
- Over communicate.
- 情報を定期的に共有することが必要
- Share your personality.
- テキストチャットでoff topic areaを作って、そこでやりとりする。音楽を共有する、など。
- Exhibit a "visible pulse."
- リモートワークでは、自分の状態を知らせる必要がある
- Pick a timezone. Standard Operating Time (SOT)
- チャレンジング。打合せの設定などが困難。
Sociotechnical Theory
- リモートチームにもCAP定理が成り立つ。2つしか選べない。
Conway's Law
- Organizations produce designs which are copies of the communication structures of these organizations.
- The health and quality of your product will be a direct reflection of the health and quality of your organization.
- 組織構造がプロダクトデザインに反映される、というコンウェイの法則。組織の健康や品質も、同様にプロダクトに反映される。
[★]Electron: Building desktop apps with web technologies (Ben Ogle)
GitHubでAtomを担当。最近Atom 1.0をリリースした。
Atomはデスクトップアプリ
- 操作は通常のデスクトップと同様だが、Web技術のうえに作られている。
- AtomはWebブラウザで出来ないことができる。ファイルアクセスやクリップボードアクセスなど。これは、Electronの上に作られているから。
- Electron = Chronium + io.js (node.js)
Electronで作られているアプリ
- GitHub Atom, VS Code, Facebook Nuclide
- JIBO: 家庭用知能ロボ
- Slack (for Windows)
- Mojibar (絵文字を検索するツール)
- その他の事例は http://electron.atom.io/ にあり
Electronアプリの構成
- コマンドでひな形を作成できる
- Browser Process, Render Process, Entry Pointから構成される
- KittyDetect: 猫の顔を検出するアプリ。既存のライブラリ(kittydar)を流用して、2時間で書いた。
- Curve App: ベクタ描画のアプリ。
perlでElectronアプリを作ることもできるはず。perlをJavaScriptに変換するツールがあるので、これでできるか試してみてほしい。
- すでにPerl challengeでやってみた人がいる?
esa.io - 趣味から育てたWebサービスで生きていく (Atsuo Fukaya)
- esa.io - Expertise Sharing Archives for motivated teams.
- Qiita Teamのトライアル期間が終了して、有料になったのをきっかけに開発開始
- 自分のプロジェクトや、知人のプロジェクトで使ってもらって手応え。去年の11月にesaの運営会社を作った。
- esaじゃない方の会社を今年2月にやめた。有料で使ってくれる人が思ったより増えたので。
- weekly active members(1週間に何かしらの編集をしたユーザ): 1583
Lightning Talks (Aug 21)
- Norikraで作るPHPの例外検出システム (Masahiro Nagano)
- (※TODO: スライド公開されたらリンク張る)
- PHPではエラーと例外は別物
- 補足が難しい例外がいくつかあり、設定が必要
- 発表者の環境では、最終的に4つのログファイルにエラー出力されるようになった
- ログファイルを fluentd → Norikra → Slack で表示