2012-06-13 50 views
0

我有2个程序A,B。如果A完成,我想B知道并开始运行,使用结果A的数据。“设计模式”可以应用于不同的程序吗?

A是一个.NET Web应用程序。我认为这并不是一直在记忆中,对吧?只有在浏览器请求时才存在,对吗?

之前,A和B是同一个程序的两个功能。但是由于商业原因,B程序有时会失败。即使B没有失败,这也是非常耗时的,并且使得客户等待太久并且不快乐。所以我把B分开了。顺利使用A的客户很高兴。 B在后台工作。

我目前的设计是:当A完成时,A将数据保存到数据库中。 B是一个windows服务。它每5分钟检查一次数据库,并在发现新作业时开始运行。 A,B彼此不认识。

老板问为什么闲置5分钟?我回答是因为这是实施我们一些业务的最简单方式。我没有太多设计。

于是我去阅读材料,发现Observer Pattern看起来像我想要的。经过几次阅读后,我认为Observer Pattern只能应用于同一程序中的类,而类和对象则存在于回忆中。

我不确定我的问题是:GOF Design Patterns可以应用于不同的程序吗?或者:RabbitMQ是如何实现这种实时处理类型的需求的?

我无法想象将5分钟的检查间隔设置为非常短的时间段。这对cpu来说是一个很大的负担。

编辑:我已经进入这个关于ObserverPublish/Subscribe的解释,我认为这对那些从搜索中看到这个线索是有用的。

http://addyosmani.com/resources/essentialjsdesignpatterns/book/#observerpatternjavascript

差异观察者之间和发布/订阅模式

Observer模式要求观察者(或物体)希望接收的话题通知必须订阅这个感兴趣的对象烧成事件(主题)。

但是,发布/订阅模式使用位于希望接收通知的对象(订阅者)和触发事件的对象(发布者)之间的主题/事件通道。这个事件系统允许代码定义特定于应用程序的事件,这些事件可以传递包含订户所需值的自定义参数这里的想法是避免用户和发布者之间的依赖关系。

这不同于观察者模式,因为它允许实现适当的事件处理程序的任何用户进行注册并领取话题通知由publisher.`

回答

1

广播你说得对,Observer模式是多为设计OO课程。一种可以在程序间工作的模式是发布 - 订阅模式,我认为这很适合你描述的内容。进程B预订由A触发的某些事件。这通常由服务体系结构调解;例如,进程A和B是Web应用程序(或WCF/MVC/Web API),还有第三个应用程序调解发布 - 订阅模式。所以当A完成时,它会向pub-sub服务发送一个事件;并且pub-sub服务发送一个通知给该事件的所有订阅者(在你的情况下,应用程序B)。

你可以自己实现这个模式;也有.NET框架,如NServiceBus实现它。

+0

我研究了NServiceBus。这似乎是我想要的。谢谢。但我也看到一些文章说'观察者模式'=='发布 - 订阅模式'。那是什么意思?如果我不想使用MSMQ,NServiceBus会有其他的选择吗? – hbrls

+0

我有另一台运行debian的服务器机器。我在linux/python中有类似的东西吗? – hbrls

+0

@hbrlovehaku是的,第二个想法,我想观察员和pub/sub是一样的东西......你将使用Web服务/ RPCs,但设计模式是相同的。至于Linux/Python,对不起,我不能帮助你,因为我只是不知道。 – McGarnagle

0

使用“拉模型”效率低下,浪费资源。 发布 - 订阅模式是更好的选择。 在这link你可以看到一个笔记,将引导你。 这些示例使用Java,但易于实现.net。

0

应用程序之间的观察者模式的可比较的机制是使用远程方法调用远程过程调用(因此它被称为在Java)。在.Net它应该在:Windows Communication Framework

应用程序A通过WCF向应用程序B发送(异步)消息。应用程序B也可能首先将自己注册为消息收件人,但如果A现在和之后崩溃,那么这不是最好的选择。

+0

我不认为WCF明白这一点。我没有使用WCF,但读了相关的东西。我认为WCF是进程之间的一些契约。我宁愿使用json并用文档定义合同。请告诉我,如果我误解了它。 – hbrls

+0

我不太了解.Net架构。我认为通过* WCF *可以在应用程序之间发送/接收异步消息。但是,无论你实际实现它,它的工作原理如下:*主题*(应用程序A)发送消息(通知)*观察者*(应用程序B)。然后观察者触发任何操作(例如查找数据库)。 – matcauthon

相关问题