序幕
我将尝试将您的问题分解为以便更清楚地了解您当前的需求,然后重新构建它。这花了很长时间来写,所以如果你在后面做两件事,我会非常感激:
- 持怀疑态度- 绝对没有什么可以替代您自己测试的东西。互联网作为指南非常有用,但不能保证您获得的帮助(如果这个答案甚至有帮助!)对于您的具体情况是最好的。在分配的空间中完全描述您目前的情况是不可能的,因此任何答案必然会在某个地方缺乏。
- 再看看你是如何解释自己的——这是一个有效的问题,但由于你对系统的描述和你想要达到的目标不够清晰而被部分阻止。在发布复杂问题之前让不熟悉您系统的人查看您的问题可能会有所帮助。
问题定义
从多个客户端到中央服务器的传感数据流
您正在将数据从多个位置发送到单个持久性存储
在线监控
您将根据原始数据和可能的一些聚合数据触发进一步的操作
分析和一些计算,例如机器学习和数据挖掘任务
您将对客户端的数据执行一些聚合,即您需要将所有客户端数据的聚合保存(但暂时)某处
进一步的假设
因为您在谈论物化视图,我们可以假设所有客户端都将数据保存在数据库中,可能是 Oracle。
来自您的客户的数据是关于同一主题的。
你有大约 100 个客户,我们可以假设:
- 客户数量可能会改变
- 您希望能够在不增加访问数据的方法数量的情况下添加客户端
您不为 Google、Amazon、Facebook、Quantcast、Apple 等之一工作。
架构图
在这里,我不会对它的实际工作方式发表任何评论 - 这是基于我对您的系统缺乏了解的讨论的开始。“原始数据持久性”可以是文件、Kafka、数据库等。这是对所需组件的描述,也是对它们如何连接的粗略猜测。
将假定架构应用于物化视图
物化视图是一个持久化的查询。因此,您有两种选择:
- 创建一个查询,将所有 100 个客户数据联合在一起。如果添加或删除客户端,则必须更改查询。如果您的任何一个客户端出现网络问题,那么一切都会失败
- 编写并维护 100 个物化视图。您中心位置的 Oracle 数据库有 100 个传入连接。
正如您可能从您必须做出的权衡中猜到的那样,我不喜欢将物化视图作为唯一的解决方案。我们应该努力减少重复代码和单点故障的数量。
不过,您仍然可以使用物化视图。如果我们使用图表并删除您中心位置的所有重复箭头,则意味着两件事。
- 有一个接受传入数据的服务
- 有一个服务可以将所有传入的数据放在一个地方
然后,您可以为聚合层使用单个物化视图(如果您的原始数据持久性不在 Oracle 中,您首先必须将数据放入 Oracle)。
变化的后果
现在我们已经决定你有一个单一的数据管道,你的决定实际上变得更加困难。我们已将您的客户端与中心位置和聚合层与我们的原始数据持久性分离。这意味着选择现在是您的,但它们也更容易更改。
重新构想架构
在这里,我们需要弄清楚哪些技术不会改变。
- Oracle 数据库很昂贵,而且您每天要向您的数据库推送 140GB(顺便说一下,这是 50TB/年,相当多)。我不知道您是否实际上存储了所有原始数据,但在这些数量上,您不太可能 - 您只存储聚合
- 我假设你有一些首选的技术可以用来进行机器学习和数据挖掘。如果您不这样做,请考虑购买一些以防止疯狂支持一切
将所有这些放在一起,我们最终得到以下内容。实际上只有一个问题很重要:
您想从数据库中读取多少次原始数据。
如果答案是一次,那么我们刚刚描述了一些描述的中间件。如果答案不止一次,那么我会重新考虑,除非你有一些非常好的磁盘。是否将 Kafka 用于此中间层完全取决于您。使用你最熟悉的任何东西,以及你最愿意花时间学习和支持的东西。您正在处理的数据量是非常重要的,并且需要进行一些试验和错误才能做到这一点。
关于这一点的最后一点;我们已经定义了一个数据管道。数据流经系统的单一方法。通过这样做,我们增加了系统的灵活性。想要添加更多的客户,无需做任何事情。想要改变部分系统背后的技术,只要界面保持不变就没有问题。想往别处发数据,没问题,都在原始数据持久层。