AWS Lambda,如何使用昂贵的构造从不改变数据结构(图形)?

时间:2017-01-27 20:04:22

标签: amazon-web-services lambda aws-lambda

这是一个理论问题。我知道我可以很容易地解决所述的示例问题 使用一些AWS GraphDatabase。我真的需要让lambda函数本身在一个更大的数据结构中工作,这个数据结构保存在内存中,而不是外包图形计算或其他东西。图仅用作示例。

设置:

假设我想将AWS Lambda用于我的一个项目。 该项目提供了一个API,用于搜索从顶点A到顶点B的永不变化的图形中的最短路径。 由于这些请求是无状态的,因此对于像AWS Lambda这样的东西来说是完美的。

使用模式:

经常不使用此服务。让我们说一天10次。但当有人 使用它,他们可能会在短时间内使用它几次。

问题:

要处理的图表是静态的,它不会改变。但它很大,如果 从一些类似XML的数据构建它需要几秒钟。在程序中,图表由 顶点类的几千个实例,每个顶点都有一组相邻的顶点。 (无向图)

问题:

我将如何使用AWS lambda实现此功能? (示例代码将是java,但由于这是理论上的,关于aws而不是java,它应该无关紧要)

  • 当然,每次请求服务时,我都可以从XML构建此图。 但是每次都需要几秒钟来构建永不改变的对象结构, 这不合适。

  • 我可以将图形结构保存到临时内存(/ tmp),以便在后续版本中重用 请求只要它们发生在4:30Minute(让我们调用那些4:30分钟的一个SESSION)窗口,aws保持lambda实例环境活着。 但是将其作为序列化版本加载可能还需要一些时间。

我想在同一个“会话”期间为后续请求保留内存结构本身。 如果它可以用于该窗口中的后续请求,那么为每个“会话”重建图形将不会成为问题。

你如何解决这个问题,以便在一个需要时间来构建的永不改变的结构上工作?

或许我完全错过了什么?

编辑: 好的,我发现你可以将图形的构造放入初始化并将其存储在变量中。这解决了如何将图形重用于对同一容器的后续请求的问题。

但更大的问题仍然存在,是否有可能重复使用永远不会改变(也称为无静态)数据结构的内存?

我不确定这个问题是否适合stackoverflow,因为严格来说,它不是关于编程。但它绝对不是服务器(serverfault)。

1 个答案:

答案 0 :(得分:0)

由于它是静态图形,您可以预先计算所有路径并以适当的数据格式存储它们。然后Lambda可以使用简单的查找方法来获取预先计算的路径。这种格式的确切外观可能会有所不同,并且根据图表的大小,存储方法也可能会有所不同,请参阅下面的示例。

对于基于文件的存储,您可以使用JSON作为键/值。键包含起始和结束顶点,值是中间顶点列表。如果顶点未连接,则没有相应的键,例如

{
  "AB": ["C", "D", "E"],
  "AC": [], // empty list indicates a direct connection
  "AD": ["C"], 
  "AD": ["C", "D"],
  "BA": ["E", "D", "C"],
  // etc
}

如果您想知道从AB的路径,您只需生成密钥AB,路径将为CDE

您还可以使用嵌套的JSON格式:

{
  "A": {
      "B": ["C", "D", "E"],
      "C": [], // empty list indicates that there is a direct connection between A and C
      "D": ["C"],
      "E": ["C", "D"]
  },
  "B": {
      "A": ["E", "D", "C"]
      // etc
  }
  // etc
}

在这里,您可以通过查找值A找到从BA.B的路径。

对于大型图形/数据集,DynamoDB可能是AWS堆栈上的一个合适选项。建模的一种方法可能是使用composite primary key,其中起始顶点可以是主键,而结束顶点是排序键。然后路径可以是带有中间顶点的字符串列表,如文件示例所示。