2011-07-11 96 views
1

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

如果还有其他适用的设计模式,我很乐意听到他们的消息。

非常感谢。

+1

状态机是一种设计模式,而线程是实现的选择。你介意多澄清一下你的问题吗? – manku

+0

@Prashant设计模式不是实现选择吗?这正是我的问题,有没有更好的方法来维护应用程序配置过程的状态而不是使用额外的线程? – toc777

+0

我的意思是你可以在一个线程内部实现一个状态机。我猜你所问的是如果你应该使用基于事件的模型与线程,但这只是一个猜测。对不起,没有答案,但这个问题混淆了我。 – manku

回答

0

不知道如果我完全理解你的处境,在这里,但我会在它有一个刺呢。

几年前,我专门为ADSL激活请求在我的国家大型电信运营商提供服务的应用程序。我们收到来自上游应用程序的“激活请求”,我们的工作是运行一系列配置步骤,这些步骤必须在不同的设备上完成,使用不同的协议,可能会失败,可能不得不收回(以及当然,如果顾客退出,实施取消一个或多个步骤)。

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

我们已经为每种类型的步骤安排了批次,基本上选择相应操作类型的记录,并试图解决每个步骤(这允许我们根据协议对操作进行分组,例如snmp或telnet,还定义某种操作应该只在夜间或高峰时间以外运行

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

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

如果我必须在今天类似的问题的工作,我会倾向于一个状态机为基础的方法。

+0

你所描述的正是我需要做的。但是,我只使用一种协议TR-069。我收到激活请求或“通知”,然后我需要执行配置。当你说你会赞成基于状态机的方法;你在谈论你实现的数据库状态机还是没有专门将它的状态存储在数据库中的状态机? – toc777

+0

某种持久性(不论是“传统”数据库还是别的东西)肯定会很方便,你不觉得吗?事实上,我最初的设计是用原型设计开始的,只是使用平面文件来保存状态,当我们到达80k设备时,我们切换到了Oracle(我尝试了所有我知道的技巧,但在移动到数据库之前它已经变得冰冷地慢了。 ..)。无论如何,我会选择一个状态机,以便可以以最有效的方式处理各种操作,并且您可以轻松理解一步失败时出了什么问题。 –

+0

我将设备中的所有数据存储在数据库中,但我不存储“状态”特定数据。每次设备启动与服务器的新会话时,都会运行配置过程。如果您要将状态标头存储在数据库中,这意味着可能会出现不一致情况,例如某人ssh访问某个设备并且更改了某些内容,而服务器不知道该信息。你是如何确定状态标题对设备是否仍然有效的? – toc777

0

我@Prashant同意,试图比较线程的状态机模式是苹果和桔子。你目前如何配置线程的设备?跟踪设备状态的长期要求是什么,设备的状态会随着时间而改变?

换句话说,是结构的单触发的努力,其中它是convienent推下到一个单独的线程?如果您关心CPU的转换,特别是在相对较长的时间内,状态机模式是帮助您建模不同状态和可能转换的工具。

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

我会问两个问题:

1)你是如何模拟设备的状态?

2)线程是否向您购买任何特定的配置设备?

+0

首先,创建一个配置线程,该线程包含配置过程,其中包含许多不同的命令以在设备上执行。每个命令都会通过传递给正在等待消息传递回设备的servlet(设备启动连接)发送给设备。当设备收到命令时,它总是以命令响应回复。 servlet将此响应传递给配置线程,然后继续进行配置。我使用线程的唯一原因是保持配置过程的位置和状态。 – toc777

+0

在两个线程之间传递消息的整体以及具有多个线程的所有复杂性使得我想简化为单个线程。 – toc777