线程或状态机来管理应用程序状态?

时间:2011-07-11 10:26:15

标签: design-patterns state state-machine

我有一个自动配置设备的Web应用程序。使用HTTP以请求 - 响应方式实现通信。我目前正在使用一个线程来管理配置过程,但通常建议不在Web服务器中生成应用程序线程,所以我的问题是我应该使用基于事件的机制而不是线程吗?是事件框架用于维护应用程序状态还是我以错误的方式思考它们?

如果有更多适用的设计模式,我很乐意听到它们。

非常感谢。

2 个答案:

答案 0 :(得分:0)

我不确定我是否完全理解你的情况,但是无论如何我都会抓住它。

多年前,我为我国的一家大型电信运营商设计了一个ADSL激活请求服务应用程序。

我们收到了来自上游应用程序的“激活请求”,我们的工作是运行一系列配置步骤,这些步骤必须在不同的设备上完成,使用不同的协议,可能会失败,可能必须撤回(当然,如果客户退出,则实施取消一个或多个步骤。

我们选择了基于排序“状态机”的解决方案。每个请求都表示(在Oracle DB中)作为标题记录,其总结状态(从“新”到“已完成”,具有各种中间步骤)和一系列子记录,每个子记录代表所需的N个步骤之一完成配置。

我们为每种步骤安排了批处理,基本上选择了相应操作类型的记录,并尝试解析每一个(这允许我们根据协议对操作进行分组,例如snmp或telnet,以及定义某种操作应该只在夜间或高峰办公时间之外运行,等等。

我们还安排了一个“元批处理”,它会定期检查每个打开的“标题”记录,检查所有连接的步骤记录是否处于“已完成”状态,并相应地更新标题状态。

它缩放得足够好,并且允许我们以最小的麻烦模拟不同的步骤。全部或部分“回滚”也很容易 - 因为每一步我们都有一个具体的记录显示它是否已经完成。

如果今天我不得不处理类似的问题,我会赞成基于状态机的方法。

答案 1 :(得分:0)

我同意@Prashant试图将状态机模式与线程进行比较的是苹果和橙子。您目前如何使用该线程配置设备?跟踪设备状态的长期要求是什么?设备的状态会随时间而变化?

换句话说,这个配置是一次性的努力,在这个过程中,它是一个单独的线程推送到一个单独的线程?如果您关心转换,特别是在相对较长的时间内,对于CPU,状态机模式是一种工具,可以帮助您模拟不同的状态和可能的转换。

您可以通过多种方式实现状态机。例如,您可以使用事件触发转换,而某些静态变量跟踪当前状态。你可以在一个单独的线程中完成它,它有一个带有大的switch语句的大循环。

我会问两个问题:

1)您是如何为设备的状态建模的?

2)线程是否会为您提供配置设备的具体内容?