如何以低延迟处理不断更新的图表?

时间:2015-11-24 19:02:25

标签: hadoop web graph apache-spark

我正在开发一个项目,涉及许多连接到服务器的客户端(如果需要,服务器),其中包含一堆图形信息(节点属性和边缘)。他们可以选择在任何时候引入新节点或边缘,然后从图形中整体请求一些信息(两个节点之间的最短距离,图形着色等)。

这显然很容易开发天真算法,但后来我试图学习扩展它,以便它可以处理许多用户同时更新图形,许多用户从图形中请求信息,以及处理非常大(500k +)节点以及可能还有很多边缘的可能性。

我可以预见的挑战:

  • 随着不断更新的图表,我需要在每次有人请求信息时处理整个图表...这会增加计算时间和延迟
  • 有一个非常大的图表,计算时间和延迟显然会高很多(我读到一些公司通过批量处理大量结果并将它们存储在索引中供以后使用来解决这个问题...但是然后,由于我的图表不断更新,用户想要最新的信息,这不是一个可行的解决方案)
  • 大量用户请求的信息在服务器上会非常负载,因为它必须多次处理图形

我如何开始面对这些挑战?我看了hadoop和spark,但他们似乎有高延迟解决方案(使用批处理)或解决方案,解决图表不会不断变化的问题。

我的想法是可能处理图形的不同部分并对它们编制索引,然后跟踪图形的更新位置并重新处理图形的这一部分(一种分布式动态编程方法),但我不是确定这是多么可行。

谢谢!

2 个答案:

答案 0 :(得分:1)

  

我如何开始面对这些挑战?

我要回答这个问题,因为这是重要的问题。您列举了许多有效的问题,所有这些问题都需要您处理,而且我都不会直接解决这些问题。

为了开始,您需要完成定义语义。你可能认为你已经完成了,但你不是。当您说“用户想要最新信息”时,“最新”是否意味着

  1. “过去的一切”,这导致每个交易完全序列化到图表中,以便答案反映每一条可能的信息?
  2. 或者“一切事情都超过X秒前”,导致部分序列化,目前多个数据库状态逐步序列化为过去?
  3. 如果需要1.,您的代码中可能存在不可避免的热点,具体取决于应用程序。您可以立即获得有关何时回滚事务的信息,因为它存在不一致。

    如果2.是可接受的,您可以获得更好的性能。但是有一些权衡。您可能会遇到在初次接受后必须回滚交易的情况。

    一旦你回答了这个问题,你就已经开始面对挑战,而且我认为还会有更多问题。

答案 1 :(得分:1)

我对图表了解不多,但我确实了解了一些网络。

我要记住的一条规则是......如果可以让客户端这样做,就不要在服务器端工作。

您的所有服务器需要做的是维护原始数据,向客户端提供原始数据,并在数据发生变化时通知已连接的客户端。

客户可以拥有自己的原始数据副本,然后根据他们所知道的内容和他们收到的更新生成计算/可视化。

客户只需知道是否有新记录或旧记录是否已更改。

如果由于某种原因,您绝对必须处理数据服务器端并将其发送到客户端(例如,客户端是第三方软件,而不是您可以控制的东西,它需要处理的数据,而不是原始数据),那么,你确实有一些问题,所以得到一个糟糕的服务器......或3或30.在这种情况下,我必须确切知道数据是什么以及如何处理它以便做出任何形式关于缩放配置的建议。