首页 > 解决方案 > MarkLogic - 自定义休息 GET REST 服务的性能变化

问题描述

MarkLogic 版本 9.0-6.2

我有一个自定义的 rest GET 服务,它接受一个 ID(比如说 PolicyId)并返回一个文档(总是只返回一个文档)。在 PolicyId 上创建元素范围索引。我有 100 个不同的文档,每个 PolicyId 一个。

当我第一次使用 PolicyId 通过 SoapUI 工具调用服务时,我看到响应时间约为 2 秒,但从第二次调用开始(即使我尝试使用不同的 PolicyId),我看到响应时间约为 30毫秒。

现在,如果我关闭 SoapUI 工具并在 1 小时后重试上述步骤,我再次看到第一次调用的响应时间为 2 秒。

我试图了解 MarkLogic 中的行为及其与缓存的关系。为什么我第一次反应变慢?即使我提供不同的 PolicyId,如何从第二次开始获得更快的响应?有没有一种方法可以提高第一次调用本身的性能?对 REST API 的更好性能工具有什么建议吗?

任何输入都受到高度赞赏。

标签: marklogicmarklogic-9

解决方案


你提到你有一个元素范围索引PolicyId。元素范围索引非常快,因为它们是内存索引。如果该索引尚未在内存中,则需要将整个索引加载到内存中才能使用它。您的第一个查询可能会触发索引的加载(这需要时间),而后续请求会从已经加载的索引中受益。在一段时间不使用索引后,它可能会被换出以供其他内存使用者使用。

有没有一种方法可以提高第一次调用本身的性能?

根据您的描述,我认为您正在做这样的事情:

  fn.head(cts.search(cts.jsonPropertyRangeQuery("PolicyId", "=", policyId)))

对于这种查询,您不一定需要范围索引——您不需要处理不等式或类型敏感的查询。我会改为使用通用索引进行性能测试。

  fn.head(cts.search(cts.jsonPropertyValueQuery("PolicyId", policyId)))

我希望结果会在您的 2 秒到 30 毫秒之间返回,但变化可能较小。


推荐阅读