写点什么

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

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

关注

评论

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

企业架构培训感悟

Man

企业架构 中台战略

LeetCode题解:104. 二叉树的最大深度,BFS,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

RocketMQ如何保证消息顺序性

废材姑娘

RocketMQ

Ansible 新手指南 - 如何批量管理 NGINX

东风微鸣

ansible

CSS02 - 选择器

Mr.Cactus

html/css

低代码和零代码快速开发崛起,迎来普通人开发软件的时代!

J2PaaS低代码平台

Java内存模型精讲

伯阳

Java 后端 多线程 多线程与高并发 Java内存模型

应用案例| 基于Volcano 的锐天大规模离线高性能计算生产实践

华为云原生团队

云计算 大数据 AI 云原生 批量计算

区块链技术如何真实有效的赋能智慧交通?

CECBC

区块链

区块链:能源行业出现破坏性创新的基础?

CECBC

区块链 能源

CSS01 - 引入方式

Mr.Cactus

html/css

面向行业智能,华为数据通信推动的2020之变

脑极体

大作业一

Geek_83908e

架构师一期

1499飞天茅台脚本使用过程中遇到的Python问题汇总索引目录【淘宝-天猫超市、京东】

谙忆

飞天茅台 茅台

微服务可能失败的11个原因

xcbeyond

微服务 方法论

uni-app实现实时消息SDK插件

anyRTC开发者

uni-app 音视频 WebRTC 跨平台 sdk

低成本构建音视频质量监控平台的最佳路径

华为云开发者联盟

数据中台 数据湖 云原生 RTC 华为云

腾讯大佬直言:只要掌握了这份“Redis实战笔记”就掌握了云计算的未来!

比伯

Java 编程 架构 面试 程序人生

CSS03 - 常用字体样式

Mr.Cactus

html/css

<译文>NGINX 实战手册 - 控制访问

东风微鸣

云算力系统APP开发|云算力软件开发

系统开发

在线自习室场景爆发,在线教育平台用户时间争夺战打响

ZEGO即构

区块链推动电力能源管理新一轮技术变革

CECBC

区块链

Spring 事务,你真的用对了吗(下篇)?

废材姑娘

Java Spring Framework

Kubernetes 疑难问题排查 - 10s 延迟

东风微鸣

Kubernetes

CSS04 - 常用外观属性

Mr.Cactus

html/css

在NGINX中根据用户真实IP限制访问

东风微鸣

详解 Flink 容器化环境下的 OOM Killed

Apache Flink

flink 流计算

别无分号只此一家,Python3接入支付宝身份认证接口( alipay.user.certify)体系(2021年最新攻略)

刘悦的技术博客

Python 支付宝 身份认证 刷脸 实名认证

一文教你学会Hive视图和索引

大数据老哥

大数据 hadoop hive

抄答案就是了,两套详细的设计方案,解决头疼的支付掉单问题

楼下小黑哥

支付系统 架构设计

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