BT

FreyaでF#のウェブサーバを作る

| 作者: Pierre-Luc Maheu フォローする 3 人のフォロワー , 翻訳者 徳武 聡 フォローする 0 人のフォロワー 投稿日 2017年5月22日. 推定読書時間: 3 分 |

原文(投稿日:2017/05/15)へのリンク

FreyaはF#のウェブフレームワークであり、HTTPのプリミティブと並列性に特化している。テンプレート処理のようなインターフェースの構築機能は持っていない。F# eXchange 2017でMarcus Griep氏がFreyaを紹介した。氏はこのフレームワークの中核となるモデルについて説明した。また、性能と並列性で活用できる仕組みを紹介した。HopacとKestrelとの統合についてだ。

Freyaは異なるホストティング環境を構成する。自己ホストアプリケーションとしても動作する。dotnet runで起動するということだ。Kestrel上でも動く、.NET Frameworkと.NET Coreの両方をサポートする。

性能については、氏はKestrelの上で動かすことを推奨している。Kestrelの多くの最適化の仕組みの恩恵を受けるためだ。氏が示したベンチマークのよれば、"Hello World"がASP.NET Coreで6ミリ秒、Hopac上のFreyaで13ミリ秒、F# Async上のFreyaで26秒だった。

Griep氏のベンチマークが示している通り、HopacはF# Asyncと比べ大幅に性能が改善されている。Hopacはスレッドにプリエンプションではなく、協調モデルを使っている。協調スケジューリングによって、コンテキスト切り替えの発生が少なくなり、CPUをより効率的に利用できる。しかし、長期間実行されるジョブだとこのやり方はうまくいかない。完了まで走り続けるので、実行を待っている他のジョブが動かなくなる可能性がある。

FreyaのプログラミングモデルはHTTPのタイプセーフな抽象を提供しようとしている。計算式freyaOWINの状態の抽象だ。下のコードはクエリ文字列を取得する例だ。

let name_ = Route.atom_ "name"
let name =
    freya {
        // Get the query string parameter "name"
        let! name = Freya.Optic.get name_

        match name with
        | Some name -> return name
        | None -> return "World" }

let sayHello =
    freya {
        let! name = name

        return Represent.text (sprintf "Hello, %s!" name) }

Freyaの仕組みは決定木の抽象だ。決定はHTTPのルールの一部を表現している。例えば、"CORSヘッダがあるか"というようなルールだ。木の全体は数百の決定を含み、拡張もできる。自動的な最適化や設定とは無関係の決定を除外することも可能だ。

Freyaの仕組みは計算式でも定義できる。次の例は、Hello Worldを返す条件を設定している。

let helloMachine =
    freyaMachine {
        methods [GET; HEAD; OPTIONS]
        handleOk sayHello }

そして、これをルーティングとバインドする。

let router =
    freyaRouter {
        resource "/hello{/name}" machine }

StackEditで記述した。

 
 

Rate this Article

Adoption Stage
Style
 
 

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

あなたの意見をお聞かせください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

ディスカッション

InfoQにログインし新機能を利用する


パスワードを忘れた方はこちらへ

Follow

お気に入りのトピックや著者をフォローする

業界やサイト内で一番重要な見出しを閲覧する

Like

より多いシグナル、より少ないノイズ

お気に入りのトピックと著者を選択して自分のフィードを作る

Notifications

最新情報をすぐ手に入れるようにしよう

通知設定をして、お気に入りコンテンツを見逃さないようにしよう!

BT