【问题标题】:Large Scale App - Choosing the right database, and serving data from it大型应用程序 - 选择正确的数据库,并从中提供数据
【发布时间】:2016-04-28 22:53:05
【问题描述】:

我最近一直在不停地做很多研究。我知道这是一个模糊的问题,但我会尽可能具体。我一直在开发中小型 Web 系统,但从来没有处理过 noSQL 数据库,也没有做过这种规模的东西。这个问题的目的是做出正确的决定,因为我不想在脚上开枪。希望它可以帮助像我这样的其他人,这是新手,一个具体的例子可以澄清更多的事情 在我看来。

为了使这更容易,我将给出一个非常接近我想要实现的示例,它非常简单并且涵盖了许多类似的系统。希望通过这个示例,我将清楚我正在处理的数据类型、系统类型以及需要执行的操作。

示例系统概述

1) 系统概述:假设我们正在处理一个多租户系统,该系统允许用户跟踪其网站上特定页面的流量。用户/客户需要将我的系统代码植入他们的页面,并且此代码将调用我的服务器上的服务,该服务仅将数据存储在数据库中。数据只是页面访问者的数据,例如他们访问的页面、浏览器、设备、访问时间等。在这里,数据已存储

2) 用户/客户可以登录系统,查看他们的数据。这里的数据是SERVED

3) 除了存储和提供数据之外,系统中还有另一个服务将处理这些数据。并找到有关网站访问者的模式/结论。例如,通过移动设备访问特定页面的次数更多..(并根据此结论做任何事情)。这里的数据是PROCESSED

4) 我们谈论的是大量数据。可能从每天 3-4 百万次写入(访问)开始,我想确保它可以扩展到十亿以上

问题 1:

现在,我一直在为 Google Cloud 解决方案而苦恼。我认为最好使用 App Engine,因为我负担不起维护虚拟服务器的费用。我决定使用 DataStore,我的问题来了:

1) DataStore 是最适合这种情况的解决方案吗?

根据我的研究,我发现数据存储是最合适的,但由于缺乏经验,我当然不是 100% 有信心。但我之所以选择这个,是因为我经常使用 SQL。我没有选择 Cloud SQL,因为我的数据不是那么相关,而且由于系统的容量和对可靠性和可扩展性的需求,我认为 NoSQL 解决方案会更好。 Datastore 具有 GQL 语法,类似于 SQL 查询语言。对象的属性也被索引。例如,我可能需要按设备类型读取/过滤数据。我还看到 BigTable 非常不同(可能不习惯),你拥有的所有数据都是 Key:Value,我认为不可能/很难通过特定属性查询?

尽管我不相信我的数据是真正结构化的。特别是我将为用户/客户(多租户)使用命名空间,它会自动包含在密钥中。我目前拥有的实体是 User(可能会在其下包含几个实体),而 Visit 作为“独立”实体。

问题 2

向客户提供数据的最佳做法是什么?

我不想向客户展示数百万次访问。我会给他们总体统计数据。例如通过 Android 移动设备访问的次数。或时间范围内的统计数据。所以我相信有两种方法。首先,制作单独的数据库。或者可能是同一 DataStore 中的单独实体,它包含每个客户的每日总统计信息。然后通过添加感觉不对的“天数统计”来提供服务。其次,每次我想提供数据时,我都会查询一个大数据库。但第二种方法也感觉不对。因为据我所知,Datastore 没有“分组依据”等功能,也没有聚合功能。所以每次,客户都想“按设备”查看统计信息,我需要通过内存上的代码来实现“分组依据”功能吗?或者如果我只想显示特定过滤器查询结果的“计数”,我相信数据存储不直接支持?在提供数据时还要实时进行这些计算听起来很多。

现在我知道 Google 有一个名为 BigQuery 的解决方案,我相信它可以满足我的需求,并允许我以高度的灵活性和效率为客户提供我想要的数据,但据我所知,它仅适用于数据存储“备份” ,我需要实时提供数据。


我非常感谢任何抽出时间就此事提供意见的人。非常感谢您。

