gpt4 book ai didi

scala - Actor 之间的 Akka 断路器共享

转载 作者:行者123 更新时间:2023-12-04 01:02:26 26 4
gpt4 key购买 nike

我有一个共享的外部资源(比如一个文件存储),一个 Actor 池正在使用它。每次向文件存储发出新请求时,都会创建一个新参与者,以使用对传入的外部系统的引用来填充请求。

我为每个参与者创建断路器的当前方法违背了目的,因为为每个“请求”创建了一个新参与者,该“请求”在此外部资源上执行一系列操作。

不理想 - CB 实例太多;

class MySharedResourceActor(externalResourceRef: ExtSystem) extends Actor with ActorLogging {
val breaker = new CircuitBreaker(context.system.scheduler,
maxFailures = 5,
callTimeout = 10.seconds,
resetTimeout = 1.minute).onOpen(notifyMeOnOpen())

def receive = {
case SomeExternalOp =>
breaker.withSyncCircuitBreaker(dangerousCallToExternalSystem()) pipeTo sender()
}
}

更好的方法 - 通过 CB 引用;
class MySharedResourceActor(externalResourceRef: ExtSystem, val breaker: CircuitBreaker) extends Actor with ActorLogging {
def receive = {
case SomeExternalOp =>
breaker.withSyncCircuitBreaker(dangerousCallToExternalSystem()) pipeTo sender()
}
}

传递来自父actor的断路器引用是否安全,它也维护对外部系统的引用并在路由器池中的多个actor之间共享此断路器,动态创建或以其他方式?

最佳答案

是的,遵循这种方法是安全的。我们在对同一主机进行 http 调用的相关参与者(汇集或其他)之间共享断路器。如果你不这样做,让每个实例都有自己的断路器,即使它们是长期存在的实例,每个实例都需要在断路器打开之前分别达到失败阈值,我怀疑这是你想要的行为。通过共享,它允许多个参与者将统计信息(失败、成功)贡献给断路器,以便断路器代表已进入资源的所有调用。

在查看 Akka 的代码时,他们在断路器内部使用原子来表示状态并处理状态转换,因此在多个参与者中使用它们应该是安全的。

关于scala - Actor 之间的 Akka 断路器共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24289979/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com