INTEGRITY Dokumentace

Zařazování úloh do fronty

Agents SDK poskytuje vestavěný systém front, který umožňuje plánovat úlohy pro asynchronní spuštění. To se hodí pro zpracování na pozadí, zpožděné operace a správu úloh, které nevyžadují okamžité spuštění.

Přehled

Systém front je zabudovaný do základní Agent třída. Úlohy se ukládají do tabulky SQLite a automaticky se zpracovávají v pořadí FIFO (First In, First Out).

QueueItem typ

type QueueItem<T> = {
	id: string; // Unique identifier for the queued task
	payload: T; // Data to pass to the callback function
	callback: keyof Agent; // Name of the method to call
	created_at: number; // Timestamp when the task was created
	retry?: RetryOptions; // Retry options for this task
};

Základní metody

queue()

Přidá úlohu do fronty pro pozdější spuštění.

async queue<T>(
  callback: keyof this,
  payload: T,
  options?: { retry?: RetryOptions }
): Promise<string>

Parametry:

Vrací: Jedinečné ID úlohy zařazené do fronty

Příklad:

class MyAgent extends Agent {
	async processEmail(data) {
		// Process the email
		console.log(`Processing email: ${data.subject}`);
	}

	async onMessage(message) {
		// Queue an email processing task
		const taskId = await this.queue("processEmail", {
			email: "[email protected]",
			subject: "Welcome!",
		});

		console.log(`Queued task with ID: ${taskId}`);
	}
}
class MyAgent extends Agent {
	async processEmail(data: { email: string; subject: string }) {
		// Process the email
		console.log(`Processing email: ${data.subject}`);
	}

	async onMessage(message: string) {
		// Queue an email processing task
		const taskId = await this.queue("processEmail", {
			email: "[email protected]",
			subject: "Welcome!",
		});

		console.log(`Queued task with ID: ${taskId}`);
	}
}

dequeue()

Odebere konkrétní úlohu z fronty podle ID. Tato metoda je synchronní.

dequeue(id: string): void

Parametry:

Příklad:

// Remove a specific task
agent.dequeue("abc123def");
// Remove a specific task
agent.dequeue("abc123def");

dequeueAll()

Odebere všechny úlohy z fronty. Tato metoda je synchronní.

dequeueAll(): void

Příklad:

// Clear the entire queue
agent.dequeueAll();
// Clear the entire queue
agent.dequeueAll();

dequeueAllByCallback()

Odebere všechny úlohy, které odpovídají konkrétní metodě callbacku. Tato metoda je synchronní.

dequeueAllByCallback(callback: string): void

Parametry:

Příklad:

// Remove all email processing tasks
agent.dequeueAllByCallback("processEmail");
// Remove all email processing tasks
agent.dequeueAllByCallback("processEmail");

getQueue()

Načte konkrétní zařazenou úlohu podle ID. Tato metoda je synchronní.

getQueue<T>(id: string): QueueItem<T> | undefined

Parametry:

Vrací: QueueItem s parsovaným payloadem nebo undefined pokud nebylo nalezeno

Payload se před vrácením automaticky parsuje z formátu JSON.

Příklad:

const task = agent.getQueue("abc123def");
if (task) {
	console.log(`Task callback: ${task.callback}`);
	console.log(`Task payload:`, task.payload);
}
const task = agent.getQueue("abc123def");
if (task) {
	console.log(`Task callback: ${task.callback}`);
	console.log(`Task payload:`, task.payload);
}

getQueues()

Načte všechny zařazené úlohy, jejichž payload odpovídá konkrétnímu páru klíč-hodnota. Tato metoda je synchronní.

getQueues<T>(key: string, value: string): QueueItem<T>[]

Parametry:

Vrací: Pole odpovídajících QueueItem objekty

Tato metoda načte všechny položky fronty a filtruje je v paměti: rozparsuje každý payload a ověří, zda zadaný klíč odpovídá hodnotě.

Příklad:

// Find all tasks for a specific user
const userTasks = agent.getQueues("userId", "12345");
// Find all tasks for a specific user
const userTasks = agent.getQueues("userId", "12345");

Jak funguje zpracování fronty

  1. Validace: Při volání queue(), metoda ověří, že daný callback existuje jako funkce agenta.
  2. Automatické zpracování: Po zařazení do fronty se systém automaticky pokusí frontu vyprázdnit.
  3. Pořadí FIFO: Úlohy se zpracovávají v pořadí, v jakém byly vytvořeny (created_at časové razítko).
  4. Zachování kontextu: Každá úloha zařazená do fronty běží se stejným kontextem agenta (připojení, požadavek, e-mail).
  5. Automatické odstranění z fronty: Úspěšně provedené úlohy se automaticky odstraní z fronty.
  6. Zpracování chyb: Pokud metoda callbacku v okamžiku spuštění neexistuje, zaznamená se chyba a úloha se přeskočí.
  7. Perzistence: Úlohy se ukládají do cf_agents_queues SQL tabulce a přežívají restart agenta.

Metody callbacku fronty

Při definování metod callbacků pro úlohy zařazené do fronty musí mít tuto signaturu:

async callbackMethod(payload: unknown, queueItem: QueueItem): Promise<void>

Příklad:

class MyAgent extends Agent {
	async sendNotification(payload, queueItem) {
		console.log(`Processing task ${queueItem.id}`);
		console.log(
			`Sending notification to user ${payload.userId}: ${payload.message}`,
		);

		// Your notification logic here
		await this.notificationService.send(payload.userId, payload.message);
	}

