【问题标题】:Safety of running assertions in a separate execution context在单独的执行上下文中运行断言的安全性
【发布时间】:2019-10-05 06:14:22
【问题描述】:

不同的执行上下文之间的隔离程度如何?假设我们有两个执行上下文 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 突变后断言数据库的预期状态。因为没有必要,我觉得将它添加到主要业务逻辑中感到不安,因为担心它会以某种方式破坏主要逻辑。如果我在与chargeUserF 使用的执行上下文不同的执行上下文中运行getNumberOfChargesF,我是否可以假设getNumberOfChargesF 引起的诸如饥饿、阻塞等问题不会影响主要业务逻辑?

【问题讨论】:

    标签: scala crash future assertion


    【解决方案1】:

    每个执行上下文都有自己的线程池,所以,是的……有点。 从某种意义上说,它们是“独立的”,如果一个线程用完,另一个可能仍会继续运行,但是,它们确实使用相同的资源(cpu),所以如果它被一个最大化,另一个显然是做作的。

    它们也会受到彼此的副作用的影响。例如,您的代码编写方式,chargeUsergetNumberOfCharges 是并行发生的,没有说哪一个会先完成,所以,如果我猜对了语义,那么收费的数量可能会结束0 或 1 相当随机,这取决于之前的未来是否已经完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 2011-03-13
      相关资源
      最近更新 更多