用于传感数据传输的Oracle Materialized View

时间:2017-12-23 11:53:26

标签: oracle apache-kafka activemq materialized-views mom

在应用程序中,我们必须通过Internet将感知数据流从多个客户端发送到中央服务器。一个显而易见的解决方案是使用Mafs(面向消息的中间件),例如Kafka,但我最近了解到我们可以使用oracle Materialized View等数据库同步工具来实现这一点。

后一种方法适用于某些应用程序(将数据从中央服务器发送到多个客户端,与我们的应用程序相反),但它在我们的应用程序中的优缺点是什么?哪个更适合从速度,安全性等方面将多个(~100)客户端的传感数据流发送到服务器?

感谢。

P.S。

有关更多详细信息,请考虑一个应用程序,其中许多(约100个)客户端必须通过Internet向中央服务器发送流数据(每分钟1MB数据)。服务器需要这些数据,以便进行在线监控,分析和一些计算,如机器学习和数据挖掘任务。

我的问题是db-to-db连接和流媒体解决方案(例如kafka)之间的差异,用于将数据从客户端转移到服务器。

1 个答案:

答案 0 :(得分:2)

序言

我会尝试将您的问题解决,以便更清楚地了解您当前的要求,然后重新构建它。这需要很长时间才能写出来,所以如果你从背后做两件事我真的很感激:

  1. 持怀疑态度 - 完全无法替代自己测试的东西。互联网作为指南是非常有用的,但是不能保证你得到的帮助(如果这个答案有帮助的话!)对你的具体情况是最好的。在分配的空间中完全描述你当前的情况是不可能的,所以任何答案都必然会缺乏某些地方。
  2. 再次了解您自己如何解释 - 这是一个有效的问题,由于您对系统的描述不明确以及您尝试的内容而部分停止了实现。在发布复杂问题之前让不熟悉您系统的人查看您的问题可能有所帮助。
  3. 问题定义

      

    从多个客户端到中央服务器的传感数据流

    您正在将数据从多个位置发送到单个持久性存储

      

    在线监控

    您将根据原始数据和可能的某些汇总数据触发进一步的操作

      

    分析和一些计算,如机器学习和数据挖掘任务

    您将在客户端上执行某些聚合操作'数据,即您需要所有客户端的聚合'数据要在某个地方保持(但不是暂时的)

    进一步的假设

    因为您正在谈论物化视图,我们可以假设所有客户端都将数据保存在数据库中,可能是Oracle。

    来自客户的数据是关于同一主题的。

    您已经拥有约100个客户,我们可以假设:

    • 客户端数量可能会发生变化
    • 您希望能够在不增加访问数据的方法数量的情况下添加客户端

    您不能在Google,亚马逊,Facebook,Quantcast,Apple等公司工作。

    架构图

    在这里,我没有就它的实际工作方式发表任何评论 - 这是基于我对你的系统缺乏了解的讨论的开始。 "原始数据持久性"可以是文件,Kafka,数据库等。这是对所需组件的描述,并粗略猜测它们将如何连接。

    Basic architecture diagram

    将假设架构应用于物化视图

    物化视图是一个持久化查询。因此,您有两种选择:

    1. 创建一个将所有100个客户端数据联合在一起的查询。如果添加或删除客户端,则必须更改查询。如果您的任何一个客户端出现网络问题,那么一切都将失败
    2. 编写并维护100个物化视图。位于中心位置的Oracle数据库有100个传入连接。
    3. 正如你可以从权衡中猜出的那样,你不得不让我不喜欢物化视图作为唯一的解决方案。我们应该尝试减少重复代码和单点故障的数量。

      您仍然可以使用物化视图。如果我们采用我们的图表并删除中心位置的所有重复箭头,则意味着两件事。

      1. 有一项服务接受传入数据
      2. 有一项服务可将所有传入数据放入一个地方
      3. 然后,您可以为聚合层使用单个物化视图(如果您的原始数据持久性不在Oracle中,那么您首先必须将数据放入Oracle)。

        变更的后果

        现在我们已经确定您拥有一个数据管道,您的决定实际上变得更难。我们已将客户端与中心位置和聚合层从原始数据持久性中分离出来。这意味着现在选择你的,但它们也更容易改变。

        重新构想架构

        在这里,我们需要弄清楚哪些技术不会发生变化。

        • Oracle数据库价格昂贵,而且您每天需要140GB /天(相当于50TB /年)。我不知道您是否实际存储了所有原始数据,但在这些数据库中它不太可能存在 - 您只是存储聚合
        • 我假设您已经获得了一些首选技术,您的机器学习和数据挖掘工作正在进行中。如果你不考虑得到一些来防止疯狂支持一切

        将所有这些放在一起我们最终得到以下结论。实际上只有一个问题很重要:

        您希望从数据库中读取原始数据的次数。

        如果对此的答案是一次,那么我们只是描述了一些描述的中间件。如果答案不止一次,那么我会重新考虑,除非你有一些非常好的磁盘。你是否在这个中间层使用Kafka完全取决于你。使用您最熟悉的任何内容,以及您最愿意花时间学习和支持的任何内容。您处理的数据量非常重要,而且这样做会有一些试验和错误。

        enter image description here

        关于这一点的最后一点;我们已经定义了一个数据管道。一种数据流经系统的方法。通过这样做,我们提高了系统的灵活性。想要添加更多客户,无需做任何事情。想要改变系统部分背后的技术,只要界面保持不变,就没有问题。想要在别处发送数据,没问题,它都在原始数据持久层中。