2010-06-21 93 views
0

我目前正在研究一个大型的实时OLAP应用程序。所有数据都保存在RAM(几千兆字节)中,常见任务包括对大量数据进行强力扫描(这很好)。处理结果通过Web服务(singleton/multithreaded)公开,并使用基于Silverlight的客户端呈现。Web服务的可扩展性框架/模式/良好实践?

问题是,各种客户需要不同的功能/算法,我不知道如何在服务器端提供可扩展性。对于客户端(Silverlight),我可以使用MEF/Prism,但我不确定在服务器上解决此问题的好方法是什么。

请注意,理想情况下,其他网络服务应直接访问(即不包含封送)到保存大数据模型的主要/当前服务的数据。

是否有:

一)框架/库

B)模式

三)良好pracitces

,这将有助于我模块化的应用程序,并期望选择模块和他们的部署相对容易?

+1

因此,您肯定希望在数据所在的服务器上运行不同的算法,并且调用者(通过Web服务)应该可以选择指定哪个算法使用?它是否像一个工作流程概念,他们可能在不同的序列中使用多种算法? – 2010-06-22 23:53:23

+0

是的。我们只是给了我们的客户一套方法,他们可以链接在一起并将其作为工作流程运行。问题是我们可以有多个模块,我们不太确定如何使它们在Web服务端可插入。 – 2010-06-24 09:55:43

回答

1

对我来说听起来像是需要依赖性反转:通过定义接口来隔离系统的逻辑部分(算法等),然后使用DI/IoC框架在运行时(或在应用程序启动等时)加载所需的实现。 。

我还没有使用过Ninject,但很多人都喜欢它,所以你可以尝试一下;还有Spring.Net

良好做法:

  • 确保您有清晰准确的记录,让你知道什么正在使用和时间。
  • 想想你是否想要一个'默认'的实现加载,如果所需的一个失败,或者你故意想失败,以便不会错误地返回错误的数据(例如使用不同的algorythm)。
  • 我发现使用属性来装饰注射模块真的很有用(特别是在一个基于网络的系统中,你没有直接访问),原因之一是你可以创建页面或控件列出所有运行时的已知/可用实现。

您也可以使用属性方法来构建一个用户界面,让用户选择他们想要的;我将它用于构建的开源Web应用程序框架:http://www.morphological.geek.nz/Morphfolia/Capabilities/AttributeDriven.aspx

+0

使用OLAP后端? DI可能是插件的一种合乎逻辑的方式,但我还没有看到具有良好性能特点的插件。 – jro 2010-06-22 19:45:21

+0

我没有做过很多DW工作,但我认为你需要知道你想问的问题,因为这会影响它的设计;在这种情况下,我不希望人们能够砍伐和改变algorythmns。 就性能而言,我不是DI方面的专家,但我会认为性能会是合理的 - 取决于您的方法。 就你而言,如果你追求特定的性能要求和灵活性,你可能会发现你的绿色“设计模式”牧场。 – 2010-06-22 23:51:11

+0

我们已经在服务器和客户端内部使用DI(Unity)。每个插件应该至少有两个程序集:一个用于服务器端,将被加载到主数据被保存的同一个appdomain中(以避免编组),另一个在客户端(Silverlight)上加载以公开附加功能给用户。这两个程序集都可以自动发现,并且如果存在于Plugins文件夹中,则可以加载它们。我们只是不知道如何在web服务中自动公开插件的服务器/客户端程序集的新功能。 – 2010-06-24 10:04:32