小编plu*_*nad的帖子

API速率限制器间歇性悬挂

我写了一个简单的(我认为...)速率限制器,以将事件驱动系统保持在我们的许可API命中限制之下.出于某种原因,有时会在发送400-500个请求后将其占用.

我最好的想法是我搞砸了等待函数,所以在某些情况下它永远不会返回,但我无法找到有缺陷的逻辑.另一个想法是我拙劣的异步/任务互操作导致问题.它总是先工作然后再工作.ApiRateLimiter在多个组件之间共享一个实例,以便在系统范围内实现命中限制.

type RequestWithReplyChannel = RequestWithKey * AsyncReplyChannel<ResponseWithKey>

type public ApiRateLimiter(httpClient: HttpClient, limitTimePeriod: TimeSpan, limitCount: int) =

let requestLimit = Math.Max(limitCount,1)

let agent = MailboxProcessor<RequestWithReplyChannel>.Start(fun inbox -> 

    let rec waitUntilUnderLimit (recentRequestsTimeSent: seq<DateTimeOffset>) = async{
        let cutoffTime = DateTimeOffset.UtcNow.Subtract limitTimePeriod
        let requestsWithinLimit = 
            recentRequestsTimeSent 
            |> Seq.filter(fun x -> x >= cutoffTime)
            |> Seq.toList

        if requestsWithinLimit.Length >= requestLimit then
            let! _ = Async.Sleep 100 //sleep for 100 milliseconds and check request limit again
            return! waitUntilUnderLimit requestsWithinLimit
        else
            return …
Run Code Online (Sandbox Code Playgroud)

f# mailboxprocessor

6
推荐指数
1
解决办法
73
查看次数

标签 统计

f# ×1

mailboxprocessor ×1