![Web 应用程序部署:一个版本适用于所有客户端或每个客户端都有自己的版本](https://linux22.com/image/686257/Web%20%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E9%83%A8%E7%BD%B2%EF%BC%9A%E4%B8%80%E4%B8%AA%E7%89%88%E6%9C%AC%E9%80%82%E7%94%A8%E4%BA%8E%E6%89%80%E6%9C%89%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%88%96%E6%AF%8F%E4%B8%AA%E5%AE%A2%E6%88%B7%E7%AB%AF%E9%83%BD%E6%9C%89%E8%87%AA%E5%B7%B1%E7%9A%84%E7%89%88%E6%9C%AC.png)
我有一个关于软件部署的常见问题。在工作中,我们设计了一个通过 Web 浏览器使用的 CRM。最近有人告诉我,每个特定客户都有自己的服务器(虽然这些服务器归我公司所有,但它们不是他们的,也不位于他们的办公室)。
这让我有点困扰。在我看来,当一个人设计一个 Web 应用程序时,他必须考虑到他将能够为所有客户端维护一个“软件”运行(不谈论复制或负载平衡),每个客户端可能使用不同的数据库,但只有一个应用程序......它特别有助于维护和让每个人都及时获得补丁和升级。我错了吗??你能用资源帮助我更好地理解这个问题吗(我一定是缺乏正确的关键字,自己找不到它们)。我实际上不明白为什么他们要走“第三条路”,介于“一个为每个人服务的集中式 Web 应用程序”和“一个为每个人服务的分布式桌面应用程序”之间。
谢谢 !
答案1
这取决于方法。使用当今的技术(用于作业自动化的工具,例如 docker、puppet、chef、ansible 等 - 有数百个),维护数千台服务器要容易得多。
为每个客户提供一台服务器使您能够更精确地为每个客户规划资源,并让他们按实际使用量付费。这还可以减少您的问题,这也有一些好处。
想象一下,一个数据库中有 1000 个客户,总共有 2TB 的数据。开发人员必须完美地编写 SQL 查询才能让这样的数据库足够快。如果每个客户都有一个小型数据库,这个问题就会小得多。
另一个需要考虑的问题可能是安全性。如果你必须在应用程序级别上区分客户,那么你的开发人员必须非常小心他们选择的数据。如果你为每个客户设置一个数据库,那么泄露其他客户数据的可能性就会更小。
另一方面,为所有客户提供单一实例使您能够在客户之间共享资源并节省一些硬件费用。
因此,在项目开始时,应在列出优点和缺点后做出此决定。我还建议创建一些原型,这样您就知道部署过程、数据库迁移等对您来说不会成为问题。
根据我的经验,如果您可以管理多个实例,我个人建议为每个客户提供一个实例。
答案2
为每个客户配备单独的服务器可以隔离客户数据,让您拥有多个版本的应用程序。但也有一些缺点。您将在服务器上花费更多钱(因为您无法轻松地在客户之间共享资源),而且您必须很好地管理部署。此外,如果您在所有客户端中只有一个数据库,则必须确保数据结构或库要求不会发生重大变化。您还需要管理一些客户端 - 应用程序版本的地图。
我为环境中的每个客户端都安装了相同版本的软件,这有助于我们维护和扩展服务器(我可以部署与其他服务器相同的新服务器,并将其添加到负载均衡器中)。此外,我不必为每个客户使用不同的端点。
答案3
我认为这是一个相当早期的设置,以下是我认为在资源开销之上保留单独的服务器是个坏主意的一些原因:
为一个客户和另一个客户开发扩展存在很大风险,这会导致日后发生冲突。出于短期业务原因,这可能会产生您永远无法摆脱的技术债务。将来合并这些冲突的功能可能会变得太困难,您最终可能会选择放弃旧版本的这些定制客户端,或者在您不想这样做的时候继续使用它们。
跨国或跨州客户,甚至行业内的一系列收购都可能需要一个数据分离但可从总部报告的系统。无论如何,这都会迫使您拥有一个多租户版本,从而抵消了数据库分离的好处。
所有成功的 Saas 公司最终都会使用汇总数据来组合匿名功能,例如行业统计数据、学习机会等。我看到 Xero 和 Mailchimp 成功使用了这种方法,我认为这些数据非常非常有价值。