我有一个关于软件部署的一般性问题。在工作中,我们设计了一个通过 Web 浏览器使用的 CRM。最近有人告诉我,每个特定的客户都有自己的服务器(虽然这些服务器归我的公司所有,但它们不是他们的,也不在他们的办公室里)。
这让我有点困扰。在我看来,当一个人在设计一个 Web 应用程序时,他必须牢记他将能够为他的所有客户端维护一个“软”运行(不是在谈论复制或负载平衡),也许不同的数据库用于每个,但一个应用程序......它特别有助于维护和让每个人都保持最新的补丁和升级。我错了吗 ??能否通过资源帮助我更好地理解这个问题(我必须缺少正确的关键字才能自己找到它们)。我实际上不明白他们为什么要在“每个人一个集中式 Web 应用程序”和“每个人一个分布式桌面应用程序”之间经历“第三种方式”。
谢谢 !
这取决于方法。维护与当今技术相同的数千台服务器要容易得多(用于作业自动化的工具,例如我们的 docker、puppet、chef、ansible 等 - 数百台)。
为每个客户配备一台服务器使您能够更准确地为每个客户规划资源,并让他们为实际使用的资源付费。它还使您的问题更小,这也有一些优势。
想象一下,您将在一个数据库上拥有 1000 个客户,总共有 2TB 的数据。您的开发人员必须完美地编写 SQL 查询才能拥有足够快的数据库。对于每个客户的小型数据库,这个问题要小得多。
另一个需要考虑的问题可能是安全性。如果您必须在应用程序级别上区分您的客户,您的开发人员必须非常小心他们选择的数据。如果每个客户都有一个数据库,那么泄露其他客户数据的机会就会更小。
另一方面,为所有客户提供单一实例使您能够在客户之间共享资源并节省一些硬件费用。
所以,这个决定应该在项目开始时做出,在列出优点和缺点之后。我还建议创建一些原型,这样您就知道部署过程、数据库迁移等对您来说不是问题。
根据我的经验,如果您可以处理管理多个实例,我个人建议为每个客户创建一个实例。
为每个客户提供单独的服务器可以从隔离客户数据中受益,并允许您拥有多个版本的应用程序。但也有一些缺点。您将在服务器上花费更多的钱(因为您不能轻松地在客户之间共享资源)并且您确实可以很好地管理部署。此外,如果您在所有客户端中只有一个数据库,则必须确保数据结构或库的要求不会发生重大变化。您还需要有一些地图客户端 - 应用程序版本来管理。
我的环境中的每个客户端都有相同版本的软件,这有助于我们维护和扩展服务器(我可以部署与其他服务器相同的新服务器并将其添加到负载均衡器)。此外,我不必为每个客户使用不同的端点。
我认为这是一个相当早期的设置,以下是为什么我认为在资源开销之上保留单独的服务器是一个坏主意的一些原因:
存在为一个和另一个客户开发扩展的重大风险,这会导致进一步的冲突。出于短期业务原因,这可能会导致您永远无法摆脱的技术债务。将来合并这些相互冲突的功能可能变得太难了,您最终可能会选择在旧版本上放弃这些自定义客户端,或者在您不想这样做时坚持使用它们。
跨国或多国客户甚至行业中的一系列收购可能需要一个数据分离的系统,但可以从总部报告。这将迫使您在任何情况下都拥有多租户版本,从而抵消了数据库分离的好处。
所有成功的 Saas 公司最终都将聚合数据用于组合匿名功能,例如行业统计、学习机会等。我已经看到 Xero 和 Mailchimp 成功使用了这一点,我认为这些数据非常有价值。