首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Bull.js队列返回生成的映像?

如何使用Bull.js队列返回生成的映像?
EN

Stack Overflow用户
提问于 2020-11-14 18:31:05
回答 1查看 470关注 0票数 1

我的用例是:我想要创建页面各部分的截图。由于技术原因,它不能在客户端完成(见下面的相关问题),而是需要服务器上的傀儡手。

当我在Heroku上运行这个时,我有一个很小的超时窗口的附加限制。因此,Heroku建议实现一个基于bull.js的排队系统,并将worker进程作为在此解释用于较长时间运行的任务。

我有两个端点(用Express实现),一个用一些配置JSON接收POST请求,另一个在提供作业标识符时响应GET (为了简洁起见稍微修改一下):

这会将作业添加到队列中:

代码语言:javascript
复制
router.post('/', async function(req, res, next) {
    let job = await workQueue.add(req.body.chartConfig)
    res.json({ id: job.id })
})

这将返回有关该作业的信息。

代码语言:javascript
复制
router.get('/:id', async(req, res) => {
    let id = req.params.id;
    let job = await workQueue.getJob(id);
    
    let state = await job.getState();
    let progress = job._progress;
    let reason = job.failedReason;
    res.json({ id, state, progress, reason });
})

在另一个文件中:

代码语言:javascript
复制
const start = () => {
    let workQueue = new queue('work', REDIS_URL);
    workQueue.process(maxJobsPerWorker, getPNG)
}

const getPNG = async(job) => {

    const { url, width, height, chart: chartConfig, chartUrl } = job.data

    // ... snipped for brevity

    const png = await page.screenshot({
        type: 'png',
        fullPage: true
    })
    await page.close()
    job.progress(100)
    return Promise.resolve({ png })
}

// ...

throng({ count: workers, worker: start })

module.exports.getPNG = getPNG

最后的throng调用将start函数指定为从队列中选择作业时要调用的worker函数。start本身指定在处理作业时要调用的getPNG

我现在的问题是:如何获得生成的图像(png)?理想情况下,我希望能够调用上面的GET端点来返回图像,但我不知道如何传递图像对象。

作为一种更复杂的回退解决方案,我可以想象将图像发布到像imgur这样的图像托管服务中,然后根据GET端点的请求返回URL。但我宁愿,如果可能的话,保持简单。

这个问题是对这个问题的跟进:

Issue with browser-side conversion SVG -> PNG

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-11 09:58:04

我在票证项目的GitHub存储库上打开了一个公牛。开发人员说,首选的实践是将二进制对象存储在其他地方,并且只向作业的数据存储添加链接元数据。

但是,他们还说作业对象的存储限制似乎是512 Mb。因此,也可以将大小合理的映像存储为base64 64编码的字符串。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64837262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档