feat: Use postgres as a queue

We've been keen to try this for a while as it means we can remove redis as a
dependency, which makes Immich easier to setup and run.

This replaces bullmq with a bespoke postgres queue. Jobs in the queue are
processed either immediately via triggers and notifications, or eventually if a
notification is missed.
This commit is contained in:
Thomas Way
2025-04-30 20:43:51 +01:00
parent b845184c80
commit 8c0c8a8d0e
46 changed files with 731 additions and 915 deletions

View File

@@ -9621,7 +9621,7 @@
"start",
"pause",
"resume",
"empty",
"clear",
"clear-failed"
],
"type": "string"
@@ -9649,28 +9649,20 @@
"active": {
"type": "integer"
},
"completed": {
"type": "integer"
},
"delayed": {
"type": "integer"
},
"failed": {
"type": "integer"
},
"paused": {
"type": "integer"
},
"waiting": {
"type": "integer"
}
},
"required": [
"active",
"completed",
"delayed",
"failed",
"paused",
"waiting"
],
"type": "object"
@@ -11007,16 +10999,12 @@
},
"QueueStatusDto": {
"properties": {
"isActive": {
"type": "boolean"
},
"isPaused": {
"paused": {
"type": "boolean"
}
},
"required": [
"isActive",
"isPaused"
"paused"
],
"type": "object"
},

View File

@@ -577,15 +577,12 @@ export type FaceDto = {
};
export type JobCountsDto = {
active: number;
completed: number;
delayed: number;
failed: number;
paused: number;
waiting: number;
};
export type QueueStatusDto = {
isActive: boolean;
isPaused: boolean;
paused: boolean;
};
export type JobStatusDto = {
jobCounts: JobCountsDto;
@@ -3673,7 +3670,7 @@ export enum JobCommand {
Start = "start",
Pause = "pause",
Resume = "resume",
Empty = "empty",
Clear = "clear",
ClearFailed = "clear-failed"
}
export enum MemoryType {