【问题讨论】:

  • 通过正确的应用设计可以实现可扩展性。但是您说I can't afford to maintain a virtual server - 这可能是一个问题:当“大规模”开始时,GAE 成本可能会变得非常重要,通常远高于常规 VM 的成本(您为可扩展的 PaaS 便利性付出了代价)。事实上,据报道,切换到 VM 是降低大型应用程序成本的一种方法。所以我会从这里开始cloud.google.com/appengine/pricing
  • 好吧,如果我不支付给 Google,我将不得不支付给其他人来为我维护/管理它。正如我所说,我没有足够的经验,但据我研究,我知道数据库设计是更大的因素。无论哪种情况,我都会考虑您的观点并进一步调查。但无论哪种方式,我都需要对数据库设计做出决定。如果我要使用 VM 或 App Engine。
  • 另外,问题的目的是澄清有关在 NoSQL 数据结构中处理大型数据集(选择正确的数据库,以及如何实时服务),无论我是否要使用 App引擎或计算引擎。
  • 您的帖子可能因离题而被关闭 - 过于宽泛/基于意见。但是那里有大量相关的帖子:stackoverflow.com/search?q=[gae-datastore]+scale.
  • 我在 17 年前创办了我的第一家软件公司——当然是服务器 + SQL 数据库。除了像 App Engine 这样的 PaaS 之外,我永远不会在其他任何东西上启动任何新项目(任何规模)(或者只有在我必须的时候才使用 IaaS,例如,App Engine 不支持文件流式传输)。如果你做得对,你甚至可以保持在免费配额内,直到你的项目真正起飞。

标签: database google-app-engine design-patterns google-cloud-datastore nosql


【解决方案1】:

几年前,我在 Amazon AWS 上使用 MongoDB 构建了一个类似的系统。今年,厌倦了在 AWS 上进行 DevOps(向 @AndreiVolgin 致敬),我将其转移到了 Google BigQuery。

我的用例的数据存储区有点矫枉过正,坦率地说,是有限的。我本来想关闭大多数属性的索引以节省存储成本。限制是因为很难将基于数据存储的数据与 Tableau 等可视化工具挂钩。

关于

我知道 Google 有一个名为 BigQuery 的解决方案,我 相信做我想要的,并允许我提供我想要的数据 客户具有很高的灵活性和效率,但据我了解 仅适用于数据存储“备份”,我需要实时提供数据。

当我的系统收到数据时,您的示例中的页面访问者数据为streams it directly to BQ。所以不,它不仅适用于备份。您是否可以使用它来报告“实时”取决于实时对您意味着什么。我的系统每隔几个小时计算一次汇总统计数据,以便向用户展示。

【讨论】:

    【解决方案2】:

    1) DataStore 是最适合这种情况的解决方案吗?

    和您一样,我在开始使用数据存储时具有 SQL 背景。数据存储与 SQL 确实不同。你必须以完全不同的方式思考。它不是 SQL 的对立面,只是完全不同。

    很难回答您的问题 1,因为理论上,唯一有资格回答该问题的人就是您。我们不可能知道或预测您已经和将要拥有的所有要求。

    话虽如此,根据我的经验(以及其他人的说法),您可以使用 SQL 完成的任何事情,您都可以完成 Datastore - 请记住,它与您习惯的不同你可能需要在某些地方发挥创意。但是,像我一样,您认识到 App Engine 附带的扩展能力和所有自动化都是值得的。这也很有趣。

    1. 向客户提供数据的最佳做法是什么?

    听起来您只有一种类型的数据。我将拥有一个实体,并且在其上只有一个枚举属性“MOBILE”、“WEB”等,然后按此过滤:

    Query<SomeEntity> q = ofy().load().type(SomeEntity.class).filter("platformType =", "MOBILE_ANDROID");
    for (SomeEntity someEntity: q) {
        System.out.println(someEntity.toString());
    }
    

    在官方文档中查看更多信息:https://github.com/objectify/objectify/wiki/Queries

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      • 2020-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      相关资源
      最近更新 更多