首页 > 生活 > 生活妙招

dsl是什么意思啊(dsl口是什么意思啊)

常驻编辑 生活妙招 2022-03-10 dsl
比如状态的嵌套(substate),状态的并行(parallel,fork,join)、子状态机等等P3j拜客生活常识网

开源状态机性能差

除此之外,还有一个我不能容忍的问题是,这些开源的状态机都是有状态的(Stateful)的,表面上来看,状态机理所当然是应该维持状态的。但是深入想一下,这种状态性并不是必须的,因为有状态,状态机的实例就不是线程安全的,而我们的应用服务器是分布式多线程的,所以在每一次状态机在接受请求的时候,都不得不重新build一个新的状态机实例。P3j拜客生活常识网

以电商交易为例,用户下单后,我们调用状态机实例将状态改为“Order Placed”。当用户支付订单的时候,可能是另一个线程,也可能是另一台服务器,所以我们必须重新创建一个状态机实例。因为原来的instance不是线程安全的。P3j拜客生活常识网

关于DSL和状态机引擎,看这篇就够了

P3j拜客生活常识网

这种new instance per request的做法,耗电不说。倘若状态机的构建很复杂,QPS又很高的话,肯定会遇到性能问题。P3j拜客生活常识网

鉴于复杂性和性能(公司电费)的考虑,我们决定自己实现一个状态机引擎,设计的目标很明确,有两个要求:P3j拜客生活常识网

  1. 简洁的仅支持状态流转的状态机,不需要支持嵌套、并行等高级玩法。
  2. 状态机本身需要是Stateless(无状态)的,这样一个Singleton Instance就能服务所有的状态流转请求了。

状态机实现

状态机领域模型

鉴于我们的诉求是实现一个仅支持简单状态流转的状态机,该状态机的核心概念如下图所示,主要包括:P3j拜客生活常识网

  1. State:状态
  2. Event:事件,状态由事件触发,引起变化
  3. Transition:流转,表示从一个状态到另一个状态
  4. External Transition:外部流转,两个不同状态之间的流转
  5. Internal Transition:内部流转,同一个状态之间的流转
  6. Condition:条件,表示是否允许到达某个状态
  7. Action:动作,到达某个状态之后,可以做什么
  8. StateMachine:状态机

整个状态机的核心语义模型(Semantic Model)也很简单,就是如下图所示:P3j拜客生活常识网

关于DSL和状态机引擎,看这篇就够了

P3j拜客生活常识网

Note:这里之所以叫Semantic Model,用的是《DSL》书里的术语,你也可以理解为是状态机的领域模型。Martin用Semantic这个词,是想说,外部的DSL script代表语法(Syntax),里面的model代表语义(Semantic),我觉得这个隐喻还是很恰当的。P3j拜客生活常识网

OK,状态机语义模型的核心代码如下所示:P3j拜客生活常识网

//StateMachinepublic class StateMachineImplP3j拜客生活常识网

相关阅读:

暂无相关信息
  • 网站地图 |
  • 声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不做权威认证,如若验证其真实性,请咨询相关权威专业人士。