最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

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

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

关注

评论

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

Intellij IDEA2020.x如何安装Lombok插件

龙眼果

开发者工具

搜商:高效的使用搜索引擎

石云升

高效搜索 搜索技巧 搜商

Serverless: 2020年函数计算的冷启动怎么样了

刘宇

多多益善的MacOS文件管理方案

陈东泽 EuryChen

macos Mac apple 提升效率 文件管理

近期工作的几点感想

Leiy

app退出登录

从ClickHouse的名字由来讲起

nauu

数据库 大数据 分布式 OLAP Clickhouse

spring注入bean的几种策略模式

王德发

Java Spring Boot 测试驱动开发实战营

工程师、程序员和产品经理

王泰

程序员 产品经理 IT 软件工程师 工程师思维

提升编程效率:重构

Page

高效工作 敏捷开发 重构 高效

Kafka零数据丢失的配置方案

奈学教育

kafka kafka配置 kafka数据

为什么我喜欢的大V拉黑我?

lmymirror

经历 后真相时代 日常思考

太赞了,VSCode 上也能画流程图了!

GitHubDaily

visual-studio GitHub 程序员 vscode 开发者工具

常见的主从报错集锦

一个有志气的DB

MySQL 主从配置 主从同步

MySQL索引知识介绍

Simon

MySQL 索引结构

MySQL备份基础

一个有志气的DB

MySQL 数据

【Howe学爬虫】全国统计用区划代码爬取

Howe

Java 爬虫

Java实现Base64

Java

敏捷团队成员的工作量指标真的那么重要吗?

金生水起

敏捷开发 Scrum精髓 敏捷精髓 Agile

KK日知录20200515

kimmking

学习型组织的修炼之道

Yanel 说敏捷产品

团队管理 项目管理 敏捷 团队协作 组织转型

看完这篇操作系统,和面试官扯皮就没问题了

cxuan

操作系统 计算机基础

数据分析的利器-clickhouse概述

流沙

数据库 Clickhouse

揭秘!开源软件背后的神秘组织

Apache Flink

大数据 flink 流计算 实时计算

2020 敏捷产品基本盘

Yanel 说敏捷产品

产品 敏捷 产品设计 产品推荐

BVR 才是变革的核心

Yanel 说敏捷产品

团队管理 项目管理 敏捷 敏捷开发 敏捷精髓

用"结构性张力"构建自驱力

Yanel 说敏捷产品

团队管理 敏捷 团队协作 项目

【大咖说问大咖】关于开源的那些事 —— PingCAP CTO 黄东旭 Q&A 交流帖

InfoQ写作社区官方

开源 写作平台 大咖说 技术交流 热门活动

原创 | 使用JUnit、AssertJ和Mockito编写单元测试和实践TDD (七)CORRECT边界条件

编程道与术

Java 编程 软件测试 TDD 单元测试

何时开始重构?

Page

敏捷开发 重构

真的!只需 “六步” 实现图像特定物体识别!!!

周果

Python OpenCV 计算机视觉 图像识别 物体检测

Android | Tangram动态页面之路(一)需求背景

哈利迪

android

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