gpt4 book ai didi

f# - 负载平衡请求/农场请求(并发和状态 - 尴尬)

转载 作者:行者123 更新时间:2023-12-04 08:24:06 27 4
gpt4 key购买 nike

我想为进入 C# web api 应用程序的一些请求编写一个简单的负载均衡器。
(我只使用 C# 的东西作为创建 Web 服务器的便捷方式)。
解决这个问题的最佳方法是什么? (我还没有真正在 F# 中做过任何邮箱的事情)
如果我要使用邮箱/代理……那么我将请求作为消息发布,很好……但是我如何将响应返回给 web api 请求处理程序?
不都是火了就忘了吗? (具有讽刺意味的是,我做了一些 erlang)
(我可以有一个简单的可变全局索引,它是下一个处理请求的工作服务......但这是我做得很好的机会)。

实际上,我认为我可能在 erlang 中做了与此非常相似的事情,并且我认为发起方会传递一个返回地址来将消息发送回(并且返回地址是发起方的进程 ID),然后它会等待响应,当它得到它(或超时)时,它就会做它需要做的任何事情。
这是 F# 中的明智机制吗?
- - - - - - - - - - - - 编辑 - - - - - - - - - - - -
所以,https://www.codemag.com/Article/1707051/Writing-Concurrent-Programs-Using-F
描述了一个类似的设置,似乎我需要使用,实际上这是有效的,
但它与我的 Erlang 建议完全不同。
这里每个客户端发送一个 PostAndReply,然后在回复之前等待响应......这似乎没有必要,理想情况下,回复会一直回到原点,中间人会在两者之间触发并忘记。

open System

type Message = string * AsyncReplyChannel<string>
[<EntryPoint>]
let main argv =
let myFirstAgent =
MailboxProcessor<Message>.Start(fun inbox ->
let rec loop () =
async {
let! (message, replyChannel) = inbox.Receive()
replyChannel.Reply (String.Format ("1. Received message: {0}", message))
do! loop ()
}
loop ())

let mySecondAgent =
MailboxProcessor<Message>.Start(fun inbox ->
let rec loop () =
async {
let! (message, replyChannel) = inbox.Receive()
replyChannel.Reply (String.Format ("2. Received message: {0}", message))
do! loop ()
}
loop ())

let agents = [ myFirstAgent; mySecondAgent ]

let replyAgent =
MailboxProcessor<Message>.Start(fun inbox ->
let rec loop index =
async {
let! (message, replyChannel) = inbox.Receive()
let reply = (agents.Item index).PostAndReply(fun rc -> message,rc)
replyChannel.Reply reply
do! loop ((index + 1) % 2)
}
loop 0)

let foo = replyAgent.PostAndReply(fun rc -> "Hello", rc)
let foo1 = replyAgent.PostAndReply(fun rc -> "Hello", rc)
let foo2 = replyAgent.PostAndReply(fun rc -> "Hello", rc)
let foo3 = replyAgent.PostAndReply(fun rc -> "Hello", rc)
let foo4 = replyAgent.PostAndReply(fun rc -> "Hello", rc)

//myFirstAgent.Post "Hello!"

printfn "Hello World from F#!"
System.Console.ReadLine() |> ignore
0 // return an integer exit code

最佳答案

哦,我需要做的实际上是理解示例,而不仅仅是编写代码!
如果回复代理只是转发它......那么我们就完成了。

let replyAgent =
MailboxProcessor<Message>.Start(fun inbox ->
let rec loop index =
async {
let! (message, replyChannel) = inbox.Receive()
let reply = (agents.Item index).Post(message, replyChannel)
do! loop ((index + 1) % 2)
}
loop 0)

关于f# - 负载平衡请求/农场请求(并发和状态 - 尴尬),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65356275/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com