文档中心 消息队列 CMQ 案例分享 在线图片处理案例

在线图片处理案例

最近更新时间:2019-08-28 16:51:57

某美图公司在腾讯云搭建了在线图片处理服务,该服务可以让用户上传照片,并指定需要对这些照片执行的操作,例如裁剪、红眼处理、牙齿美白、重新着色、对比度调节、生成缩略图等。用户上传图片后,提交任务,然后等待图片处理完,下载处理后的图片。不同的操作会耗费不同的处理时间,从几秒到几分钟不等,而且用户可能一次上传几张也可能是几十张甚至几百张图片,所以总的处理时间就跟上传的图片个数、图片的大小、用户选择的操作有关。

使用腾讯云 CMQ 实现了上述需求,用户的图片存储在腾讯云存储中(CBS/COS等),用户的每一个操作请求都会作为一个消息存入请求队列(Request Queue)中,消息内容为:图片索引,由图片名称+用户请求的操作类型+图片存储的位置索引 key 等组成。

运行在 CVM 的图片处理服务从 Request Queue 中获取消息(图片索引),图片处理服务器从云端下载数据,并进行图片编辑,完毕后把处理结果发送到结果队列(Response Queue)中,结果图片存储到云存储中。流程结束,客户已将原图片、编辑处理后的图片,都存储在云端存储,可随时下载使用。

可扩展的、高可靠的进一步思考:

  • 如果因为bug或其他原因导致图片处理服务暂时不可用。但是系统利用 CMQ 使得错误对用户透明,一方面用户可以继续上传照片,web server可以继续发消息到Request Queue,消息会被保存在队列中直到图片处理服务可用后取走;另一方面。图片处理服务在实现时不用记住崩溃前在处理的消息,而且其崩溃时处理的消息还可以被重新处理。因为CMQ提供的接收消息(包括接收顺序队列消息和接收并发队列消息)特性保证消息在接收后仍然在队列中,直到消息的接收者显式来删除它。本特性保证了图片处理服务与图片上传服务的解耦。

  • 如果单个图片处理服务不能满足用户需求(用户虽然能够上传照片,但是却长时间拿不到处理的结果),利用CMQ并启动多个图片处理服务便可以满足不断增长的用户访问需求。CMQ的两个特性让这个需求成为可能:
    1) 单个CMQ队列是可以让多个server同时共享访问的(即发送消息、接收并发队列消息、删除并发队列消息功能);
    2) 一个消息不会同时被多个服务接收,这是通过针对消息的短暂锁来保证的,消息的接收者可以指定消息被锁定的时间,接收者处理完消息需要主动删除消息,如果接收者处理消息失败,那么另一个服务可以在这个消息的锁失效后重新获得这个消息。

这两个特性保证了处理服务器的数量可以随着负载的变化而动态加减。