因此,我目前正在设计SaaS应用程序。我的设计有点小问题。假设我在www.mycompany.com下部署了一个应用程序。用户购买订阅,因此可以访问应用程序。现在,我想要的是在用户购买订阅时创建这个应用程序的一个新实例的“方法”,例如:
约翰拥有维加公司。当他购买访问/使用我的应用程序的许可证时,会创建一个可以通过www.vega.mycompany.com访问的新实例。创建他的帐户后,将部署应用程序的一个新实例,创建新的DB并将其与我的应用程序的新创建实例链接起来。
背后的原因是:
我想用Java开发应用程序。我将通过它创建SaaS应用程序的新实例的管理应用程序也将在Java中开发。现在我的问题是:
发布于 2014-10-07 17:19:12
我现在正在研究一个类似的问题/解决方案,虽然它是用C#编写的,但它将在linux中使用mono运行,我相信我的解决方案与语言无关。
首先,像你我一样开发一个SaaS应用程序--它需要为每个新客户提供一个新实例--实际上并不是最好的实践(据我所知)。由于您提到的问题--建立一个新的环境并处理许多并发实例,其中包括更新或可能将它们移动到不同的服务器/基础结构。
对我来说,做出这一决定是因为应用程序的初始设计很糟糕,数据设计更简单,而且最终安全性更好,因为现在可以让每个客户只对他的数据库的一个小子集拥有权限,而我这方面的SQL注入或其他错误也不能改变这一点--因为权限是在数据库级别强制执行的。(你可能还会有窃听器,我很清楚)
我的解决方案:
使用码头集装箱。它比传统的VM轻量级得多,为您提供了额外的抽象和安全性,例如,允许用户上传文件…。此外,部署一个新容器非常简单和快速,因此您可以在用户注册后的几秒钟内完成。
我使用主机上的Nginx服务器作为反向代理,它将请求转发给每个客户的相应容器。这里的问题是在更新配置文件之后重新启动Nginx,而不丢失任何流量,这有点棘手。
更新应用程序也很容易,因为您只需要发布映像的新版本,停止所有正在运行的容器并使用新映像重新启动它们。然而,为了能够做到这一点,容器不能保存任何数据,请记住这一点。-这里的问题是,在某种程度上更新它,用户不会注意到,对我来说--因为我只有一个时区的顾客,所以很容易--只要把它安排在凌晨4点,祈祷没有人会疯狂到在那个时候醒着工作:)
这并不能给您提供99,999%的可用性,但这不是我想要的,而且对于管理这些容器来说,这是一个很好的权衡。另外的优点是--您可以在任何linux机器上测试生产环境,您可以在任何地方移动代码,只需更改Nginx反向代理配置即可。
https://stackoverflow.com/questions/26239850
复制相似问题