Asp.net core 如何将Akka.Net流与AspNet core或giraffe集成

Asp.net core 如何将Akka.Net流与AspNet core或giraffe集成,asp.net-core,f#,akka.net,f#-giraffe,akka.net-streams,Asp.net Core,F#,Akka.net,F# Giraffe,Akka.net Streams,一般来说,当我使用Giraffe或ASP.NETCore时,我可以创建一个参与者系统,将其添加为服务,然后让请求处理程序选择任何参与者并询问/告知消息 使用Cluster.Sharding或普通的用户/actor我知道它将是整个系统中actor处理多条消息的单个实例 如何与Streams进行相同的通信?它们似乎不是路由器中的引用,也不是作为参与者路径的参与者系统:参与者引用、路径和地址 是否应该采取不同的做法 从IO部分复制,我可以具体化一个图形来处理每个请求,但通常我与“单例”通信,如域驱动设

一般来说,当我使用Giraffe或ASP.NETCore时,我可以创建一个参与者系统,将其添加为服务,然后让请求处理程序选择任何参与者并询问/告知消息

使用Cluster.Sharding或普通的
用户/actor
我知道它将是整个系统中actor处理多条消息的单个实例

如何与Streams进行相同的通信?它们似乎不是路由器中的引用,也不是作为参与者路径的参与者系统:参与者引用、路径和地址

是否应该采取不同的做法

从IO部分复制,我可以具体化一个图形来处理每个请求,但通常我与“单例”通信,如域驱动设计聚合根来处理域逻辑(这就是为什么分片模块),我不确定如何在请求处理程序中的新物化图中使用Singleton接收器,因为所有请求都必须只有一个接收器。

有许多方法可以与外部系统连接。使收件者更容易的方法是
Source.queue
(有点类似于System.Threading.Channels并早于它们)。您可以在初始化点具体化流,然后在Giraffe DI中注册队列端点-这样您就不必为每个请求支付相同流初始化的成本:

open Akka.Streams
open Akkling
open Akkling.Streams
open FSharp.Control.Tasks.Builders

let run () = task {
    use sys = System.create "sys" <| Configuration.defaultConfig()
    use mat = sys.Materializer()
    
    // construct a stream with async queue on both ends with buffer for 10 elements
    let sender, receiver =
        Source.queue OverflowStrategy.Backpressure 10
        |> Source.map (fun x -> x * x)
        |> Source.toMat (Sink.queue) Keep.both
        |> Graph.run mat
        
    // send data to a queue - quite often result could be just ignored
    match! sender.OfferAsync 2 with
    | :? QueueOfferResult.Enqueued -> () // successfull
    | :? QueueOfferResult.Dropped -> () // doesn't happen in OverflowStrategy.Backpressure 
    | :? QueueOfferResult.QueueClosed -> () // queue has been already closed
    | :? QueueOfferResult.Failure as f -> eprintfn "Unexpected failure: %O" f.Cause
    
    // try to receive data from the queue
    match! receiver.AsyncPull() with
    | Some data -> printfn "Received: %i" data
    | None -> printfn "Stream has been prematurelly closed"
        
    // asynchronously close the queue
    sender.Complete()
    do! sender.WatchCompletionAsync()
}
打开Akka.Streams
开放阿克林
打开阿克林河
打开FSharp.Control.Tasks.Builders
让run()=任务{
使用sys=System.create“sys”Source.map(乐趣x->x*x)
|>Source.toMat(Sink.queue)Keep.both
|>图1.run mat
//将数据发送到队列-结果常常会被忽略
匹配!sender.OfferAsync 2与
|:?QueueOfferResult.Enqueued->()//成功
|:?QueueOfferResult.Dropped->()//在OverflowStrategy.Backpressure中不会发生
|:?QueueOfferResult.QueueClosed->()//队列已关闭
|:?QueueOfferResult.失败为f->eprintfn“意外失败:%O”f.原因
//尝试从队列接收数据
将!receiver.AsyncPull()与匹配
|某些数据->打印fn“收到:%i”数据
|无->printfn“流已提前关闭”
//异步关闭队列
sender.Complete()
do!sender.WatchCompletionAsync()
}
使用外部系统有很多方法。使收件者更容易的方法是
Source.queue
(有点类似于System.Threading.Channels并早于它们)。您可以在初始化点具体化流,然后在Giraffe DI中注册队列端点-这样您就不必为每个请求支付相同流初始化的成本:

open Akka.Streams
open Akkling
open Akkling.Streams
open FSharp.Control.Tasks.Builders

let run () = task {
    use sys = System.create "sys" <| Configuration.defaultConfig()
    use mat = sys.Materializer()
    
    // construct a stream with async queue on both ends with buffer for 10 elements
    let sender, receiver =
        Source.queue OverflowStrategy.Backpressure 10
        |> Source.map (fun x -> x * x)
        |> Source.toMat (Sink.queue) Keep.both
        |> Graph.run mat
        
    // send data to a queue - quite often result could be just ignored
    match! sender.OfferAsync 2 with
    | :? QueueOfferResult.Enqueued -> () // successfull
    | :? QueueOfferResult.Dropped -> () // doesn't happen in OverflowStrategy.Backpressure 
    | :? QueueOfferResult.QueueClosed -> () // queue has been already closed
    | :? QueueOfferResult.Failure as f -> eprintfn "Unexpected failure: %O" f.Cause
    
    // try to receive data from the queue
    match! receiver.AsyncPull() with
    | Some data -> printfn "Received: %i" data
    | None -> printfn "Stream has been prematurelly closed"
        
    // asynchronously close the queue
    sender.Complete()
    do! sender.WatchCompletionAsync()
}
打开Akka.Streams
开放阿克林
打开阿克林河
打开FSharp.Control.Tasks.Builders
让run()=任务{
使用sys=System.create“sys”Source.map(乐趣x->x*x)
|>Source.toMat(Sink.queue)Keep.both
|>图1.run mat
//将数据发送到队列-结果常常会被忽略
匹配!sender.OfferAsync 2与
|:?QueueOfferResult.Enqueued->()//成功
|:?QueueOfferResult.Dropped->()//在OverflowStrategy.Backpressure中不会发生
|:?QueueOfferResult.QueueClosed->()//队列已关闭
|:?QueueOfferResult.失败为f->eprintfn“意外失败:%O”f.原因
//尝试从队列接收数据
将!receiver.AsyncPull()与匹配
|某些数据->打印fn“收到:%i”数据
|无->printfn“流已提前关闭”
//异步关闭队列
sender.Complete()
do!sender.WatchCompletionAsync()
}