我几个月来一直试图找到这个重要问题的答案,但无济于事。所以我在这里发布,因为stackoverflow是技术问题的最佳位置。
我制作了一款Android应用,其名称在此阶段我不会提及。它通过LAMP上的Web服务与中央MySQL数据库同步,这也是我创建的。这一切都很有效,没有任何问题。当用户使用应用程序并执行某些操作时,来自其设备的数据将上载到在数据中心中运行的中央服务器。当其他移动设备与数据库同步时,它们会使用较新的数据进行更新。在初始安装时,app会通过几百个查询获得几百K的数据。
现在的问题是应用程序已经开始获得如此多的下载量,我可以预见我将无法跟上同步。有一段时间我一直在Android端和Web端优化代码(iPhone版本仍处于开发阶段),并且还使用缓存技术,但仍然,成千上万的移动设备和一个数据库之间的通信正在达到限制。每天的下载次数都比前一天多。现在我非常担心如何处理这种情况。
我一直在研究使用Amazon DynamoDB,还讨论过它的SDK,教程等等,并准备花几天时间将整个同步内容切换到亚马逊。但这最终会花费我很多钱,为此我将不得不为应用程序收费或使用更好的广告计划。但这是另一个问题。
不幸的是谷歌搜索数周并没有帮助我弄清楚如何有效地处理数以千计的移动设备的大型同步,这些设备可能会达到数万甚至数十万。
简而言之,如果要使用我的应用处理100K设备并需要与中央数据库保持同步,该怎么办?
如果您遇到类似情况并知道如何在现实生活中处理它,请回答。
提前致谢。
答案 0 :(得分:0)
我的一位好朋友,Shopify的服务器管理员罗伯特在这方面指导我,我想我应该在这里简要分享一下。
对于大量用户来说,确实需要大量服务器。这里的挑战是如何有效地管理这种多服务器场景。
我在Google采访中也提到了这个问题,令人惊讶的是我回答得非常正确,或者这就是采访者所说的。我还为一家公司工作过这类问题,该公司正在为Verizon开展一个项目,处理通过移动应用访问服务器场的数十万客户。
我注意到了上述所有方法。这让我感到宽慰的是,我自己的方法也没有太大的不同。
所以,如果您正在使用例如亚马逊服务,使用他们的ELB,即Elastic Load Balancing解决方案。通过克隆主服务器来使用它,每个服务器都根据前一个服务器上的负载打开或关闭。您还需要具有多个CNAME记录的DNS服务器,以便将负载直接加载到多个IP。这本身就是一项非常有趣的技术,但亚马逊使其变得更加简单。 DNS本身就是一项复杂的技术,但是使用CNAME并将其用于通过亚马逊进行路由和平衡的一点阅读将非常快速地帮助。
现在显然还有一个数据库涉及任何给定的架构师。就我而言,它一直是MySQL。由于成本和复杂性的原因,我尝试并放弃了亚马逊的DynamoDB(NoSQL解决方案)。在理解SQL和NoSQL之间的差异时,我的前任老板之一比我好得多,这让我想起了为什么NoSQL比SQL更差的选择。因此,如果遇到问题,我们会设置一个主数据库,然后设置它的从属数据库。响应我们的REST查询的REST服务器的每个实例仅与其自己的MySQL从服务器进行交互,而后者又从主主数据库进行更新。确实,这将创建大量服务器实例,并且将在亚马逊上花费相当多的钱,但这就是它的完成方式。
在Verizon方案中,解决方案来自Microsoft,每个服务器应该从25000个用户获取负载,然后再为另外25000个用户启动下一个服务器。然而,一旦我听到微软这个词,我对任何提议的解决方案都失去了信心。我可以看到他们在整个.NET架构和许可方面遇到的问题。我宁愿坚持使用基于Linux的解决方案。
我见过新加坡的数据中心服务于北美市场,速度非常糟糕。亚马逊还在世界各地提供数据中心。您的服务器在您的受众群体所在的位置非常重要。对于您的博客或类似内容,您可以使用CloudFlare中的服务,但对于您的应用,可以通过策略性放置的服务器更好地实现您自己的智能架构。
最后,我非常依赖亚马逊云服务,现在他们有许多新的解决方案,可以更轻松地处理来自大量应用程序的大量请求。我不知道所有这些解决方案,但主要架构仍然与我在此描述的相同。
祝你下一个伟大的应用程序好运:)
答案 1 :(得分:0)
选项1)如果假设您的应用程序有很多来自MySQL DB的读取,那么第一个选项是添加只读复制品(RR),您可以添加最多5个只读复制品
选项2)让ElastiCache群集位于您的Web服务和MySQL数据库之间
选项3)了解如何实施DynamoDB。它不是MySQL的替代品,如果您的数据架构严格依赖于MySQL,则需要大量的编码工作