碎碎念
编程语言
最近学习了 dart,发现 dart 对访问权限的控制是使用命名前缀,感觉这就像某些软件只有图标,旁边没有文字说明(甚至悬浮在按钮上也没有,尤其是手机)。如果需要更细的权限控制以后还要加入更多的符号,对其他语言过来的开发者来说就是灾难,夸张地说一行代码看起来还以为是正则表达式。
再吐个槽:第一次在电脑打开微信小程序,半个小时后才找到关闭按钮
Java 虚拟线程和响应式编程
Java21 虚拟线程正式发布了,在 Java21 上响应式编程应该可以退役了。我对虚拟线程和响应式编程的原理并不了解,以下仅仅是我的猜测,不考虑具体的细节:
- 响应式编程:java 响应式编程是对 JDK 的妥协,Java 线程是绑定的系统线程,不能无限创建(并且上下文切换也很慢),并且运行时这个任务会占用这个线程,仅能进行 CPU 调度,我们想用一个线程来实现如果发生阻塞就让则个线程运行其他任务,而 Java Socket 通过 Selector 支持 NIO,这就给了上层应用一个接口来实现这个功能,即 EventLoop,一个 boss 线程做调度,多个 worker 线程运行任务,但使用这些上层应用带来 EventLoop 会导致很多的回调(因为 worker 不知道什么时候会发生阻塞,需要你通过注册阻塞操作的回调来避免),这样代码可读性会降低。
- 虚拟线程:java21 应该是将 EventLoop 调度放在了 JDK 层面,而 Java 线程是可以判断是否发生了阻塞调用的(虽然此时线程状态还是 Running),将这两点组合一下就实现了虚拟线程,好处是阻塞不需要用户判断了,这样使用者就无需写一堆回调,可以用同步的方式写代码了,非常 nice。
一些思考:
- Socket NIO 会有什么变化吗?比如 Netty?(感觉不会变化,响应式性能不会弱于虚拟线程)
- Scoped values 正式发布的话 Spring Framework tx 这种大量使用了 ThreadLocal 的库会跟进吗?以及怎么维护?
- Spring WebMVC RestTemplate 只是维护状态,推荐使用 Spring WebFlux WebClient,那么以后会是什么样呢?
- 为了业务之间隔离,不同业务通常使用单独的线程池,而虚拟线程出来就不需要了,但任务队列这个内存问题怎么解决呢?响应式编程是用背压这个概念解决的
Java 部署
把整个 jar 用 dockerfile 打包运行的方式对网络太不友好了,一个我认为的理想状态:每次只打包和传输原始包(非全量包),其他依赖的包都放在机器的 maven 本地仓库上,运行时解析原始包的 pom.xml,把依赖包的路径添加到 classpath 上来启动。这样的话网络压力小了,包小了,存储占用小了,部署终于能快了