在 2025 收官前,看清 Data + AI 的真实走向,点击查看 BUILD 大会精华版 了解详情
写点什么

使用 Freya 构建 F# Web 服务器

  • 2017-05-18
  • 本文字数:992 字

    阅读完需:约 3 分钟

Freya 是一个专注于 HTTP 原语和并发的 F# Web 框架,其中并不提供模板等接口结构(construct)。在 F# eXchange 2017 大会上, Marcus Griep 介绍了 Freya 的核心模型。并展示了多种用于性能和并发的机制,例如与 Hopac 和 Kestrel 的集成。

Freya 支持多种托管配置。它可以直接使用 dotnet run 以自托管应用运行,也可以在 Kestrel 上运行。Freya 同时支持.NET Framework 和.NET Core。

出于性能上的考虑,Griep 推荐在 Kestrel 上运行 Freya,这样能有效地利用 Kestrel 的多种优化机制。根据他所给出的基准测试结果,在 ASP.NET 上运行经典的“Hello World”应用,耗时 6 毫秒。对于在 Hopac 上运行的 Freya,耗时 13 毫秒。而对于 F# Async 上运行的 Freya,则需要 26 毫秒。

上面的基准测试表明,相比于 F# Async, Hopac 可以显著地提高性能。Hopac 使用了一种多线程的协同模式,而非抢占式(preemptive)。协同调度产生更少的上下文切换,进而可更加高效地使用 CPU。但是种方式并不适于执行长时间运行的任务,因为这些贯穿始终的任务可能会饿死其它等待执行的任务。

Freya 编程模型意在提供一种对 HTTP 的安全抽象。Freya 计算表达式是对 OWIN 状态的抽象。下面给出一个基本例子,实现获取查询字符串的参数,并返回一个结果:

复制代码
let name_ = Route.atom_ "name"
let name =
freya {
// 获取查询字符串参数“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 machine 是一种对决策树的抽象。其中的一个决策表示的是部分 HTTP 规则,例如“是否存在 CORS 头部?”。一个完整的决策树中可能包含上百个决策,并且还可进一步扩展。machine 同样具有自动优化特性,可裁剪所有与给定配置无关的决策。

Freya machine 还可以使用计算表达式定义。继续上面给出的例子,下面代码中的 machine 设置了与 HelloWorld 响应的条件。

复制代码
let helloMachine =
freyaMachine {
methods [GET; HEAD; OPTIONS]
handleOk sayHello }

例子代码的最后部分,绑定 machine 到 route:

复制代码
let router =
freyaRouter {
resource "/hello{/name}" machine }

本文使用 StackEdit 编写。

查看英文原文: Building an F# Web Server with Freya

2017-05-18 19:001784
用户头像

发布了 227 篇内容, 共 86.9 次阅读, 收获喜欢 28 次。

关注

评论

发布
暂无评论
发现更多内容

我肝了3个月终于整理出了这份超全面的《Android面试题及解析》

android 程序员 移动开发

战战兢兢面试了一个35岁Android开发程序员,就这水平开发了8年?

android 程序员 移动开发

换个姿势,带着问题深入学习Handler,手撕吊打面试官,kotlin单例firbase

android 程序员 移动开发

插件化框架解读之四大组件调用原理-Activity(三)上篇

android 程序员 移动开发

我肝了3个月终于整理出了这份超全面的《Android面试题及解析》(1)

android 程序员 移动开发

我,Android开发,40岁熬到中层月薪15K,百度Android岗一面+二面内容

android 程序员 移动开发

手写一款Android-手绘风格组件----这是你从未见过的组件库

android 程序员 移动开发

手把手带你剖析ReentrantLock的底层实现AQS,android插件开发过时

android 程序员 移动开发

接地气的面试记录:记一次Android面试心得(1),详细的Android学习指南

android 程序员 移动开发

手把手讲解-一个复杂动效的自定义绘制,2021Android开发社招面试总结

android 程序员 移动开发

拿不到想要的offer,只缘身在CV中,关于一些面试小知识,Android开发人员不得不收集的代码

android 程序员 移动开发

揭秘:如何化身BAT面试offer收割机?,androidapp内存优化

android 程序员 移动开发

我来告诉你:零基础如何成为高级Android开发,入职字节跳动

android 程序员 移动开发

战战兢兢面试了一个35岁Android开发程序员,就这水平开发了8年?难怪没有一个公司愿意要你

android 程序员 移动开发

扒一扒:2020台湾Android-Kotlin-&-Java-面試題庫,竟如此--

android 程序员 移动开发

把Flutter扩展到微信小程序端的探索,安卓面试题库

android 程序员 移动开发

抖音四面被拒,再战头条终获offer!凭什么我可以做到,2021最新Android笔试题及答案

android 程序员 移动开发

我是如何做到在-5-分钟之内将应用大小减少-60%-的?,零基础学android编程

android 程序员 移动开发

拖不得了,Android11真的要来了,最全适配实践指南奉上

android 程序员 移动开发

我敢打赌!你从未见过如此简单的Dagger-导航---基于-Android-Studio-4-1

android 程序员 移动开发

换肤、全局字体替换、无需编写shape,Android程序员月薪20k的涨薪秘籍

android 程序员 移动开发

手把手教你打通车载蓝牙与手机app的音频信息传输&车载反向控制手机app

android 程序员 移动开发

掌握了这些Android高级工程师必备知识后,他拿到了 BAT Offer

android 程序员 移动开发

接地气的面试记录:记一次Android面试心得,retrofit教程

android 程序员 移动开发

插件化框架解读之Class文件与Dex文件的结构(一),android软件开发教程第二版电子版

android 程序员 移动开发

我的2020年终总结:疫情之下裸辞后的一些感悟和面试心得(上篇

android 程序员 移动开发

手动实现Android热修复,给2021的移动开发一些建议

android 程序员 移动开发

打造一个完整的Flutter-APP项目!,安卓高级开发面试题

android 程序员 移动开发

揭秘!大厂招聘内幕!如何才能进大厂,Android技术类校招面试题汇总

android 程序员 移动开发

搞Android开发为什么这么难?想哭了!,vue双向绑定

android 程序员 移动开发

支付宝 App 构建优化解析:Android 包大小极致压缩(1),阿里P8亲自讲解

android 程序员 移动开发

使用Freya构建F# Web服务器_.NET_Pierre-Luc Maheu_InfoQ精选文章