2

我正在处理一个有着几十年历史的复杂系统。它曾经是一个客户端/服务器调度应用程序,但它变得更加复杂。最初,每个客户都有自己的实例,在自己的服务器上运行。现在,我们有一些客户仍在这种模式下运行,但我们也有一些客户在软件即服务模式下运行——所有应用程序都在我们的服务器上运行。我们还添加了 Web 界面,我们有数百名客户仅通过 Web 访问他们的系统。

就目前而言,系统的每个安装包括:

  • 一个数据库:其中几乎每条记录都有一个以“customerid”开头的主键,因此多个客户可以针对同一个数据库运行。
  • 安装目录:SAN 上的一个目录,在其子目录中存在可执行文件、日志文件、配置文件、基于磁盘的队列以及系统中涉及的几乎所有非网站的其他内容
  • 后台应用程序:一堆应用程序,位于安装目录的子目录下,但可能运行在一个或多个应用程序服务器上,负责与各种异地系统、移动用户等进行通信。它们可以配置作为 Windows 服务运行,或从命令行运行。
  • 客户端应用程序:另一组应用程序,位于同一子目录中,但运行在任意数量的用户机器上,管理者和调度员可以与系统交互,将工作分派给各种移动用户,运行完成工作的报告等.
  • Web 应用程序:几个网站/应用程序/服务,允许调度用户执行某些调度功能,并允许移动用户从任何 Web 浏览器完成分配的工作。通常,网站和系统安装之间存在多对一的关系。我们将在多个服务器平台上拥有多个站点,这些站点配置为针对系统的任何特定安装运行,并使用负载平衡器在它们之间分配传入用户。

我们有十几个不同的安装,每个安装从一个到几百个客户。(每个客户从少数到几百个用户。)

较旧的后台应用程序是用非托管 C++ 编写的,而较新的后台应用程序是用 C# 编写的。客户端应用程序是用 VB6 编写的,针对用非托管 C++ 编写的 COM 对象运行。网站和服务是用 C# 编写的 ASP.NET 和 ASP.NET/MVC。

显然,多年来,它变得相当复杂,有很多部分和很多相互关系。它仍然有效,并且运作良好,让我感到惊讶。让我觉得我们做得还不错,20 年前我们第一次设计的时候。但...

在这一点上,我们最大的问题是安装更新和升级所需的工作量。系统的大部分是解耦的,所以我们可以毫不费力地改变一个通信程序,或者修复一个网页等等。但是对数据库模式的任何更改都需要在系统范围内进行更改。这需要大量时间,会影响许多客户,并涉及重大风险。因此,修复的实施会延迟,这使得我们进行升级时的风险更高,从而导致更多的延迟,并且通常会损害我们的响应能力。

因此,我正在寻求有关我们可能进行的架构更改的建议,这将使升级的风险和成本更低。

在我的理想世界中,我们永远不会升级正在运行的安装,我们会并行安装升级,测试它,一旦我们确信它可以正常工作,我们会将客户从旧系统转移到新系统,一次是第一次,然后随着我们越来越有信心,然后批量进行。如果事情不起作用,我们可以将客户回滚到旧系统。但我看到了一些问题:

  1. 在用户登录之前,我们不知道用户属于哪个客户。
  2. 将用户从一个系统移动到另一个系统涉及复制数十万条数据库记录,并在此过程中应用架构更改。
  3. 将自定义从一个系统移动到另一个系统涉及复制谁知道我们基于磁盘的队列中有多少文件,以及其他各种支持文件。
  4. 我认为回滚是必要的。但这会更加困难。

我们所拥有的正在工作,但效果不佳。我希望得到一些建议。

确切地说,我不是在寻找答案,但更多的是我在寻找关于在哪里寻找的想法。有人对我在哪里可以找到有关如何处理这种规模的结构化系统的信息有任何想法吗?

4

2 回答 2

0

您提到子系统是隔离的,所以我想更换/升级组件不是很成问题。主要的痛点似乎是数据库的变化。之所以如此,是因为您在 SAAS 环境中使用了共享数据库模型。对于 SAAS 应用程序,推荐的 DB 模型按照高度灵活到最不灵活的顺序是:

为每个客户单独的数据库,共享数据库但不同的架构,共享数据库共享架构。

这个问题是由于第三个模型。它最便宜,但刚性很高。

为了解决这个问题,可以为每个客户提供不同的数据库或模式实例。这可以一次为少数客户完成。例如,对于客户 A,根据选择创建不同的 db/schema。导出该客户 ID 的所有记录并填充到新模式中。开始将新客户路由到新数据库,您仍然可以返回旧数据库。

一般来说,对于 Web 服务,最好是

使用路由器调用真正的网络服务。

我想,它可能已经到位。因此,客户实际上调用了路由器服务,该服务将为客户路由到适当的 Web 服务。它就像更改路由器上的配置以回退或路由到不同版本或服务安装一样简单。上述策略可以以某种方式应用于不同的子系统。

于 2013-04-27T23:35:47.697 回答
0

杰夫,我注意到你在明尼阿波利斯,我也是。我会根据你的描述猜测首字母 DR 或 BI,但它只是一个赃物。凭借为财富 50 强公司管理 75 多个应用程序组合的经验,我知道随着需求的不断发展和技术超越最初对被认为可能的理解,事情在 10/20 年内变得多么疯狂。

对于您的多租户 SaaS 架构,我不确定您是否会在这里得到任何灵丹妙药的答案,但根据我在一家初创公司的经验,我们正在构建一个多租户 SaaS Web 应用程序平台(处理 60 % 的需求,剩下 40% 由垂直应用程序解决)这是我的智慧之言:

我知道这会很困难,但尝试将您的应用程序功能数据和租户数据绝对分离到两个不同的模式/数据库或其他任何东西中。当更改与核心应用程序功能相关并且对客户或用户数据没有影响时,这将使您能够显着减少推出时间和测试要求。基本上,您将不得不让您的团队经历极度痛苦来识别和剥离所有严格定义应用程序功能(应用程序元数据)的表。一旦实现了这一点,那么您将必须改进所有开发和测试流程,以将影响核心应用程序平台功能、垂直应用程序功能和客户数据相关的任务分开。这就是我们所做的,对我们来说,升级核心应用平台只需几个小时,甚至更短。

分离...

  • 核心平台能力数据/元数据
  • 垂直应用能力元数据和交易数据
  • 最后,租户 + 用户元数据和交易数据

老实说,如果没有对现有环境进行彻底分析,我无法告诉您如何或是否可以实现这一目标。祝你好运!

于 2013-05-04T01:57:58.313 回答