	async onUserSignup(userData) {
		// Queue a welcome notification
		await this.queue("sendNotification", {
			userId: userData.id,
			message: "Welcome to our platform!",
		});
	}
}
class MyAgent extends Agent {
	async sendNotification(
		payload: { userId: string; message: string },
		queueItem: QueueItem<{ userId: string; message: string }>,
	) {
		console.log(`Processing task ${queueItem.id}`);
		console.log(
			`Sending notification to user ${payload.userId}: ${payload.message}`,
		);

		// Your notification logic here
		await this.notificationService.send(payload.userId, payload.message);
	}

	async onUserSignup(userData: any) {
		// Queue a welcome notification
		await this.queue("sendNotification", {
			userId: userData.id,
			message: "Welcome to our platform!",
		});
	}
}

Případy použití

Zpracování na pozadí

class DataProcessor extends Agent {
	async processLargeDataset(data) {
		const results = await this.heavyComputation(data.datasetId);
		await this.notifyUser(data.userId, results);
	}

	async onDataUpload(uploadData) {
		// Queue the processing instead of doing it synchronously
		await this.queue("processLargeDataset", {
			datasetId: uploadData.id,
			userId: uploadData.userId,
		});

		return { message: "Data upload received, processing started" };
	}
}
class DataProcessor extends Agent {
	async processLargeDataset(data: { datasetId: string; userId: string }) {
		const results = await this.heavyComputation(data.datasetId);
		await this.notifyUser(data.userId, results);
	}

	async onDataUpload(uploadData: any) {
		// Queue the processing instead of doing it synchronously
		await this.queue("processLargeDataset", {
			datasetId: uploadData.id,
			userId: uploadData.userId,
		});

		return { message: "Data upload received, processing started" };
	}
}

Dávkové operace

class BatchProcessor extends Agent {
	async processBatch(data) {
		for (const item of data.items) {
			await this.processItem(item);
		}
		console.log(`Completed batch ${data.batchId}`);
	}

	async onLargeRequest(items) {
		// Split large requests into smaller batches
		const batchSize = 10;
		for (let i = 0; i < items.length; i += batchSize) {
			const batch = items.slice(i, i + batchSize);
			await this.queue("processBatch", {
				items: batch,
				batchId: `batch-${i / batchSize + 1}`,
			});
		}
	}
}
class BatchProcessor extends Agent {
	async processBatch(data: { items: any[]; batchId: string }) {
		for (const item of data.items) {
			await this.processItem(item);
		}
		console.log(`Completed batch ${data.batchId}`);
	}

	async onLargeRequest(items: any[]) {
		// Split large requests into smaller batches
		const batchSize = 10;
		for (let i = 0; i < items.length; i += batchSize) {
			const batch = items.slice(i, i + batchSize);
			await this.queue("processBatch", {
				items: batch,
				batchId: `batch-${i / batchSize + 1}`,
			});
		}
	}
}

Zpracování chyb

Použijte vestavěný retry místo ruční logiky opětovného zařazení do fronty. Když callback vyvolá výjimku, úloha se automaticky opakuje s exponential backoff:

class RobustAgent extends Agent {
	async reliableTask(payload, queueItem) {
		console.log(`Processing task ${queueItem.id}`);
		const response = await fetch(payload.url);
		if (!response.ok) {
			throw new Error(`Request failed: ${response.status}`);
		}
	}

	async onMessage(connection, message) {
		await this.queue(
			"reliableTask",
			{ url: "https://api.example.com/data" },
			{
				retry: {
					maxAttempts: 5,
					baseDelayMs: 500,
					maxDelayMs: 10_000,
				},
			},
		);
	}
}
class RobustAgent extends Agent {
	async reliableTask(payload: { url: string }, queueItem: QueueItem) {
		console.log(`Processing task ${queueItem.id}`);
		const response = await fetch(payload.url);
		if (!response.ok) {
			throw new Error(`Request failed: ${response.status}`);
		}
	}

	async onMessage(connection: Connection, message: WSMessage) {
		await this.queue(
			"reliableTask",
			{ url: "https://api.example.com/data" },
			{
				retry: {
					maxAttempts: 5,
					baseDelayMs: 500,
					maxDelayMs: 10_000,
				},
			},
		);
	}
}

Pokud žádný retry možnost je zadána, výchozí hodnoty na úrovni třídy z static options.retry se používají (3 pokusy, základní zpoždění 100 ms, maximální zpoždění 3 s). Podrobnosti najdete v Opakování pro úplné podrobnosti.

Osvědčené postupy

  1. Udržujte payloady malé: Payloady se serializují do JSON a ukládají do databáze.
  2. Idempotentní operace: Navrhněte metody callbacků tak, aby bylo bezpečné je opakovat.
  3. Zpracování chyb: Zahrňte do metod callbacků řádné ošetření chyb.
  4. Monitoring: Pomocí logování sledujte zpracování fronty.
  5. Vyčištění: Podle potřeby pravidelně čistěte dokončené nebo neúspěšné úlohy.

Integrace s dalšími funkcemi

Systém front spolupracuje s dalšími funkcemi Agent SDK:

Omezení

Zařazování do fronty oproti plánování

Použijte fronta když chcete, aby se úlohy spouštěly co nejdříve v daném pořadí. Použijte plán když potřebujete, aby se úlohy spouštěly v konkrétní časy nebo opakovaně.

Funkce Queue Naplánovat
Časování spuštění Okamžité (FIFO) Konkrétní čas nebo cron
Případ použití Zpracování na pozadí Odložené nebo opakující se úlohy
Úložiště cf_agents_queues tabulka cf_agents_schedules tabulka

Další kroky

Agents API

Kompletní referenční dokumentace API pro Agents SDK.

Plánování úloh

Časově řízené spouštění pomocí cronu a zpoždění.

Spouštění Workflows

Trvalé vícekrokové zpracování na pozadí.