假设
假设有几个模块
一,执行命令的S模块及其任务tS
二,业务模块V,存在两个子模块V1,V2,该模块无自己任务
三,业务模块T及其任务tT
四,业务模块VS,无任务
五,业务模块P,无任务
业务功能
对于业务模块V,由于V1,V2耦合性非常强,使用同样的操作锁semV
执行T的业务时需要调用V2的接口,会拿到V的操作锁,且执行时间较长
执行VS的某条命令会调用(或者同步通知模块P),业务P再同步或者异步通知关心该事件的模块(由关心该事件的模块来决定同步或者异步)
业务模块V中V1同步关心P的事件,V2异步关心P的事件
存在场景:
对于执行T的业务命令后,首先
1.在tS中执行命令,模块T讲动作加入任务tT中异步处理,则在该任务中调用V2的流程(约1~2mins)。
2.此时tS可以继续执行其他命令。执行业务VS的命令,则在tS中,VS同步通知P,P进行通知该事件,V1是同步关心,则先V2进行流程,但是由于semV由1.中任务tT持有,所以tS只好一直等待tT拿到的锁,直到tT将锁semV释放后才可以执行,则导致tS挂起,无法继续执行其他命令。
解决思路:
1.可见tT任务可以在后台执行,不影响tS的任务,对于VS可以自己进行一个tVS的任务,使得该任务在后台跑起,不影响tS的任务进行其他命令执行
2.优化V2,对于V2的业务可能可以进行一些优化,但是对于必须执行这么久的工作则无法继续进行,只可能对所有工作进行异步处理而非同步进行,当然要建立在保证时序的情况下。