Skip to content

config Service配置拉取接口,传递的namespace名称末端带有空格,导致拉取配置返回的配置不是最新的 #5435

@hezhaoye

Description

@hezhaoye

描述bug

在用户填写订阅的 namespace 名称时,末尾不小心多输入了一个空格,导致客户端拉取配置时返回的不是最新发布的配置,而是上一次的配置内容。

复现

通过如下步骤可以复现:

1、正常发布某个 namespace 的配置;
2、客户端订阅该 namespace 并发起配置拉取请求,此时返回的是最新配置;
3、管理端对该 namespace 再次修改配置并发布;
4、客户端再次触发拉取请求,返回的仍是上一次的配置内容。

原因

问题的根本原因在于用户提交的 namespace 名称尾部多了一个空格。虽然在 MySQL 查询中尾部空格默认会被忽略,因此配置查询本身能正常返回;但 Apollo config service 层启用了缓存机制,缓存的 key 是 严格匹配(包含空格) 的。

在第一次查询时,由于缓存中还不存在该(带空格的)namespace key,因此正常从数据库读取了最新配置并写入缓存。但当管理端发布新的配置后,缓存是根据去空格后的 namespace 更新的,因此带空格的 key 没有被同步更新,导致客户端继续拿到旧值。

优化建议
1、建议在 server 端对接收到的 namespace 名称进行 trim() 处理,去除首尾空格,以避免因用户误操作导致缓存命中异常,提升系统健壮性与容错能力。
2、获取在config service端增加空格检测,抛异常提示用户

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions