在单独的执行上下文中运行断言的安全性

时间:2019-05-17 22:51:02

标签: scala crash future assertion

不同的执行上下文之间如何隔离?假设我们有两个执行上下文ec1ec2都在同一代码路径上使用,它们实现了一些用户旅程。如果说ec2中开始发生饥饿和崩溃,ec1会不会受到影响吗?

例如,考虑以下情形,我们想通过在Future内运行一个断言来确保仅向用户收费一次

chargeUserF andThen { case _ => 
  getNumberOfChargesF map { num => assert(num == 0) }
    .andThen { case Failure(e) => logger.error("User charged more than once! Fix ASAP!", e)  } 
}

这里getNumberOfChargesF并不是满足用户请求所必需的,这只是侧面考虑,我们在数据库chargeUserF突变后声明数据库的预期状态。因为没有必要,我担心将其添加到主要业务逻辑中会感到不安,因为担心它会以某种方式破坏主要逻辑。如果我在getNumberOfChargesF使用的执行上下文之外的其他执行上下文上运行chargeUserF,是否可以假设getNumberOfChargesF引起的饥饿,阻塞等问题不会影响主要业务逻辑?

1 个答案:

答案 0 :(得分:2)

每个执行上下文都有其自己的线程池,所以,有点。 从某种意义上说,它们是“独立的”,即如果一个线程用完了,另一个线程可能仍会继续运行,但是,它们确实使用了相同的资源(cpu),因此,如果一个线程用尽了资源,那么另一个显然会是受到影响。

它们也受到彼此副作用的影响。例如,您的代码编写方式chargeUsergetNumberOfCharges是并行发生的,并且没有人说哪个会先完成,因此,如果我猜对了语义的话,费用可能最终会随机地变为0或1,具体取决于先前的将来是否已经完成。