Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Akka 阿克卡和背压_Akka - Fatal编程技术网

Akka 阿克卡和背压

Akka 阿克卡和背压,akka,Akka,我看到了Akka溪流背压的概念,但我的项目没有使用Akka溪流,我开发了另一个Akka背压指示器的概念,我想问一下它是否可行 我正计划使用邮箱队列的深度作为标准,以用作背压……其背后的逻辑是,如果Akka能够跟上我生成消息的速度,那么消息队列的深度应该是浅的。如果我发送了太多的消息,而Akka无法跟上,那么消息队列中将有越来越多的消息,我必须降低生成消息的速度 这与Apache Cassandra的“飞行中请求”基本相同 Session.State state = session.getStat

我看到了Akka溪流背压的概念,但我的项目没有使用Akka溪流,我开发了另一个Akka背压指示器的概念,我想问一下它是否可行

我正计划使用邮箱队列的深度作为标准,以用作背压……其背后的逻辑是,如果Akka能够跟上我生成消息的速度,那么消息队列的深度应该是浅的。如果我发送了太多的消息,而Akka无法跟上,那么消息队列中将有越来越多的消息,我必须降低生成消息的速度

这与Apache Cassandra的“飞行中请求”基本相同

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中,至少发送一条消息作为处理消息的一部分可能是最常见的事情),这意味着参与者将停止从其邮箱进行处理)

-是的,我对AtomicLong增量有一些保留,这将是我下一步进行负载测试和检查的内容。作为替代方案,我正在考虑将增量/减量放入concurrentLinkedQueue,并异步处理这些增量/减量,这将使其与入/出队列分离…-我计划发布此信息对于普罗米修斯/格拉法纳,我们可以首先观察应用程序的行为,然后配置应用程序属性,以确定在何处减速和在何处停止-我们正在使用来自卡夫卡的消息,因此我的计划是阻止卡夫卡消费者。老实说,如果您是从卡夫卡消费,我建议您只使用Alpakka-Kafka和
mapsync
,并使用n要求背压。是的,这是一种选择,但我没有影响力将项目引导到这个方向,我们还有其他事件来源,我可能不得不停止(或放慢速度),因此我正在尝试找到一种通用的方法。。。。