我想知道如何解决聚合之间的事务一致性问题.我的第一印象是,无论何时需要聚合之间的事务一致性,您都错误地设计了聚合.但是,我仍然想问这个问题,以确保我没有遗漏任何东西.
想象一下,你卖牛奶.你有多头奶牛,每头奶牛每天产一定量的牛奶.您需要一项能够获得库存牛奶量的服务.除此之外,您还应该能够订购牛奶.根据此信息,您可以创建三个聚合Cow,Stock和Order.每当订购一定数量的牛奶时,其中一个业务规则是检查该金额是否有库存,如果没有,请立即告知用户.当两个用户同时发出请求并订购总量为150升的牛奶时,如何才能实现这一目标,而只有130升可用?我的第一个想法是你可以通过乐观/悲观锁定实现这一点,但在这种情况下,一个聚合依赖于另一个.是否有某种方法可以解决这个特定的问题,或者这只是糟糕的聚合设计?
我对Scala和Akka都很陌生,我正在试图弄清楚如何创建一个合适的域模型,它也是一个Actor.
让我们假设我们有一个简单的商业案例,您可以在其中开设一个新的银行账户.假设其中一条规则是您只能为每个姓氏创建一个银行帐户(不现实,但仅为了简单起见).我的第一种方法,没有应用任何业务规则,看起来像这样:
object Main {
def main(args: Array[String]): Unit = {
implicit val system = ActorSystem("accout")
implicit val materializer = ActorMaterializer()
implicit val executionContext = system.dispatcher
val account = system.actorOf(Props[Account])
account ! CreateAccount("Doe")
}
}
case class CreateAccount(lastName: String)
class Account extends Actor {
var lastName: String = null
override def receive: Receive = {
case createAccount: CreateAccount =>
this.lastName = lastName
}
}
Run Code Online (Sandbox Code Playgroud)
最终你会在某个地方保留这些数据.但是,在添加每个姓氏只能有一个银行帐户的规则时,需要对某些数据存储进行查询.假设我们将该逻辑放在存储库中,并且存储库最终返回一个Account,我们得到的问题Account不再是Actor,因为存储库将无法创建Actors.
这绝对是一个错误的实现,而不是如何使用Actors.我的问题是,有什么方法可以解决这些问题?我知道我对Akka的了解还不是很好,所以这可能是一个奇怪/愚蠢的问题.