运行 断言在单独的执行上下文中的安全性
Safety of running assertions in a separate execution context
不同的执行上下文之间的隔离程度如何?假设我们有两个执行上下文 ec1
和 ec2
都用于实现某些用户旅程的同一代码路径。比方说,如果 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
引起的饥饿,阻塞等问题不会影响主要商业逻辑?
每个执行上下文都有自己的线程池,所以,是的......有点。
从某种意义上说,它们是 "independent",如果一个线程用完了,另一个线程可能仍会继续运行,但是,它们确实使用相同的资源 (cpu),所以如果一个线程用完了, 另一个显然会受到影响。
他们也受到彼此副作用的影响。例如,您的代码编写方式 chargeUser
和 getNumberOfCharges
是并行发生的,并且没有说哪个先完成,所以,如果我猜对了语义, charges 可能最终随机地为 0 或 1,这取决于前一个 future 是否已经完成。
不同的执行上下文之间的隔离程度如何?假设我们有两个执行上下文 ec1
和 ec2
都用于实现某些用户旅程的同一代码路径。比方说,如果 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
引起的饥饿,阻塞等问题不会影响主要商业逻辑?
每个执行上下文都有自己的线程池,所以,是的......有点。 从某种意义上说,它们是 "independent",如果一个线程用完了,另一个线程可能仍会继续运行,但是,它们确实使用相同的资源 (cpu),所以如果一个线程用完了, 另一个显然会受到影响。
他们也受到彼此副作用的影响。例如,您的代码编写方式 chargeUser
和 getNumberOfCharges
是并行发生的,并且没有说哪个先完成,所以,如果我猜对了语义, charges 可能最终随机地为 0 或 1,这取决于前一个 future 是否已经完成。