软件即服务(SaaS)的应用程序设计

时间:2014-10-07 15:37:21

标签: java dns distributed saas java-ee-7

所以我正在设计SaaS应用程序。我的设计问题很小。 假设我在www.mycompany.com下部署了一个应用程序。用户购买订阅,因此可以访问该应用程序。 现在我想要的是在用户购买订阅时创建此应用程序的新实例的“方法”,例如:

John拥有Vega公司。当他购买访问/使用我的应用程序的许可证时,会创建一个可以通过www.vega.mycompany.com访问的新实例。 创建帐户后,将部署新的应用程序实例,创建新数据库并将其与新创建的应用程序实例链接。

背后的原因是:

  1. John可能会生成大量数据,因此拥有多个较小的DB比为每个客户提供服务更好。
  2. John可能会存储他不想与其他用户存储在同一个数据库中的敏感数据。
  3. 我想用Java开发应用程序。我将通过Java开发用于创建SaaS应用程序新实例的管理应用程序。 现在我的问题:

    1. 我如何实现这一目标?我是否只是在创建新帐户时在应用程序容器(例如Tomcat)中部署相同的WAR文件?
    2. 如何从管理员应用程序创建'vega'子域 - 甚至是可能的?
    3. 如果有错误或者我想简单地更新某些内容并且我有1000个此应用程序的实例,我该如何顺利完成?

1 个答案:

答案 0 :(得分:2)

我现在正在研究一个类似的问题/解决方案,虽然它是用C#编写的,但它将使用mono运行在linux中,我相信我的解决方案与语言无关。

首先 - 开发一个像你我一样的SaaS应用程序 - 每个新客户需要一个新实例并不是最好的实践(据我所知)。由于您提到的问题 - 设置新环境并处理许多并发实例,其中包括更新或可能将它们移动到不同的服务器/基础架构。

对我来说,这个决定是由于应用程序的初始设计错误,数据设计更简单,最终提高了安全性,因为现在可以为每个客户提供对他的小数据库子集的权限,而不是SQL注入或者我身边的其他错误可以改变这一点 - 因为权限是在数据库级别强制执行的。 (你仍然可以在那里发现错误,我完全清楚这一点)

我的解决方案:

使用docker containers。它比传统的VM更轻量级,为您提供额外的抽象和安全性,例如,允许用户上传文件,...而且部署新容器相当简单快速,所以你可以在几秒钟后完成用户注册。

我在主机上使用Nginx服务器作为反向代理,它将请求转发给每个客户的相应容器。这里的问题是在更新配置文件后重新启动Nginx,而不会丢失任何流量,这有点棘手。

更新应用程序也很简单,因为您只需要发布新版本的映像,停止所有正在运行的容器并使用新映像重新启动它们。但是,为了能够做到这一点,容器不能保存任何数据,请记住这一点。 - 这里的问题再次以某种方式更新它,用户不会注意到,对我来说 - 因为我只有一个时区的顾客很容易 - 只安排它凌晨4点,手指交叉没人会疯狂到醒着并在那个时候工作:)

这可能不会给你99,999%的可用性,但这不是我的目标,这是管理这些容器的一个很好的权衡。其他优点是 - 您可以在任何Linux机器上测试生产环境,并且可以在任何地方移动代码,只需更改Nginx反向代理配置。