写点什么

使用 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:001508
用户头像

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

关注

评论

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

为什么说 $CHAPZ 是被严重低估的 AI 概念资产?

股市老人

StarRocks 易用性全面提升:数据导入可以如此简单

StarRocks

腾讯天穹 StarRocks 一站式湖仓融合平台架构揭秘

StarRocks

数据库 大数据 湖仓一体 湖仓融合

助力高效工作!Finder增强工具 TotalFinder for Mac中文版 含注册码

Rose

关于招聘这件事,技术面试官需要了解的几个点

芃篙君

招聘

WebStorm 2023.3.5 for Mac中文版 (WebStorm 2023永久激活秘钥最新)

Rose

AI Transcription for Mac(AI语音转录软件) 支持M1/M2

Rose

《保卫萝卜4》仅用一个月完成鸿蒙原生应用开发

最新动态

抓住大机遇,共筑新一代数智基础设施和解决方案竞争力

新消费日报

简单上云第一步!华为云耀云服务器L实例亮相华为云开年采购季

轶天下事

Kafka 痛点专题|AutoMQ 如何解决 Kafka 冷读副作用

AutoMQ

云计算 大数据 kafka 云原生 AutoMQ

深入理解 Java 多线程、Lambda 表达式及线程安全最佳实践

小万哥

Java 程序人生 编程语言 软件工程 后端开发

iNet Network Scanner:全面而深入的网络分析工具

Rose

GraphPad Prism 10激活授权秘钥:高效且易于使用的科学研究绘图分析软件

Rose

2024-03-16:用go语言,给你一个正整数数组 nums, 每一次操作中,你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半。 (注意,在后续操作中你可以对减半过的数继续执行操作)

福大大架构师每日一题

福大大架构师每日一题

印度股票交易软件GangGuHk

GangguHK

鸿蒙生态全场景新增长,鲸鸿动能为伙伴带来新机遇

最新动态

数据集成之环境变量 v0.7.2

LIEN

开源 数据集成 业务融合 API对接 mydata

揭秘 Bug 报告的终极技巧——如何写一个好的bug报告?

Chris Zhang

bug bug管理 bug定位 bug报告

我对一些技术架构设计的经验记录

大东(AIP内容运营专员)

Topaz Gigapixel AI 7.0.4完美激活版 及Topaz Gigapixel AI 7全新功能介绍

Rose

可用于GPT4.0续费,海淘使用教程

蓉蓉

GPT-4 ChatGPT4 Claude

电源常用通讯电路

芯动大师

芯片 通讯 电源

Topaz Photo AI 人工智能降噪 v2.4.1完美激活版 mac/win

Rose

PD19虚拟机破解版安装教程及pd19永久密钥

Rose

macbook防睡眠工具:Caffeinated for mac一键激活版

Rose

Caffeinated下载 Caffeinated破解版 防睡眠工具

Blu-ray Player Pro mac v3.3.22中文版 蓝光播放器 兼容m

Rose

Golang高效流控实践

俞凡

golang

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