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