企业微信-临时素材维护方案

​ 在做企业微信第三方、内部开发时,有很多场景需要使用素材(图片、视频、语音、文件等),例如:欢迎语、话术等功能,但是企微只提供了临时素材接口:上传临时素材 - 接口文档;所谓临时,当然就只是临时,生成的mediaId会在三天后过期(这个很腾讯);

​ 这时,了解企微开发的人会说,不是有个上传图片吗?永久的呀!上传图片 - 接口文档

​ 对,但是也有限制,最致命的是只能上传图片(正如其名),并且每个企业一个月只能上传3000张,一天最多1000,而且最终上传后返回的是企微图片链接,而我需要的是mediaId;不过,光是第一点已经劝退了!所以,还是得用临时素材;

​ PS:这里只是提供一个比较简单的方案,可能很多地方不完善,希望大佬不吝赐教!

临时变永久

​ 反正目前别奢望企微能帮你变,只能靠你自己了;

​ 理论很简单,只需要在mediaId过期前进行”续命“,保证素材一直处于可用状态;

​ 为此,我们不仅需要提前的将素材进行过期(在我这,你两天半就没了),还要分两种情况去对临时素材进行”关怀“,不至于让它”逝世“:

  • 上传、使用素材前校验时,对已存在的素材进行过期校验,并素材重新上传;
  • 让任务调度系统定时的去关注素材的过期情况,对过期的素材进行重新上传;

魔术开始

​ 方案中使用到数据库、Redis、Kafka、任务调度:

  • 数据库:存储素材信息,同时,你也可以就此形成本地的素材库(又多了一个功能);
  • Redis:包含素材简单数据,便于使用时快速响应,更重要是利用缓存过期实现素材过期;
  • Kafka:消息队列,存储异步处理素材更新的消息
  • 任务调度:最后一重把关,排查并处理很久没操作或更新失败的素材;

材料准备好了,剩下的就是指定什么时候使用了:

  • 以文件的MD5作为文件的唯一标识;
  • Redis中不存在素材数据时,证明素材已经过期;
  • 素材实际是三天过期,为了保证可用性,需要在未真正过期前进行mediaId更新,这里定义2.5天Redis缓存过期,剩下0.5天来进行更新响应,绰绰有余;
  • 发现素材过期后,将素材信息推送到Kafka,并将素材缓存再次写回Redis,防止缓存击穿:
    • 可以分阶段,每个阶段过期时间不一样,达到尽快恢复缓存的最长生命周期(比较复杂,提一嘴而已);
    • 不分阶段,就10分钟,上传接口也有重试,理论上第一次更新就能成功(我最终选择这么做);
  • 任务调度可以适时的去进行排查,具体看实际业务,这是最后一层把关了;

整体处理逻辑如下图所示:

临时素材维护方案

posted @ 2022-05-13 17:43  Memoyu  阅读(729)  评论(0编辑  收藏  举报