【问题标题】:Can the "Design Pattern" be applied to different programs?“设计模式”可以应用于不同的程序吗?
【发布时间】:2012-06-13 03:42:49
【问题描述】:

我有 2 个程序 A、B。如果 A 完成,我希望 B 知道并开始运行,使用来自 A 结果的数据。

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

之前,A 和 B 是同一个程序的 2 个函数。但是 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

观察者模式和发布/订阅模式的区别

观察者模式要求希望接收主题通知的观察者(或对象)必须将此兴趣订阅到触发事件的对象(主题)。

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

这与观察者模式不同,因为它允许任何订阅者实现适当的事件处理程序来注册和接收发布者广播的主题通知。`

【问题讨论】:

    标签: design-patterns observer-pattern publish-subscribe


    【解决方案1】:

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

    你可以自己实现这个模式;还有一些 .NET 框架,例如 NServiceBus 实现了它。

    【讨论】:

    • 我研究了 NServiceBus。这似乎是我想要的。谢谢。但我也看到一些文章说“观察者模式”==“发布-订阅模式”。那是什么意思?而如果我不想使用 MSMQ,NServiceBus 是否还有其他选择?
    • 我有另一台服务器机器运行 debian。我在 linux/python 中有类似的东西吗?
    • @hbrlovehaku 是的,再想一想,我想观察者和 pub/sub 是一回事……您将使用 Web 服务/RPC,但设计模式是相同的。至于 Linux/Python,抱歉,我不能帮你,因为我不知道。
    • 好的,第一个问题来了。我读到的关于“观察者”的内容使用 2 个类实现逻辑:主题、观察者。但是NServiceBus 建议由第三方来管理主题和观察者之间的消息。怎么还是Observer Pattern
    • 这是一个扩展的观察者模式。称为调解员。
    【解决方案2】:

    使用“拉动模式”效率低下,浪费资源。 发布订阅模型是更好的选择。 在这个link 中,您可以看到一条指导您的说明。 示例是用 Java 编写的,但 .net 很容易实现。

    【讨论】:

      【解决方案3】:

      应用程序之间观察者模式的一种类似机制是使用远程方法调用远程过程调用(所以它在java中被调用)。在 .Net 中,它应该位于:Windows Communication Framework

      应用程序 A 通过 WCF 向应用程序 B 发送(异步)消息。应用程序 B 也有可能首先将自己注册为消息收件人,但万一 A 不时崩溃,这不是最好的选择。

      【讨论】:

      • 我不认为 WCF 明白这一点。我没有使用过 WCF,但读过一些相关的东西。我认为 WCF 是流程之间的某种契约。我宁愿使用 json 并用文档定义合同。如果我误解了,请告诉我。
      • 我不太了解 .Net 架构。我认为通过 WCF 可以在应用程序之间发送/接收异步消息。但是无论您实际实现它,它的工作方式如下:subject(应用程序 A)向(通知)observers(应用程序 B)发送消息。然后观察者触发任何动作(例如查找数据库)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多