fix(workflow-engine-*): Cleanup expired executions and reduce redis storage usage (#12795)
This commit is contained in:
committed by
GitHub
parent
c0807f5496
commit
316a325b63
@@ -87,6 +87,7 @@ const AnySubscriber = "any"
|
||||
export class WorkflowOrchestratorService {
|
||||
private subscribers: Subscribers = new Map()
|
||||
private container_: MedusaContainer
|
||||
private inMemoryDistributedTransactionStorage_: InMemoryDistributedTransactionStorage
|
||||
|
||||
constructor({
|
||||
inMemoryDistributedTransactionStorage,
|
||||
@@ -97,11 +98,21 @@ export class WorkflowOrchestratorService {
|
||||
sharedContainer: MedusaContainer
|
||||
}) {
|
||||
this.container_ = sharedContainer
|
||||
this.inMemoryDistributedTransactionStorage_ =
|
||||
inMemoryDistributedTransactionStorage
|
||||
inMemoryDistributedTransactionStorage.setWorkflowOrchestratorService(this)
|
||||
DistributedTransaction.setStorage(inMemoryDistributedTransactionStorage)
|
||||
WorkflowScheduler.setStorage(inMemoryDistributedTransactionStorage)
|
||||
}
|
||||
|
||||
async onApplicationStart() {
|
||||
await this.inMemoryDistributedTransactionStorage_.onApplicationStart()
|
||||
}
|
||||
|
||||
async onApplicationShutdown() {
|
||||
await this.inMemoryDistributedTransactionStorage_.onApplicationShutdown()
|
||||
}
|
||||
|
||||
private async triggerParentStep(transaction, result) {
|
||||
const metadata = transaction.flow.metadata
|
||||
const { parentStepIdempotencyKey } = metadata ?? {}
|
||||
|
||||
@@ -43,7 +43,6 @@ export class WorkflowsModuleService<
|
||||
protected workflowExecutionService_: ModulesSdkTypes.IMedusaInternalService<TWorkflowExecution>
|
||||
protected workflowOrchestratorService_: WorkflowOrchestratorService
|
||||
protected manager_: SqlEntityManager
|
||||
private clearTimeout_: NodeJS.Timeout
|
||||
|
||||
constructor(
|
||||
{
|
||||
@@ -65,16 +64,10 @@ export class WorkflowsModuleService<
|
||||
|
||||
__hooks = {
|
||||
onApplicationStart: async () => {
|
||||
await this.clearExpiredExecutions()
|
||||
|
||||
this.clearTimeout_ = setInterval(async () => {
|
||||
try {
|
||||
await this.clearExpiredExecutions()
|
||||
} catch {}
|
||||
}, 1000 * 60 * 60)
|
||||
await this.workflowOrchestratorService_.onApplicationStart()
|
||||
},
|
||||
onApplicationShutdown: async () => {
|
||||
clearInterval(this.clearTimeout_)
|
||||
await this.workflowOrchestratorService_.onApplicationShutdown()
|
||||
},
|
||||
}
|
||||
|
||||
@@ -289,14 +282,6 @@ export class WorkflowsModuleService<
|
||||
return this.workflowOrchestratorService_.unsubscribe(args as any)
|
||||
}
|
||||
|
||||
private async clearExpiredExecutions() {
|
||||
return this.manager_.execute(`
|
||||
DELETE FROM workflow_execution
|
||||
WHERE retention_time IS NOT NULL AND
|
||||
updated_at <= (CURRENT_TIMESTAMP - INTERVAL '1 second' * retention_time);
|
||||
`)
|
||||
}
|
||||
|
||||
@InjectSharedContext()
|
||||
async cancel<TWorkflow extends string | ReturnWorkflow<any, any, any>>(
|
||||
workflowIdOrWorkflow: TWorkflow,
|
||||
|
||||
Reference in New Issue
Block a user