大规模应用程序 - 选择正确的数据库并从中提供数据

时间:2016-04-28 22:53:06

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

我最近一直在做很多研究。我知道这是一个模糊的问题,但我会尽量具体。我一直在开发中小型Web系统,但从未处理过没有SQL数据库,或者做过这种规模的东西。问题的目的是做出正确的决定,因为我不想在脚下射击自己。并希望它可以帮助像我这样的其他人,对此有所了解,并且一个具体的例子可以澄清更多的事情 在我看来。

为了使这更容易,我将举一个非常接近我想要实现的例子,这非常简单,涵盖了很多类似的系统。希望通过这个例子,我将清除我正在处理的数据类型,系统类型和需要执行的操作。

示例系统概述

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

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

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

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

问题1:

现在,我一直在讨论谷歌云解决方案。我认为最好使用App Engine,因为我无法负担维护虚拟服务器的费用。我决定使用DataStore,这是我的问题:

1)DataStore是否适用于此案例?

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

虽然我不相信我的数据真的是结构化的。特别是我将为用户/客户(多租户)使用命名空间,并且它自动包含在密钥中。我目前拥有的实体是User(可能包含少数几个实体),以及作为" standalone"实体。

问题2

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

我不想向客户展示数百万次访问。我会给他们整体统计数据。例如,通过Android移动设备访问了多少次。或时间范围内的统计数据。所以我相信有两种方法。首先,建立单独的数据库。或者可能是同一DataStore中的单独实体,它保存每个客户的每日总统计数。然后通过添加"天统计数据和#34;这感觉不对。其次,每次我想提供数据时,我都会查询一个大数据库。但第二种方法也感觉不对。因为据我所知,Datastore没有" Group by"功能,例如聚合。因此,每次,客户都希望通过设备"来查看统计数据。我需要通过"制作"组。代码在内存上的功能?或者如果我只想显示"计数"具体的过滤查询结果,我相信数据存储不直接支持?在提供数据时实时进行这些计算听起来很多。

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

我很感激有很多人抽出时间就此事提出任何意见。非常感谢你提前。

2 个答案:

答案 0 :(得分:0)

我几年前在Amazon AWS上使用MongoDB构建了一个类似的系统。今年,厌倦了在AWS上做DevOps(向@AndreiVolgin点头),我把它移到了Google BigQuery。

我的用例的数据存储区是过度的,坦率地说是限制性的。我本来想关闭大多数属性的索引,以节省存储成本。限制因为使用Tableau等可视化工具将基于数据存储的数据连接起来更加困难。

关于

  

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

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

答案 1 :(得分:0)

  

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

和你一样,我从数据存储开始时来自SQL背景。数据存储区与SQL完全不同。你必须以完全不同的方式思考。它不是SQL的反面,只是完全不同。

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

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

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

听起来你只有一种类型的数据。我会有一个实体,只有一个枚举属性“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