ds一些不易排查问题的总结

文章讨论了在DolphinScheduler中遇到的任务执行延迟和自动退出问题,可能是由于集群时间不统一或worker节点的OOM情况。解决方案包括减少worker并发量和避免在worker上执行资源密集型任务如datax。同时,提到了代码问题,包括switch分支交叉导致的运行结果错误和日志异常处理不成功,以及子流程选择失败后状态显示异常。

非代码问题

  • 任务没有设置延迟,但是会显示延时执行,(集群时间不统一)

  • 任务执行期间 自动把自己杀死了退出码137,且任务多是在worker 本地执行的任务(比如datax),137 无故退出要么是手动杀死,又或者是oom 了,这是因为datax 需要本地的资源执行, 当worker 并发量大的时候xmx和xms 不是一样的。导致任务资源膨胀起来之后oom 了。解决方案,减小worker 的并发量,或者将这些消耗本地资源的任务放到非worker 上执行

代码问题

  • switch 两个执行分支交叉导致运行结果不符合预期[https://github.com/apache/dolphinscheduler/pull/14563]
  • 日志如果有异常mask 不成功 [https://github.com/apache/dolphinscheduler/pull/14018]
  • 流程subprocess 选择失败结束,但是subprocess 节点一直事运行中的状态[https://github.com/apache/dolphinscheduler/pull/14170]
### DS 注解数据源不生效且无事务情况下的排查与解决方案 当遇到 `@DS` 数据源注解不生效的情况,即使不存在显式的 `@Transactional` 事务控制时,仍然可能存在一些潜在的原因影响数据源的正常切换。以下是详细的排查思路和可能的解决方案: #### 排查方向一:AOP 切面顺序问题 确保 AOP 的切面执行顺序正确。通常情况下,`@DS` 应该优先于其他任何操作被执行,以保证后续的操作能够基于正确的数据源进行。 ```java @Configuration @EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true) public class DataSourceConfig { // 配置多个数据源... } ``` #### 排查方向二:检查上下文中的默认数据源配置 确认 Spring 上下文中是否存在默认的数据源定义,并验证这些默认配置是否会干扰自定义的数据源选择逻辑[^1]。 #### 排查方向三:线程局部变量管理不当 由于动态数据源的选择依赖于线程局部变量(ThreadLocal),因此需要确保在整个请求链路中不会意外清除或覆盖此变量。特别是在异步调用场景下更需注意这一点[^2]。 #### 解决方案一:强制指定传播行为 即便没有显示声明事务,在某些框架内部也可能隐含地开启了读取型事务(readOnly)。此时可以通过设置特定的事务传播策略来规避这一现象: ```java @Service public class MyService { @DS("secondaryDataSource") @Transactional(propagation = Propagation.NOT_SUPPORTED) public void saveData(){ // 执行保存操作 } } ``` 通过将传播级别设为 `Propagation.NOT_SUPPORTED` 可以有效地阻止任何形式的事物启动,从而让 `@DS` 正常工作[^3]。 #### 解决方案二:调整 AOP 组件加载时机 对于那些由第三方库引入的自动装配组件,有时它们会在应用程序初始化阶段过早地注册自己的增强器(advisor), 这样就可能导致我们自己编写的针对 `@DS` 处理逻辑被忽略掉。为此可以在应用启动类里加入如下配置项: ```properties spring.aop.auto=true mybatis-plus.configuration.map-underscore-to-camel-case=true ``` 同时也可以考虑降低相关starter包版本号或者查阅官方文档寻找是否有针对性参数可调节此类行为[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值