
获得徽章 0
赞了这篇文章
赞了这篇文章
惊闻 Skywalking 居然实现了动态配置,可喜可贺。
我半年前就实现了。而且是全配置参数,不像 Skywalking 只支持动态采样率。
说起动态采样率,我们还支持了采样率隔离,更精准地配置采样率。而且链路名称采样和采样数可以一块用。
说起采样,我们还做到了采样数之外的链路,依旧可以正常创建和传递。
除此之外我们真正解决了跨线程的链路问题,还有其他很多很多。。
SK 每次迭代有用的新特性,都是我做过的。我做过的,SK 再过半年也追不上…
我半年前就实现了。而且是全配置参数,不像 Skywalking 只支持动态采样率。
说起动态采样率,我们还支持了采样率隔离,更精准地配置采样率。而且链路名称采样和采样数可以一块用。
说起采样,我们还做到了采样数之外的链路,依旧可以正常创建和传递。
除此之外我们真正解决了跨线程的链路问题,还有其他很多很多。。
SK 每次迭代有用的新特性,都是我做过的。我做过的,SK 再过半年也追不上…
展开
4
1
我看 Apache 现在也不挑了,啥都接啥都能毕业。我看 Skywalking 和 ShardingSphere 就是一坨屎。不怕得罪这些写烂代码的人,写得又烂又不愿意承认。
代码本身并不烂,但很多设计和理念是烂的,真正用的时候发现像一坨屎一样烂泥扶不上墙。就这,Skywalking 还整天说这个抄袭它那个没遵守协议。
非常不客气地说,现在我司用的改过的 Skywalking 是最接近完美的版本。腾讯云的那个版本我也看了,基本就是原生的 SW,很简陋,跟我司的版本还差得远,但起码比 SW 做到了开箱即用。
代码本身并不烂,但很多设计和理念是烂的,真正用的时候发现像一坨屎一样烂泥扶不上墙。就这,Skywalking 还整天说这个抄袭它那个没遵守协议。
非常不客气地说,现在我司用的改过的 Skywalking 是最接近完美的版本。腾讯云的那个版本我也看了,基本就是原生的 SW,很简陋,跟我司的版本还差得远,但起码比 SW 做到了开箱即用。
展开
11
点赞
放弃用 Redissan 自旋锁。
互联网大部分场景下的分布式锁,都是不需要自旋的,是获取不到锁需要马上失败的。
而不理解 Redisson 锁原理的,会经常滥用它,导致表单重复提交得到了处理、至多执行一次的任务被反复执行等问题。
Redisson 锁可以近似理解成 Java 本身的锁或同步语句块,而实际上它也是实现了 Lock 接口。使用之前需要考虑清楚,这段代码确实要在分布式下同步执行?
互联网大部分场景下的分布式锁,都是不需要自旋的,是获取不到锁需要马上失败的。
而不理解 Redisson 锁原理的,会经常滥用它,导致表单重复提交得到了处理、至多执行一次的任务被反复执行等问题。
Redisson 锁可以近似理解成 Java 本身的锁或同步语句块,而实际上它也是实现了 Lock 接口。使用之前需要考虑清楚,这段代码确实要在分布式下同步执行?
展开
2
2
关于优雅停机,这是个看似简单,但实际应用中有很多细节需要考虑的功能。
大部分优雅停机只是实现了停掉 Tomcat 容器,停掉 Dubbo 服务,但实际上要停掉的可能不止这些。
比如用 @Scheduled 开启了定时任务,如果停机的时候恰好在执行任务怎么办?Elastic Job 实现的分布式任务同理。
比如 Kafka 或者用 Redis 实现的消费队列,消费到一半怎么办?
比如 Spring Cloud 这时有新的请求进来了怎么办,大部分上线脚本中,只会帮你把 Nginx 摘掉流量,但 Spring Cloud 这种流量没法帮你摘掉。等于流量没摘干净。
再比如 @Async 启动的异步线程池,Spring Event 异步事件线程池等,是不是要等待执行完成?
凡此种种。而且要做到关闭资源的先后顺序,比如不能停掉定时任务前关闭数据库资源。
只有做到彻底把项目变成没有代码运行的,与外界失联的孤岛,才真正是「优雅停机」的追求。
我们的实现可供参考:启动一个哨兵线程,哨兵中有可重入读写锁,在需要保护的任务前获取读锁,try/finally 中释放读锁。
哨兵线程监听 signal 信号,捕捉到信号后开始停机流程。第一步获取写锁,写锁会等待所有读锁释放。写锁成功取得后,开始关闭异步线程池、主动在 Eureka 下线(如果是 Spring Cloud),关掉 Dubbo 容器,关掉 Kafka 线程池。最后调用 Spring 容器的 shutdown,由 Spring 再去回收 bean 和资源关闭。
如果有更好的实现或建议,欢迎讨论。
大部分优雅停机只是实现了停掉 Tomcat 容器,停掉 Dubbo 服务,但实际上要停掉的可能不止这些。
比如用 @Scheduled 开启了定时任务,如果停机的时候恰好在执行任务怎么办?Elastic Job 实现的分布式任务同理。
比如 Kafka 或者用 Redis 实现的消费队列,消费到一半怎么办?
比如 Spring Cloud 这时有新的请求进来了怎么办,大部分上线脚本中,只会帮你把 Nginx 摘掉流量,但 Spring Cloud 这种流量没法帮你摘掉。等于流量没摘干净。
再比如 @Async 启动的异步线程池,Spring Event 异步事件线程池等,是不是要等待执行完成?
凡此种种。而且要做到关闭资源的先后顺序,比如不能停掉定时任务前关闭数据库资源。
只有做到彻底把项目变成没有代码运行的,与外界失联的孤岛,才真正是「优雅停机」的追求。
我们的实现可供参考:启动一个哨兵线程,哨兵中有可重入读写锁,在需要保护的任务前获取读锁,try/finally 中释放读锁。
哨兵线程监听 signal 信号,捕捉到信号后开始停机流程。第一步获取写锁,写锁会等待所有读锁释放。写锁成功取得后,开始关闭异步线程池、主动在 Eureka 下线(如果是 Spring Cloud),关掉 Dubbo 容器,关掉 Kafka 线程池。最后调用 Spring 容器的 shutdown,由 Spring 再去回收 bean 和资源关闭。
如果有更好的实现或建议,欢迎讨论。
展开
1
4
赞了这篇文章
赞了这篇文章