我有大量来自队列的消息。现在,我想动态改变应用程序正在读取和处理的消息的百分比(我们称之为流量%) 我改变流量的参数%是我的应用程序(队列的消费者)未能处理的消息数(错误)
如果我硬编码类似“y 分钟内出现 x 个错误(y 可以修复)”的内容,请将流量减少到 z% ”。之后,流量变低,错误也变低。需要一种算法,考虑当前流量百分比、错误数量并确定新流量百分比。流量百分比范围为 25% - 100%
最佳答案
您可以取一段时间内错误消息占消息总数的百分比的倒数,然后将该百分比适合您的流量范围。这样,如果您收到所有错误,您的流量百分比将为 25%,如果您没有收到错误,您的流量百分比将为 100%。
// traffic% 25%
minTraffic = 0.25
// traffic% 100%
maxTraffic = 1.00
// 25% -> 100% is a usable range of 75%
deltaTraffic = maxTraffic - minTraffic
// use Max(total, 1) to avoid divide by zero
error = (erroredMessagesPerTimeFrame / Math.max(totalMessagesPerTimeFrame, 1))
// inverse: error=1.00 becomes 0, error=0.00 becomes 1
invError = 1 - pcError
// linear clamp invError to [minTraffic, maxTraffic]
traffic = minTraffic + (deltaTraffic * invError)
这是使用线性拟合的最简单实现。
替代版本可能会使用曲线将您的“invError”值与“deltaTraffic”相匹配,这将根据曲线类型来权衡更接近(或更远)您的“minTraffic”和“maxTraffic”的较高和较低值你使用。
另一种选择是仅使用阶跃函数
If "invError" < 50% Then "minTraffic"
Else If "invError" < 75% Then "minTraffic" + (("maxTraffic" - "minTraffic") / 2)
Else "maxTraffic"
关于algorithm - 根据异常数量增加/减少应用程序负载的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68767222/