【问题标题】:WSO2 API Manager slow SQL query on Store rest API causing bad UI performanceWSO2 API Manager 对 Store rest API 的 SQL 查询慢,导致 UI 性能不佳
【发布时间】:2018-07-20 09:48:57
【问题描述】:

部署如下:

  • Mgr 节点:默认(Store+Pub),Gateway-Manager。

  • 工作节点:GW-Workers、Key-Managers


我们使用 MySQL NDB 作为我们的 API Manager 数据库。在 Store UI 上观察到非常慢的 API 加载时间。使用 Chrome 开发工具,我看到当一个 API 被点击打开(使用登录会话)时会调用以下 API:

http://{host/port}/store/apis/info?name={api-name}&version={v}&provider={provider}

手动调用 API(包括 cookie)在我们的负载平衡器上超时 (504)。 查看 Store Jaggery 文件,我发现它似乎调用的 API (../repository/deplyement/server/jaggeryapps/store/modules/api/api.jag),但是我无法将其与实际的 API Impl 联系起来.使用常识,我认为需要从数据库中检索 API 和相关的元数据。

启用慢查询日志(25 秒)会产生以下查询,当我尝试打开 API 时会记录该查询:

SELECT
  ICA.CONSUMER_KEY AS CONSUMER_KEY,
  ICA.CONSUMER_SECRET AS CONSUMER_SECRET,
  IAT.ACCESS_TOKEN AS ACCESS_TOKEN,
  IAT.VALIDITY_PERIOD AS VALIDITY_PERIOD,
  ISAT.TOKEN_SCOPE AS TOKEN_SCOPE,
  AKM.KEY_TYPE AS TOKEN_TYPE,
  AKM.STATE AS STATE
FROM
  AM_APPLICATION_KEY_MAPPING AKM,
  IDN_OAUTH2_ACCESS_TOKEN IAT,
  IDN_OAUTH2_ACCESS_TOKEN_SCOPE ISAT,
  IDN_OAUTH_CONSUMER_APPS ICA
WHERE AKM.APPLICATION_ID = 149
  AND IAT.USER_TYPE = 'APPLICATION'
  AND ICA.CONSUMER_KEY = AKM.CONSUMER_KEY
  AND IAT.CONSUMER_KEY_ID = ICA.ID
  AND IAT.TOKEN_ID = ISAT.TOKEN_ID
  AND AKM.KEY_TYPE = 'PRODUCTION'
  AND (
    IAT.TOKEN_STATE = 'ACTIVE'
    OR IAT.TOKEN_STATE = 'EXPIRED'
    OR IAT.TOKEN_STATE = 'REVOKED'
  )
ORDER BY IAT.TIME_CREATED DESC;

此查询平均执行 80 秒,返回大约 33000 行。该查询写得很糟糕,因为没有连接,并且它的以下优化版本在

SELECT
  `api_am_dev_1`.`ICA`.`CONSUMER_KEY` AS `CONSUMER_KEY`,
  `api_am_dev_1`.`ICA`.`CONSUMER_SECRET` AS `CONSUMER_SECRET`,
  `api_am_dev_1`.`IAT`.`ACCESS_TOKEN` AS `ACCESS_TOKEN`,
  `api_am_dev_1`.`IAT`.`VALIDITY_PERIOD` AS `VALIDITY_PERIOD`,
  `api_am_dev_1`.`ISAT`.`TOKEN_SCOPE` AS `TOKEN_SCOPE`,
  `api_am_dev_1`.`AKM`.`KEY_TYPE` AS `TOKEN_TYPE`,
  `api_am_dev_1`.`AKM`.`STATE` AS `STATE`
FROM
  `api_am_dev_1`.`AM_APPLICATION_KEY_MAPPING` `AKM`
  JOIN `api_am_dev_1`.`IDN_OAUTH2_ACCESS_TOKEN` `IAT`
  JOIN `api_am_dev_1`.`IDN_OAUTH2_ACCESS_TOKEN_SCOPE` `ISAT`
  JOIN `api_am_dev_1`.`IDN_OAUTH_CONSUMER_APPS` `ICA`
WHERE (
    (
      `api_am_dev_1`.`AKM`.`KEY_TYPE` = 'PRODUCTION'
    )
    AND (
      `api_am_dev_1`.`ISAT`.`TOKEN_ID` = `api_am_dev_1`.`IAT`.`TOKEN_ID`
    )
    AND (
      `api_am_dev_1`.`IAT`.`CONSUMER_KEY_ID` = `api_am_dev_1`.`ICA`.`ID`
    )
    AND (
      `api_am_dev_1`.`ICA`.`CONSUMER_KEY` = `api_am_dev_1`.`AKM`.`CONSUMER_KEY`
    )
    AND (
      `api_am_dev_1`.`IAT`.`USER_TYPE` = 'APPLICATION'
    )
    AND (
      `api_am_dev_1`.`AKM`.`APPLICATION_ID` = 149
    )
    AND (
      (
        `api_am_dev_1`.`IAT`.`TOKEN_STATE` = 'ACTIVE'
      )
      OR (
        `api_am_dev_1`.`IAT`.`TOKEN_STATE` = 'EXPIRED'
      )
      OR (
        `api_am_dev_1`.`IAT`.`TOKEN_STATE` = 'REVOKED'
      )
    )
  )
ORDER BY `api_am_dev_1`.`IAT`.`TIME_CREATED` DESC

添加索引似乎对解决问题没有帮助。我们每周都会进行一次令牌清理,因此数据库中总共只有大约 20 000 个令牌 ~ 我们的 QA 非常忙。

问题:查询是由 Hibernate 生成的,是创建补丁的唯一选项吗?

WSO2 商店是一个很棒的开发者门户,但这破坏了我们许多用户的体验。

编辑:

API 管理器版本 = 2.1.0

【问题讨论】:

    标签: mysql sql wso2-am


    【解决方案1】:

    答案是否定的,查询不是由 hibernate 或任何其他抽象框架生成的。所有查询都作为字符串常量存储在 java 类文件中,所以是的,如果您发现需要更改底层查询,则必须更改查询并构建补丁。

    我们遇到了同样的问题,但添加以下索引可显着提高单击 API 检索其信息时的商店性能:
    数据库:apimgt
    表:IDN_OAUTH2_ACCESS_TOKEN
    列:USER_TYPE、CONSUMER_KEY_ID、TOKEN_ID、TOKEN_STATE

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多