-
-
Notifications
You must be signed in to change notification settings - Fork 10.2k
Open
Labels
Description
描述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端增加空格检测,抛异常提示用户