feat: 添加 TODO 注释以优化内存管理和异步处理
This commit is contained in:
@@ -103,6 +103,8 @@ export default defineEventHandler(async (event) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const finishedRecord = record;
|
const finishedRecord = record;
|
||||||
|
// TODO: 归档任务现在仍跑在当前 Node 进程里;如果并发继续升高,应该迁移到独立队列/worker,
|
||||||
|
// 避免大量响应后任务在同一进程内叠加,拖慢其他请求的调度与内存回收。
|
||||||
setImmediate(() => {
|
setImmediate(() => {
|
||||||
void archiveGeneratedImageInBackground({
|
void archiveGeneratedImageInBackground({
|
||||||
imageUrl: result.imageUrl,
|
imageUrl: result.imageUrl,
|
||||||
|
|||||||
@@ -126,6 +126,8 @@ const downloadImage = async (imageUrl: string) => {
|
|||||||
throw new Error(`图片下载失败:${response.status}`);
|
throw new Error(`图片下载失败:${response.status}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: 当前会把整张图片一次性读入当前 Node 进程内存,再转 Blob 上传到图床;
|
||||||
|
// 如果图片尺寸或并发继续增大,建议改成流式转发或落临时文件,降低内存峰值和主线程抖动。
|
||||||
return {
|
return {
|
||||||
bytes: await response.arrayBuffer(),
|
bytes: await response.arrayBuffer(),
|
||||||
mimeType: response.headers.get("content-type") || "image/png"
|
mimeType: response.headers.get("content-type") || "image/png"
|
||||||
|
|||||||
@@ -221,6 +221,8 @@ const readChatCompletionStream = async (
|
|||||||
): Promise<IImageStreamUpstreamResponse> => {
|
): Promise<IImageStreamUpstreamResponse> => {
|
||||||
const reader = stream.getReader();
|
const reader = stream.getReader();
|
||||||
const decoder = new TextDecoder();
|
const decoder = new TextDecoder();
|
||||||
|
// TODO: 这里会把完整 SSE 文本和 chunk 元数据都累计到当前 Node 进程内存里,
|
||||||
|
// 高并发或超长响应下可能带来明显的事件循环抖动;后续可改为限制缓存窗口或只保留摘要。
|
||||||
const chunks: IImageStreamUpstreamResponse["chunks"] = [];
|
const chunks: IImageStreamUpstreamResponse["chunks"] = [];
|
||||||
let buffer = "";
|
let buffer = "";
|
||||||
let content = "";
|
let content = "";
|
||||||
@@ -301,6 +303,8 @@ const parseSseDataLine = (line: string): IChatCompletionStreamChunk | null => {
|
|||||||
const data = trimmed.slice("data:".length).trim();
|
const data = trimmed.slice("data:".length).trim();
|
||||||
if (!data || data === "[DONE]") return null;
|
if (!data || data === "[DONE]") return null;
|
||||||
|
|
||||||
|
// TODO: JSON.parse 仍运行在主线程;如果后续接入更大的 SSE chunk,需要增加单行大小保护,
|
||||||
|
// 避免异常大包在单个 tick 内长时间占用事件循环。
|
||||||
return JSON.parse(data) as IChatCompletionStreamChunk;
|
return JSON.parse(data) as IChatCompletionStreamChunk;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user