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

2.7版本计划 #680

Closed
areyouok opened this issue Jul 8, 2022 · 7 comments
Closed

2.7版本计划 #680

areyouok opened this issue Jul 8, 2022 · 7 comments

Comments

@areyouok
Copy link
Collaborator

areyouok commented Jul 8, 2022

jetcache2.6以后我觉得已经比较完善,一度疏于维护。现在,根据最近两年积攒的问题,准备升级一波。

预计有以下修改:

  • 两级缓存的情况下,如果一台服务器更新了缓存,会去刷新其它服务器的本地缓存。通过redis pub/sub来实现(jedis已经实现,其它的开发中)。
  • 内置json序列化、反序列化器。其实这个最早是有的,但是后来因为兼容和安全的原因去掉了,丢给了用户自己实现,其实jetcache定制encoder/decoder非常简单,不过确实有很多人不会。
  • 废弃CreateCache注解,并提供替代方式。CreateCache的问题是不能提供全功能配置,而且实现方式过于hack,总担心哪天spring升级它又不能用了。如果使用CacheAPI,又比较麻烦,需要各种设置。所以新的方式应该基当前的项目cache配置模板,然后通过api来组装。
  • 可能会提供集中化的缓存配置文件。现在CreateCache和Cached都可以定义缓存,如果两个注解(相同的area和name)定义不一样,按什么方式创建Cache实例是不能确定的。集中的配置文件还有个好处,可以统一管理,适合大型项目,与之相反,散落在各个java文件里面的注解,不利于评估整个项目的缓存使用情况。
  • 类库升级和一些不兼容升级,fastjson会升级到fastjson2,详见兼容性说明(更新中)

一些设计原则:jetcache最强的能力来自CacheAPI,注解只是提供一个方便,满足大部分场景即可。一些复杂的需求应该用CacheAPI来实现,以前通过CreateCache注解可以获取Cache实例(以后会提供更好的方式)。所以,如果需要对注解那一套机制进行复杂的修改来实现什么功能,我觉得不是好的实践,很可能是不会做的(我自己现在也特别讨厌spring)。

时间上,预计就在这个月,会加速开发。2.7版本发布以后,我会发起全新的项目并将主要精力投入其中(过些天我会在个人仓库下创建这个新项目),之后jetcache暂时不会再开发大的特性。

2022年7月8日

@areyouok areyouok pinned this issue Jul 8, 2022
@herodotus-ecosystem
Copy link

第二点很需要啊。使用 @CreateCache 虽然方便,但确实不够灵活,特别是想要通过代码的方式动态创建Cache的时候。虽然有builder方式,但是这种方式所有的配置都要自己手动重新设置一遍。我现在是临时通过注入 SpringConfigProvider ,调用CacheContext().__createOrGetCache的方式解决。非常期待大佬的新版本。

另外:如果还要延续使用 Kyro,建议升级 Kyro的版本。Spring Boot 3 马上就要来了,Kyro 低版本在 JDK 17下有问题。使用最新版本 的Kyro,需要对KryoValueEncoder进行一定的修改,Jetcache 才能在 JDK 17下运行。

public class KryoValueEncoder extends AbstractValueEncoder {

    public static final KryoValueEncoder INSTANCE = new KryoValueEncoder(true);

    protected static int IDENTITY_NUMBER = 0x4A953A82;

    private static int INIT_BUFFER_SIZE = 512;

    static ThreadLocal<Object[]> kryoThreadLocal = ThreadLocal.withInitial(() -> {
        Kryo kryo = new Kryo();
        kryo.setDefaultSerializer(CompatibleFieldSerializer.class);
        kryo.setRegistrationRequired(false);
        kryo.register(AtomicInteger.class, new AtomicIntegerSerializer());
        kryo.setReferences(true);
//        kryo.setInstantiatorStrategy(new StdInstantiatorStrategy());
//        kryo.setInstantiatorStrategy(new Kryo.DefaultInstantiatorStrategy(new StdInstantiatorStrategy()));

@areyouok
Copy link
Collaborator Author

kryo4和kryo5互不兼容,都会支持的。

@areyouok
Copy link
Collaborator Author

fastjson2的序列化器已经完成。

json不是专门的java序列化工具,无论用用哪个json类库,兼容性问题都很多。java中反序列化特别容易导致严重的安全问题,而json字符串通常又是从不受信任的前端传进来的,导致json类库安全漏洞特别多,为了修这些漏洞,各个json类库都变得特别保守,比如只要类型不确定,就序列化为一个JsonObject,而不是序列化时的那个java对象。在jetcache里面,会导致反序列化的时候出现各种问题。

综上考虑,2.7代码里面虽包含fastjson2的Encoder/Decoder实现,但默认不注册任何json序列化器。如果有人需要用,自己搞定注册事宜(要是搞不定这个你也搞不定反序列化时出现的各种问题,也就没必要用了)。

@areyouok
Copy link
Collaborator Author

areyouok commented Aug 5, 2022

2.7.0.RC,已发布,升级参考兼容性说明文档:

https://github.com/alibaba/jetcache/blob/master/docs/CN/Compatibility.md

@herodotus-ecosystem
Copy link

大佬,咨询个问题。 syncLocal 配置是不是无法通过yml配置进行统一设置?只能手动在QuickConfig里面设置么?

@areyouok
Copy link
Collaborator Author

areyouok commented Aug 9, 2022

默认是关闭的,手工显式开启比较好,以免更新比较多的情况下产生广播风暴把系统打挂了。

@herodotus-ecosystem
Copy link

默认是关闭的,手工显式开启比较好,以免更新比较多的情况下产生广播风暴把系统打挂了。

明白了,感谢!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants