algorithm - 根据异常数量增加/减少应用程序负载的算法

标签 algorithm distributed-system

我有大量来自队列的消息。现在,我想动态改变应用程序正在读取和处理的消息的百分比(我们称之为流量%) 我改变流量的参数%是我的应用程序(队列的消费者)未能处理的消息数(错误)

如果我硬编码类似“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/

相关文章:

kubernetes - 如何在分布式系统中维护套接字或通信 channel

sockets - 分布式系统中客户端之间的websocket通信

c - 调用函数后指向 B 树根节点的指针开始指向子节点(应该继续指向根节点)

java - 如何检查表示路径的字符串是否由 Java 中的 3 个子目录组成?

sql - 在表中查找重复项

algorithm - push-relabel 最大流量算法是如何工作的?

java - 考虑速度的特定路径算法

amazon-web-services - 您如何在分布式系统中编程强大的写后读一致性?

perl - 分布式测试框架

spring-boot - 如何确保只有一个消费者实际消费已发布的消息?