我正在玩一个Lift Simulation的设计。我有一个升降控制器和一系列升降机。电梯移动通过特定状态(例如STATIONARY,MOVING,DOORS_OPEN等) - 在MOVING状态下,Lift过程将只睡眠X ms。我目前正专注于电梯控制器过程与电梯过程集合之间的相互作用。
基本上,电梯控制器需要协调电梯,因此需要接收楼层请求并确定哪个电梯最适合为此请求提供服务,然后通知电梯。
我最初的想法是让每个电梯,在收到楼层请求后,自行移动各个州,然后在电梯控制器完成移动到特定楼层后通知电梯控制器。然而,通过这样的设计,电梯控制器可以查询电梯以查看其附近的楼层,做出该电梯的决定(即停在下一层),但是当它告诉电梯停止时,电梯可能有移动到那个楼层(由于说网络短暂而延迟)。
为了避免这些类型的问题(电梯控制器根据过时信息做出决定),我想到让电梯控制器负责将每个电梯移动到其状态。使用此模型,Lift Controller可以知道Lift所处的状态,告诉它进行转换,然后知道它将处于什么状态。因此,升降控制器始终具有关于升降机正在做什么的最新信息,并且其动作永远不会与各个升降机状态不同步。
人们对此类方法(wrt。线程,可伸缩性)有任何疑虑 - 是否有更好的方法对此进行建模?欢迎思考!
答案 0 :(得分:1)
您决定构建更复杂的升降控制器的关键词是,某些升降机可能已超过控制器所期望的状态。我认为这些“事件”的频率很低,对系统效率的负面影响也是如此。我会保持简单,并采取乐观的态度。期待升降机有良好的响应,但(如果真的有必要的话)偶尔会处理升降机没有按照预期做的那样的情况,和/或选择另一个升降机。
答案 1 :(得分:1)
即使您将所有控制权移至电梯控制器,同步问题仍会出现在其他地方。例如,如果控制器在电梯运输过程中发送消息,则控制器无法100%准确地知道接收到消息时电梯将处于何种楼层。
我认为最好的方法是坚持面向对象的设计最佳实践,并专注于关注点的逻辑分离。即。让电梯担心电梯相关问题,让控制器担心安排。
可以发出升降指令,以便升降机确认他们是否可以执行所要求的行动。在这种情况下,您需要设计调度算法,以便控制器不知道请求是否会在请求发生后的某个时刻执行 - 如果控制器只是进行路由/调度,这应该没问题。
当然,这一切都取决于您需要模拟的真实程度。