2008-09-13 44 views
3

我有一个想法,我正在和一些同事一起思考。我们谁也不知道它目前是否存在。

基本前提是有一个系统可以100%正常运行,但可以动态变得更高效。

自检系统

下面是这种情况:

*于是,我们迅速敲定一个系统到 指定的一组接口,它具有 零优化,但我们 信心,它是100%稳定 虽然(半信半疑,但对于 起见,这种情况下,请一起演奏 )

*我们再简介 原来的班,并开始 程序替换为 瓶颈。

*原件和替换件同时启动,并且 同步。

*原稿可以运行到完成:如果替换品没有完成 ,系统将以否决 作为 原件的替代品。

* A替换必须总是返回相同的值作为原始,对于次 指定数量,和为值 特定范围内,之前,它是通过作为 原始替换 。

*如果在采用替换后发生异常,则系统 会自动尝试执行相同的操作 ,并将其替换为 it。


你见过在实践中,类似的概念?批判请...

下面是关于最初的问题后写入 发布的评论:

*系统演示了达尔文的方法来系统演化。

*原始文件和替换文件不会并列运行。

*竞争条件是多线程应用程序固有的问题,我承认他们。

回答

3

我认为这个想法是一个有趣的理论争论,但不是很实用,原因如下:

  1. 为了确保代码的新版本效果很好,你需要有高超的自动测试,这是一个很难实现的目标,也是许多公司未能发展的目标。在完成这些自动测试之后,您只能继续实施系统。
  2. 该系统的重点在于性能调整,即 - 将特定版本的代码替换为在性能上取代它的版本。对于今天的大多数应用来说,性能并不重要。意思是,大多数应用程序的整体性能是足够的 - 只要想一想,你很可能很少发现自己抱怨说“这个应用程序极其缓慢”,相反,你通常发现自己抱怨缺乏特定功能,稳定性问题,用户界面问题等。 。即使你抱怨缓慢,它通常是系统的整体缓慢,而不仅仅是特定的应用程序(当然也有例外)。
  3. 对于性能是一个大问题的应用程序或模块,改进它们的方法通常是识别瓶颈,使用某种基准测试编写新版本,并且首先独立于系统进行测试。对整个应用程序的新版本进行基准测试当然也可能是必要的,但总的来说,我认为这个过程只会发生非常少的次数(遵循20%-80%的规则)。在这些情况下“手动”执行此过程可能比所描述的系统更容易且更具成本效益。
  4. 当您添加功能,修复与性能无关的错误等时会发生什么?你没有从系统中获得任何好处。
  5. 联合运行这两个版本来比较它们的性能有比你想象的更多的问题 - 不仅你可能有竞争条件,但如果输入不是一个合适的基准,你可能会得到错误的结果(例如,如果你获得大量的小数据包,并且在90%的时间内输入是大数据包)。此外,这可能是不可能的(例如,如果实际代码更改数据,则不能同时运行它们)。

这听起来有用,实际上“必须”的唯一“环境”是一个“遗传”系统,它本身生成新版本的代码,但这是一个完全不同的故事,并且不是真正广泛适用的。

2

在运行时运行性能基准测试的系统将比不运行性能基准测试系统慢。如果目标是优化速度,那么为什么您不能独立进行基准测试,并且一旦证明速度更快,就会导入最快的程序?

而您的同时启动例程的想法可能会引入race conditions。另外,如果目标是确保100%的正常运行时间,则不会引入未经测试的例程,因为它们可能会生成不可捕获的例外。

也许你的想法作为基准测试而不是操作系统的优点是有用的吗?

2

我在实践中看到过类似的概念吗?不,但我会提出一个方法。

看来你的大部分目标似乎都可以通过某种超级资源控制系统来实现,这可以通过CruiseControl来实现。

CruiseControl可以运行单元测试以确保新版本的正确性。

您必须编写一个CruiseControl构建器pluggin,它可以针对一系列现有的基准测试执行系统的新版本,以确保新版本的改进。

如果CruiseControl构建循环通过,则新版本将被接受。这样的过程需要付出相当大的努力才能实施,但我认为这是可行的。单元测试和基准生成器必须非常光滑。

2

我认为像OSGi或Spring这样的控制容器反转可以完成大部分你正在谈论的内容。 (按名称动态加载)

你可以建立在他们的东西之上。然后执行你的代码

  1. 鸿沟的工作单位为离散模块/类(策略模式)
  2. 由唯一的名称标识每个模块和关联与它
  3. 能力当一个模块发出请求,被请求能力和随机使用具有该能力的模块之一。
  4. 保持性能统计信息(在执行前后获取系统记号并存储结果)
  5. 如果发生异常,则将该模块标记为不使用并记录异常。

如果模块通过消息传递完成工作,则可以存储消息,直到操作成功完成并在发生异常时使用另一个模块进行重做。

1

有关高可用性系统的设计思路,请查看Erlang。

0

我不认为代码本身会学会更好。但是,一些运行时参数可以很容易地调整到最佳值,但这只是常规编程,对吧?

关于即时更改,我已经分享了这个问题,并将在Lua或类似的动态语言之上进行构建。人们可以装载部件,如果它们被替换,则重新加载使用。在这方面也没有火箭科学。如果“旧代码”仍然在运行,那么它是完全正确的,因为与DLL不同的是,只有在读入文件时才需要该文件,而不是执行来自那里的代码。

有用性? Naa ...