我正在开发一款大量使用数据库的 iOS 应用,用户可以将数据同步到服务器。但是,我担心如果太多用户开始使用该应用,服务器将无法再处理。我根本不是服务器专家,也不太了解服务器的工作原理,但我的问题是,为什么服务器会过载,如何防止这种情况发生?这与我的服务器主机是谁有关吗?还是与我的代码效率有关?如果我的主机是可靠的服务器,例如 Amazon AWS,我是否仍然面临服务器问题的风险?最重要的是,这与我实现代码的方式有关,还是与我的主机是谁有关?
答案1
这个问题很模糊。它们之所以会下降,是因为……嗯,你让它们超负荷运转,它们没有能力处理你交给它们的任务。
想想看。如果发生火灾,你会用花园水管、水枪还是油罐车来灭火?它们都可以扑灭小火。大火需要更大的灭火能力。
如何预防?您可以进行测试。您可以针对预计的负载进行规划。
如果您谈论的是数据库,那么如果您的负载预计会超出您的处理能力,您可以与数据库人员交谈。您需要规划如何拆分表,以便将其分布到多个服务器上,规划分片,可以设置只读服务器来帮助读取,主/从设置……或者查看底层技术,看看“NoSQL”服务器替代方案是否能更好地满足您的需求。然后,查看数据请求来自何处,看看是否可以将服务器分布在更有利于用户请求的地理位置。
对此没有固定的答案,因为它完全取决于您的应用程序的功能、它处理的数据类型以及您从数据库中提取的内容。
编辑 - 你特别问了亚马逊是否存在危险。亚马逊就像乐高。当然,你可以使用他们的工具来构建强大的实现……而且你需要为此支付额外费用。或者,你可以在一个实例上运行它并将其绑定到他们的专有数据库系统。你可以让你的应用程序“工作”,但它可能仍然不是完全强大的。此外,亚马逊并不是魔术。实例会降级、毫无预警地死亡等等……所以要回答你问题的这一部分,是的,使用亚马逊时,你的数据仍然处于危险之中,除非你围绕可能的故障进行设计。你可以设置跨多个区域的多个数据库服务器作为故障转移,这会变得相当复杂。这就是为什么有人只为使用数据库而支付高达六位数甚至超过六位数的报酬。他们围绕这些问题进行设计以谋生,而亚马逊并不是依靠独角兽来驱动的……他们确实有故障。
答案2
这很普遍。它可以是:
- 由于并发操作冲突而导致的竞争条件(这可能是由于服务器软件设计不良造成的)
- 负载导致服务器无法在超时时间内响应
- 打开的 TCP 连接数超出服务器的处理能力
- 网络带宽饱和
- 大量线程或进程或内存分配导致服务器内存不足
导致服务器因负载而失败的其他原因还有很多,但这些原因已经涵盖了大部分情况。它们还涵盖了服务器的性能、网络链接、总体可靠性以及正在运行的服务器软件。
答案3
why do servers get overloaded and how can that be prevented?
因为没有足够的资源来满足需求。例如,后端的单个服务器可能会因 HTTP 请求而超载,从而导致拒绝服务。
您可以通过使用 Apache 等工具来前置服务,并使用负载平衡器将请求分发到免费服务器或负载较少的服务器,从而防止这种情况发生。数据库也可以这样做,水平或垂直扩展(分片)
Does it have to do with who my server host is? Or is it about the efficiency of my code?
更多与您的服务器主机有关,但代码也可能导致这种情况。
If my host is a reliable server, such as Amazon AWS, am I still at risk for server problems?
取决于谁负责设置您的 servlet 容器以及如何配置它来提供请求。但是,我不熟悉 AWS,因此无法在这里给出充分的答案。
Bottom line is, does it have to do with the way I implement my code, or does it have to do with who my host is?
DOS通常是由于主机端资源不足造成的。但是,如果代码编写和设计不当,也会导致这种情况。
例如,如果您在 PSQL 中编写了太多的控制器/业务逻辑,则可能会使数据库过载并阻止查询及时返回,从而导致 DOS。
您还可能编写在数据库上使用过多连接的代码,并出现不再提供连接而导致 DOS 的问题。
这两个例子不一定是由于缺乏资源而导致的问题,而是由于没有有效利用所用工具而导致的问题。两者都很重要,而且遇到 DOS 的方式有很多种。
但是,一个好的初始设计模型可以让你走得很远。如果你不确定如何设计你的代码,我建议你先看看 MVC 和 SOA。祝你好运!