首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >软件即服务(SaaS)的应用设计

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

Stack Overflow用户
提问于 2014-10-07 15:37:21
回答 1查看 3.6K关注 0票数 2

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

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

背后的原因是:

  1. John可能会生成大量的数据,因此拥有多个较小的DB比为每个客户服务更好。
  2. John可能会存储他不希望存储在与其他用户相同的DB中的敏感数据。

我想用Java开发应用程序。我将通过它创建SaaS应用程序的新实例的管理应用程序也将在Java中开发。现在我的问题是:

  1. 我怎样才能真正做到这一点呢?在创建新帐户时,我是否只需在应用程序容器(例如Tomcat)中部署相同的WAR文件?
  2. 如何从管理员应用程序中创建“vega”子域--这可能吗?
  3. 如果有一个bug,或者我想简单地更新一些东西,并且我有这个应用程序的1000个实例,我如何顺利地完成它呢?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-07 17:19:12

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

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

对我来说,做出这一决定是因为应用程序的初始设计很糟糕,数据设计更简单,而且最终安全性更好,因为现在可以让每个客户只对他的数据库的一个小子集拥有权限,而我这方面的SQL注入或其他错误也不能改变这一点--因为权限是在数据库级别强制执行的。(你可能还会有窃听器,我很清楚)

我的解决方案:

使用码头集装箱。它比传统的VM轻量级得多,为您提供了额外的抽象和安全性,例如,允许用户上传文件…。此外,部署一个新容器非常简单和快速,因此您可以在用户注册后的几秒钟内完成。

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

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

这并不能给您提供99,999%的可用性,但这不是我想要的,而且对于管理这些容器来说,这是一个很好的权衡。另外的优点是--您可以在任何linux机器上测试生产环境,您可以在任何地方移动代码,只需更改Nginx反向代理配置即可。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26239850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档