AkkaSystem.scheduler() 和 AkkaSystem.dispatcher() 是否作为单线程工作?



我正在做一个 Akka 项目,遇到了这样的代码:

akkaScheduler.scheduleOnce(duration, () -> {
// Access a map
}), dispatcher)

此处akkaScheduler指定为akkaSystem.scheduler()dispatcher指定为akkaSystem.dispatcher()

因为有很多scheduleOnce,这些 Runnable 可能会同时触发,我想知道它们是否会从不同的线程同时"访问地图"?即我应该在这里使用线程安全映射(如 ConcurrentHashMap)吗?

这取决于特定的调度程序/执行程序/执行上下文,但一般来说,可以安全地假设多个任务可以在不同的线程上同时执行。 因此,如果调度任务,重要的是要确保它们不关心并发突变(例如,它们是幂等的),或者任何突变都涉及某些同步手段以防止并发突变。

使用线程安全结构就是这样一种方式,但是,更 Akka 惯用的方法是仅通过参与者公开结构(本身不需要是线程安全的),并让计划任务仅向该参与者发送消息。 虽然这样做可能比使用ConcurrentHashMap(或其他任何东西)更重,但它有几个显着的好处:

  • 它可以变得集群感知(例如,通过成为集群单例或使用分布式数据)和/或持久(通过 Akka 持久性)
  • 通过公开更丰富的域特定/域有意义的协议("更丰富"的意思是"丰富到没有任何东西(包括计划任务)需要发送多条消息"),你可以得到非常坚定的事务语义

最新更新