在应用程序中,我们必须通过Internet将感知数据流从多个客户端发送到中央服务器。一个显而易见的解决方案是使用Mafs(面向消息的中间件),例如Kafka,但我最近了解到我们可以使用oracle Materialized View等数据库同步工具来实现这一点。
后一种方法适用于某些应用程序(将数据从中央服务器发送到多个客户端,与我们的应用程序相反),但它在我们的应用程序中的优缺点是什么?哪个更适合从速度,安全性等方面将多个(~100)客户端的传感数据流发送到服务器?
感谢。
P.S。
有关更多详细信息,请考虑一个应用程序,其中许多(约100个)客户端必须通过Internet向中央服务器发送流数据(每分钟1MB数据)。服务器需要这些数据,以便进行在线监控,分析和一些计算,如机器学习和数据挖掘任务。
我的问题是db-to-db连接和流媒体解决方案(例如kafka)之间的差异,用于将数据从客户端转移到服务器。
答案 0 :(得分:2)
我会尝试将您的问题解决,以便更清楚地了解您当前的要求,然后重新构建它。这需要很长时间才能写出来,所以如果你从背后做两件事我真的很感激:
从多个客户端到中央服务器的传感数据流
您正在将数据从多个位置发送到单个持久性存储
在线监控
您将根据原始数据和可能的某些汇总数据触发进一步的操作
分析和一些计算,如机器学习和数据挖掘任务
您将在客户端上执行某些聚合操作'数据,即您需要所有客户端的聚合'数据要在某个地方保持(但不是暂时的)
因为您正在谈论物化视图,我们可以假设所有客户端都将数据保存在数据库中,可能是Oracle。
来自客户的数据是关于同一主题的。
您已经拥有约100个客户,我们可以假设:
您不能在Google,亚马逊,Facebook,Quantcast,Apple等公司工作。
在这里,我没有就它的实际工作方式发表任何评论 - 这是基于我对你的系统缺乏了解的讨论的开始。 "原始数据持久性"可以是文件,Kafka,数据库等。这是对所需组件的描述,并粗略猜测它们将如何连接。
物化视图是一个持久化查询。因此,您有两种选择:
正如你可以从权衡中猜出的那样,你不得不让我不喜欢物化视图作为唯一的解决方案。我们应该尝试减少重复代码和单点故障的数量。
您仍然可以使用物化视图。如果我们采用我们的图表并删除中心位置的所有重复箭头,则意味着两件事。
然后,您可以为聚合层使用单个物化视图(如果您的原始数据持久性不在Oracle中,那么您首先必须将数据放入Oracle)。
现在我们已经确定您拥有一个数据管道,您的决定实际上变得更难。我们已将客户端与中心位置和聚合层从原始数据持久性中分离出来。这意味着现在选择你的,但它们也更容易改变。
在这里,我们需要弄清楚哪些技术不会发生变化。
将所有这些放在一起我们最终得到以下结论。实际上只有一个问题很重要:
您希望从数据库中读取原始数据的次数。
如果对此的答案是一次,那么我们只是描述了一些描述的中间件。如果答案不止一次,那么我会重新考虑,除非你有一些非常好的磁盘。你是否在这个中间层使用Kafka完全取决于你。使用您最熟悉的任何内容,以及您最愿意花时间学习和支持的任何内容。您处理的数据量非常重要,而且这样做会有一些试验和错误。
关于这一点的最后一点;我们已经定义了一个数据管道。一种数据流经系统的方法。通过这样做,我们提高了系统的灵活性。想要添加更多客户,无需做任何事情。想要改变系统部分背后的技术,只要界面保持不变,就没有问题。想要在别处发送数据,没问题,它都在原始数据持久层中。