开发者社区> 问答> 正文

选择为memory调度模式,出现同步异常后会挂住不再做同步

同步过程中因为出现内存不足,出现miss data异常,触发了otter进行rollback操作.

在同步日志中出现: [pipelineId = 1,taskName = ProcessSelect] WARN com.alibaba.otter.node.etl.select.SelectTask - rollback happend , should skip this data and get new message.

然后几个程序就处于一个业务死锁状态.

ProcessSelect一直在等待rollback动作完成

"pipelineId = 1,taskName = ProcessSelect" prio=10 tid=0x00007f9cac08c000 nid=0x4240 waiting on condition [0x00007f9cdc7ba000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x00000000a1a95ba0> (a com.alibaba.otter.shared.common.utils.lock.BooleanMutex$Sync) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156) at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:811) at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:969) at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1281) at com.alibaba.otter.shared.common.utils.lock.BooleanMutex$Sync.innerGet(BooleanMutex.java:139) at com.alibaba.otter.shared.common.utils.lock.BooleanMutex.get(BooleanMutex.java:69) at com.alibaba.otter.node.etl.select.SelectTask.processSelect(SelectTask.java:265) at com.alibaba.otter.node.etl.select.SelectTask.access$300(SelectTask.java:94)

而ProcessTermin一直在等待termin信号,完成rollback的处理. 所以一个怀疑,就是termin信号丢了.

原提问者GitHub用户 agapple

展开
收起
大圣东游 2023-06-21 17:28:42 77 0
3 条回答
写回答
取消 提交回答
  • 根据您提供的信息,可能是因为同步过程中内存不足,导致出现 miss data 异常,随后 Otter 触发了 rollback 操作。在 rollback 过程中,可能因为某些原因导致部分线程处于等待状态,从而形成业务死锁。

    对于这种情况,建议您检查 Otter 和数据库的配置,确保其满足系统需求。其中,内存大小,线程池大小等因素都可能会影响同步效率和可靠性。同时,确保系统和数据库的稳定性和可靠性也非常重要。

    此外,为了避免类似问题,可以考虑使用控制台界面监控同步状态,及时发现并解决同步异常。另外,在上线新的同步任务前,可以先进行测试验证,确保同步任务的可靠性和稳定性。

    2023-06-23 14:31:57
    赞同 展开评论 打赏
  • 主要代码问题,在处理rollback时,处理完后的termin信号未按照processId顺序进行添加,导致ProcessTermin发现顺序不对,直接丢弃取一下. (Memory的termin未实现peek/ack的模式,导致memory模式下一旦取出来不正确顺序的termin就会丢了),从而导致了业务死锁.

    原回答者GitHub用户agapple

    2023-06-21 18:28:10
    赞同 展开评论 打赏
  • 北京阿里云ACE会长

    应该是同步过程中出现了异常,导致otter进行了rollback操作,但是在rollback过程中出现了阻塞导致程序无法继续执行。

    针对这种情况,可以考虑以下几种解决方案:

    增加内存容量:可以考虑增加内存容量,从而避免内存不足导致的异常。

    调整同步模式:可以考虑调整同步模式,采用异步同步模式,从而避免同步过程中出现阻塞导致的问题。

    优化同步代码:可以考虑优化同步代码,减少同步过程中出现异常的概率,或者在出现异常时进行快速处理,避免阻塞导致程序无法继续执行。

    增加异常处理机制:可以考虑增加异常处理机制,比如在出现异常时及时进行告警或记录日志,从而及时发现和解决问题。

    2023-06-21 17:37:56
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载