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


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

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

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

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

    临时变永久

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

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

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

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

    魔术开始

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

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

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

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

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

    临时素材维护方案

  • 相关阅读:
    php读取大文件如日志文件
    大型站点高并发架构技术
    Nginx配置文件nginx.conf详细说明文档
    关于PHP高并发抢购系统设计
    Mysql常用的锁机制
    Sping基础
    Reliable Master持续集成环境搭建Centos
    Win7 macaca自动化环境搭建 PC篇
    安卓appium无线调试
    Selenium PageFactory使用
  • 原文地址:https://www.cnblogs.com/memoyu/p/16267599.html
Copyright © 2020-2023  润新知