使用Freya構建F Web伺服器

2021-09-16 18:08:50 字數 1728 閱讀 6376

freya是乙個專注於http原語和併發的f# web框架,其中並不提供模板等介面結構(construct)。在f# exchange 2017大會上,marcus griep介紹了freya的核心模型。並展示了多種用於效能和併發的機制,例如與hopac和kestrel的整合。

\u0026#xd;\n\u0026#xd;\n

freya支援多種託管配置。它可以直接使用dotnet run以自託管應用執行,也可以在kestrel上執行。freya同時支援.net framework和.net core。

\u0026#xd;\n\u0026#xd;\n

出於效能上的考慮,griep推薦在kestrel上執行freya,這樣能有效地利用kestrel的多種優化機制。根據他所給出的基準測試結果,在asp.net上執行經典的「hello world」應用,耗時6毫秒。對於在hopac上執行的freya,耗時13毫秒。而對於f# async上執行的freya,則需要26毫秒。

\u0026#xd;\n\u0026#xd;\n

上面的基準測試表明,相比於f# async,hopac可以顯著地提高效能。hopac使用了一種多執行緒的協同模式,而非搶占式(preemptive)。協同排程產生更少的上下文切換,進而可更加高效地使用cpu。但是種方式並不適於首席執行官時間執行的任務,因為這些貫穿始終的任務可能會餓死其它等待執行的任務。

\u0026#xd;\n\u0026#xd;\n

freya程式設計模型意在提供一種對http的安全抽象。freya計算表示式是對owin狀態的抽象。下面給出乙個基本例子,實現獲取查詢字串的引數,並返回乙個結果:

\u0026#xd;\n\u0026#xd;\n

\u0026#xd;\nlet name_ = route.atom_ \"name\"\u0026#xd;\nlet name =\u0026#xd;\n    freya \u0026#xd;\nlet sayhello =\u0026#xd;\n    freya \u0026#xd;\n
\u0026#xd;\n\u0026#xd;\n

freya machine是一種對決策樹的抽象。其中的乙個決策表示的是部分http規則,例如「是否存在cors頭部?」。乙個完整的決策樹中可能包含上百個決策,並且還可進一步擴充套件。machine同樣具有自動優化特性,可裁剪所有與給定配置無關的決策。

\u0026#xd;\n\u0026#xd;\n

freya machine還可以使用計算表示式定義。繼續上面給出的例子,下面**中的machine設定了與helloworld響應的條件。

\u0026#xd;\n\u0026#xd;\n

\u0026#xd;\nlet hellomachine =\u0026#xd;\n    freyamachine \u0026#xd;\n
\u0026#xd;\n\u0026#xd;\n

例子**的最後部分,繫結machine到route:

\u0026#xd;\n\u0026#xd;\n

\u0026#xd;\nlet router =\u0026#xd;\n    freyarouter \" machine }\u0026#xd;\n
\u0026#xd;\n\u0026#xd;\n
\u0026#xd;\n

本文使用stackedit編寫。

\u0026#xd;\n

\u0026#xd;\n\u0026#xd;\n

檢視英文原文:building an f# web server with freya

使用OData快速構建REST服務

odata是微軟支援的一種查詢標準,它的第四版使用了rest規範,看起來簡潔多了。它的最大的特點是可以在客戶端自行配製查詢條件,使用它構建rest服務時再也不用擔心查詢的擴充套件性問題了。如下是幾個簡單的示例 更多的示例可以參看官方的文件 由於它是基於rest的服務,使用的是通用的協議和序列化方式,...

使用apns構建push服務開發思路

先介紹下之前所做的push服務的設計模型 當初的設計比較簡單,將壓力全部放在了推送訊息處理執行緒上,執行緒不僅需要建立apns伺服器的通訊,也需要對廣播訊息進行轉換。對於單播訊息而言效能似乎還可以接受,然而對廣播訊息處理,執行緒的處理效能明顯降低。因為apns服務是不支援廣播訊息的,進行廣播必須要獲...

使用systemd來構建你的服務

systemd 服務是一種以 service 結尾的單元 unit 配置檔案,用於控制由systemd 控制或監視的程序。簡單說,用於後台以守護精靈 daemon 的形式執行程式。service檔案編寫簡單易用 可以自動維持程序存活 強大的功能,可以取代pm2 自動收集程序輸出的輸出 可以看到sys...