hello waf, hello phoenix

Post on 17-Jan-2017

1.153 views 0 download

Transcript of hello waf, hello phoenix

Hello WebApp,Hello Phoenix

2016/8/31 tokyo.ex#5 おーはら

Agenda

自己紹介|> 趣旨|> Phoenix とは ?|> web アプリとは ?|> web アプリの構造|> Phoenix の構造|> Why 軽量|> Why 高速

|> Why 安定|> 周辺ツール / 情報|> 不足しているもの|> まとめ

自己紹介• おーはら @ohrdev– 基盤技術部 @ ドリコム

• 仕事 / 技術スタック– 広告サービスのお世話– 全社基盤システムのお世話– Elixir/Erlang/Ruby/Lisp/etc…

• Elixir アプリ : 本番稼動 :2 、開発 / 検証 : 1– Elixir アプリ : 運用 1 年半 /v:1.0.0 -> 1.3.1(elixir)– Phoenix アプリ : 運用 1 年 /v:1.0.0 ->

1.2.0(phoenix)

趣旨• ターゲット– (Elixir is 何 ? な方 )– Web アプリ is 何 ? な方– Phoenix is 何 ? な方

• ゴール– Web アプリケーションの構造がわかる– Phoenix とは何なのかがわかる– Phoenix と他の Web アプリフレームワークの違いがわかる– Phoenix の周辺ライブラリ ( 何があるか ) がわかる

Phoenix とは?• Elixir で実装された• MVC パターンの• 高生産性、高パフォーマンスな• Web アプリケーションフレームワーク• リアルタイム web ( channel/websocket )を提供

この発表ではスコープ外とさせてください

Web アプリとは?• インターネット / ネットワークを介して使用するアプリケーション– ここでは web ブラウザ上で動作するとします– Ex) wiki 、 blog 、掲示板、 EC サイト、 etc– 何らかのフレームワーク / ライブラリを利用して作る事が多い

Web クライアント(Web ブラウザ )

Web サーバー

Request

Response

Web アプリとは?

Web サーバー

Web アプリ

HTTPWebSocket

etcnginxApache

h2ocowboy

etc

I/F 定義Python: WSGI

Perl: PSGIRuby: Rack

Clojure: RingLisp: clack

Haskell: WAIScala: SSGIElixir: Plug データベース

Python: DjangoPerl: CatalystRuby: Rails

Clojure: CompojureLisp: caveman2Hskell: Yesold

Scala: PlayElixir: Phoenix

DB ドライバ /ORMPython: -

Perl: -Ruby: ActiveRecordClojure: java.jdbc

Lisp: CLSQL/CL-DBIHskell: HDBCScala: SlickElixir: Ecto

Web アプリの構造Web サーバー

Controller

Router

Action

Model

Bussiness LogicDatabase

View

Template

DB driverORM

WAF I/F

Controller が Modelの情報を View にPush

MVC モデルPush 型

Phoenix の構造cowboy

Endpoint Model

Database

View

Template

Ecto

Plug

View

Router

Controller

Pipeline

Plug.Conn

Plug.Conn

リクエスト / コネクションを抽象化した構造体

複数の plug をパイプライン

plug:Plug.Conn を入力して Plug.Conn を出力

function(関数 )

endpoint

router/pipeline

controller

Why 軽量cowboy

Endpoint Model

Database

View

Template

Ecto

Plug

View

Router

Controller

Pipeline

コネクションを受ける (accept) 毎に、それを処理するErlang プロセス ( 軽量 ,OS のスレッド・プロセスではない ) が生成される

Phoenix というより、 cowboy/ranch が軽量Phoenix は cowboy/plug の薄いハンドラー + ジェネレータ

ここの処理が OS のスレッド、プロセスだとHeavy

Phoenix の構造cowboy

Endpoint Model

Database

View

Template

Ecto

Plug

View

Router

Controller

Pipeline

function(関数 )

View:データを html/json/etc に変換 /render するモジュールTemplate:マークアップ + 埋め込み

Elixir/ ループ /etc 、 eex

compile

データを入力してマークアップを出力

Why 高速cowboy

Endpoint Model

Database

View

Template

Ecto

Plug

View

Router

Controller

Pipeline

function(関数 )compile

Linked List( データ ) を使って、テンプレートをビルドする( 遅い・ボトルネックになる ) 文字列の連結は行わない

多くの WAF でテンプレートの文字列連結処理がボトルネックになる

Elixir の文字列はイミュータブルもっとも大きい文字列のコピーのみアプリ内に保持するのでキャッシュが適切に動作する

view/template

Phoenix の構造cowboy

Endpoint Model

Database

View

Template

Ecto

Plug

View

Router

Controller

Pipeline

Erlang VM 上で動作するモジュールという形体で提供

Why 安定cowboy

Endpoint Model

Database

View

Template

Ecto

Plug

View

Router

Controller

Pipeline

OS

ErlangVM

OTP

cowboy Ecto Phoenix plug

障害耐性

監視、再起動、 etc

並行プログラミングの為のフレームワーク / パターン

周辺ツール / 情報• モジュール / プロジェクト管理– mix

• ジェネレーター / タスク

周辺ツール / 情報• ディレクトリ構造– 指標 / レール– 基本は mix ベース– MVC 関連 : web– 静的ファイル :• Input: web/static• Output: priv• brunch.io( 等 ) を使ってアセットコンパイル(変更可能)

不足しているもの• 日本語の情報– 「プログラミング Elixir 」

不足しているもの• 日本語の情報– 「プログラミング Elixir 」 !

• モジュール、ライブラリ– http://www.modulecounts.com

不足しているもの

不足しているもの

モジュール / ライブラリ不足

モジュール / ライブラリ不足

まとめ• Web アプリケーションの構造を紹介しました• Phoenix の構造を紹介しました• Phoenix の特徴を紹介しました• 「プログラミング Elixir 」発売おめでとうございます• 「プログラミング Elixir 」を読んで、みんなでライブラリを書きましょう⭐️