Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

删除namespace之后,客户端感知不到namespace的变化,导致的配置残留 #4006

Closed
diwenzheng opened this issue Sep 29, 2021 · 17 comments
Labels
area/client apollo-client kind/report-problem Categorizes issue when someone report the problem he/she meeted status/fixed issue fixed already

Comments

@diwenzheng
Copy link

@nobodyiam

@diwenzheng
Copy link
Author

diwenzheng commented Sep 29, 2021

因为我们可能删除一个namespace,但是apollo-openapi并没有这块的接口,所以自己通过网页登录方式删除的namespace,但这会导致configService里面缓存了不该拥有的数据,这看起来是个问题啊。

@diwenzheng diwenzheng changed the title 为什么我删除了namespace的数据,还能通过ConfigService获取到? 删除namespace之后,客户端感知不到namespace的变化,导致的配置残留 Sep 29, 2021
@diwenzheng
Copy link
Author

这时候我该如何通知客户端重新读取apollo数据,而不走缓存map了.

@diwenzheng
Copy link
Author

image
image
实际上apollo已经没有了,这难道只能reset了?

@nobodyiam
Copy link
Member

删除接口我记得会发出 release message,config service 收到通知后会告诉客户端重新获取配置的

@diwenzheng
Copy link
Author

这种是删除应用
image
而且ConfigService 你们设计的的安全性太好了- - 无法反射调自行删除cache

@diwenzheng
Copy link
Author

我们在删除配置后会等待15S左右,这看起来这并不会发起release message,当然你可以告诉我 自行在客户端如何触发这个函数。

@diwenzheng
Copy link
Author

@nobodyiam

@diwenzheng
Copy link
Author

我们这里的配置比较特殊需要删除这块的namespace,所以发现缓存的问题,这种在客户端测有办法使用什么方式删除掉cache吗。我觉得 是不是应该对外给开发者去管理缓存 这样 会不会更灵活。

@nobodyiam
Copy link
Member

看了下代码并做了下测试,删除 app 时会发出 release message 的,所以 config service 的 cache 是会被清空的,不过 apollo-client 在收到通知像 config service 发起请求该 namespace 会拿到 404 的响应,所以在本地不会更新内存中的配置。
这个行为是符合预期的,所以建议确保没有客户端在读取该应用的配置再删除 app。
如果你确实有这个场景需要,可以考虑通过 ApolloInjectorCustomizer( #3602 ),定制一下 RemoteConfigRepository 的逻辑。

//Publish release message to do some clean up in config service, such as updating the cache
messageSender.sendMessage(ReleaseMessageKeyGenerator.generate(appId, clusterName, namespaceName),
Topics.APOLLO_RELEASE_TOPIC);

@diwenzheng
Copy link
Author

diwenzheng commented Oct 9, 2021

我的版本是1.5.1 并没有看到 ApolloInjectorCustomizer 类啊 且如果apollo的版本是1.5.1,尝试使用新的apollo-client组件会有问题吗? @nobodyiam

@nobodyiam
Copy link
Member

@diwenzheng 1.9.1 最新版本包含这个 feature,可以考虑升下级~

@diwenzheng
Copy link
Author

diwenzheng commented Oct 11, 2021

@nobodyiam 看起来 有一定的并要升级版本了, 很久没关注社区了,1.9.0解决了session的问题。 关于你说的ApolloInjectorCustomizer,我看仅仅是一个获取内部单例的方法,这能解决我这个缓存的问题吗。能提供一下具体的思路吗.而且我看1.5.1 也有这个injector接口,看着貌似只要在resources目录下更改路径名就可以使用自己自定义的injector,当然唯一的区别就是order

@diwenzheng
Copy link
Author

diwenzheng commented Oct 11, 2021

我猜测 是否 需要
image
在这里修改configmanager 的接口 ?如果是这样子,看起来似乎并没有必要因为缓存问题升级版本

@diwenzheng
Copy link
Author

diwenzheng commented Oct 11, 2021

尝试自定义成功删除掉configmanager里的cache 但是
image
又获取到了 我已经删除的数据 还有一处是因为尝试从apollo获取,但是失败了,从本地的文件中把数据读入了.... 额- -

@diwenzheng
Copy link
Author

diwenzheng commented Oct 11, 2021

建议后续 能否提供一套便于开发者管理cache的管理器. 现在cache的管理每个处理类都包含一定的cache,建议搞一个cachemanager 管理所有的缓存,亦或者将各个cache抽象成接口,供cachemanage管理.不然代码我个人觉得还是太凌乱了

@diwenzheng
Copy link
Author

我的问题 已经解决。这个并不用升级版本就可以完成。当然建议最好能重构一下cache这块的逻辑.

@Anilople Anilople added area/client apollo-client kind/report-problem Categorizes issue when someone report the problem he/she meeted status/fixed issue fixed already labels Oct 11, 2021
@nobodyiam
Copy link
Member

通过 ApolloInjectorCustomizer 可以自定义 ConfigFactory 的逻辑,从而在创建 DefaultConfig 时可以注入自定义的 config repository。
不过你提到的 cache 这块确实没有特别考虑过统一管理,所以自定义逻辑会稍显凌乱一些。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area/client apollo-client kind/report-problem Categorizes issue when someone report the problem he/she meeted status/fixed issue fixed already
Projects
None yet
Development

No branches or pull requests

3 participants