Akka 阿克卡和背压
我看到了Akka溪流背压的概念,但我的项目没有使用Akka溪流,我开发了另一个Akka背压指示器的概念,我想问一下它是否可行 我正计划使用邮箱队列的深度作为标准,以用作背压……其背后的逻辑是,如果Akka能够跟上我生成消息的速度,那么消息队列的深度应该是浅的。如果我发送了太多的消息,而Akka无法跟上,那么消息队列中将有越来越多的消息,我必须降低生成消息的速度 这与Apache Cassandra的“飞行中请求”基本相同Akka 阿克卡和背压,akka,Akka,我看到了Akka溪流背压的概念,但我的项目没有使用Akka溪流,我开发了另一个Akka背压指示器的概念,我想问一下它是否可行 我正计划使用邮箱队列的深度作为标准,以用作背压……其背后的逻辑是,如果Akka能够跟上我生成消息的速度,那么消息队列的深度应该是浅的。如果我发送了太多的消息,而Akka无法跟上,那么消息队列中将有越来越多的消息,我必须降低生成消息的速度 这与Apache Cassandra的“飞行中请求”基本相同 Session.State state = session.getStat
Session.State state = session.getState();
for (Host host : state.getConnectedHosts()) {
HostDistance distance = loadBalancingPolicy.distance(host);
int connections = state.getOpenConnections(host);
int inFlightQueries = state.getInFlightQueries(host);
....
}
所以我从Akka使用的Akka reference.conf中发现
default-mailbox {
mailbox-type = "akka.dispatch.SingleConsumerOnlyUnboundedMailbox"
}
class NodeMessageQueue extends AbstractNodeQueue[Envelope] with MessageQueue with
UnboundedMessageQueueSemantics {
final def enqueue(receiver: ActorRef, handle: Envelope): Unit = add(handle)
final def dequeue(): Envelope = poll()
因此,我编写了一个AspectJ Aspect来截获enqueue()和dequeue(),并递增和递减一个全局原子长度,我可以使用它来跟踪Akka Actor邮箱中等待的邮件总数
所以我的逻辑是,如果Akka能够跟上我发送的消息数量,那么这个数字应该低于某个预先配置的值
假设我有10万名参与者,他们在邮箱消息队列中有1000条消息,一切正常,但如果我看到100万条消息在消息队列中等待,这是一个减慢消息生成速度的信号…如果队列中有10000条消息,则是一个停止消息生成的明确信号
我建立了一个原型,它按照我的预期工作……但在我继续之前,我想在这里问一下,你看到这个概念有什么真正的缺陷吗
Thx的答案…它可能是可行的,但:
- 在高容量情况下,每个消息发送上的单点争用(即使是无锁的)可能会对性能产生重大影响
- 您希望降低速度的特定阈值将在很大程度上取决于应用程序,并且可能会随着您更改应用程序而改变
- 根据系统的具体情况(以及“停止消息生成”的确切含义),可能会出现死锁(即,如果您要求不丢弃传入消息,而处理消息需要发送另一条消息)(在Akka中,至少发送一条消息作为处理消息的一部分可能是最常见的事情),这意味着参与者将停止从其邮箱进行处理)
mapsync
,并使用n要求背压。是的,这是一种选择,但我没有影响力将项目引导到这个方向,我们还有其他事件来源,我可能不得不停止(或放慢速度),因此我正在尝试找到一种通用的方法。。。。