Skip to content

全局转换引擎机制

Fileview 在预览服务内部采用统一的全局转换引擎调度机制,在保证稳定性的前提下,实现多引擎协同工作、按文档类型精细化策略控制,以及分布式环境下的稳定运行与自动降级。

全局转换引擎机制流程图

一、设计原则概览

系统的全局转换引擎机制围绕以下目标设计:

  • 多引擎可插拔、可扩展:支持引擎按需接入与替换,不绑定单一实现。
  • 按文档类型精细化配置引擎策略:Word / Excel / PPT / Visio 等类型各自可配置优先引擎与回退策略。
  • 支持引擎健康检查与自动降级:通过定时探测与状态缓存实现自动切换与降级。
  • 支持分布式环境下的消息去重与超时控制:在多节点部署与高并发场景下,避免重复转换与长期卡死任务。

核心目标是:

在复杂部署环境和高并发场景下,确保转换结果 稳定、可控、可恢复

二、全局转换配置与作用范围

1. 全局转换引擎配置(convert.*

该层配置作用于 所有文档类型和所有转换任务,用于控制 MQ 消费行为、引擎调度能力和运行稳定性:

yaml
convert:
  consumer:
    message-expire-time: 300000     # 消息去重有效期(毫秒)
    conversion-timeout: 120000      # 单次转换超时时间(毫秒)
  engine:
    smart-selection:
      enabled: false                # 智能引擎选择(预留能力)
    health:
      check:
        enabled: true               # 引擎健康检查
        cron: "0/30 * * * * ?"      # 定时检查周期
        ttl: 60                     # 状态缓存 TTL(秒)
        lock-timeout: 10            # 分布式锁超时(秒)

2. 配置能力说明

  • conversion-timeout
    控制单个转换任务的最大执行时间,超时后自动中断并判定失败,防止任务“卡死”,避免拖垮系统资源。

  • message-expire-time
    用于 MQ 消息去重,避免同一文件在短时间内被重复转换,是防止“重复消息 / 重复消费 / 重复转换”的关键参数。

  • engine.health.check.*
    启用引擎健康状态探测,为引擎选择和故障转移提供实时依据,包括:

    • enabled:是否启用健康检查
    • cron:定时调度表达式
    • ttl:健康状态在缓存中的有效期
    • lock-timeout:分布式锁超时时间,保证多节点环境下只有一个节点执行检查任务
  • smart-selection.enabled
    预留的智能引擎选择能力(当前关闭),用于未来按文件特征自动推荐最优引擎,如按格式、大小、历史失败率等进行动态路由。

三、按文档类型的引擎选择策略

系统对 Word / Excel / PPT / Visio 等文档类型分别提供独立的引擎策略配置。

以 Word 为例:

yaml
word:
  convert:
    engine:
      priority: libreoffice
      fallback: true
    file:
      size:
        threshold: 10485760
    libreoffice:
      enable: true

策略语义说明

  • engine.priority
    指定该文档类型的首选转换引擎(如 libreoffice)。

  • fallback
    当首选引擎 不可用 / 失败 / 不满足条件 时,是否允许自动切换到其它引擎,实现平滑降级。

  • file.size.threshold
    文件大小阈值,用于避免大文件触发不适合的引擎,例如:

    • 大文件优先路由到更稳定或更高性能的引擎
    • 小文件优先使用启动开销更小的引擎
  • libreoffice.enable
    控制该文档类型是否允许使用 LibreOffice 引擎(叠加全局开关)。

开关叠加原则

全局引擎开关 + 文档类型级开关 会共同生效,只有两者都允许时,引擎才会真正参与调度。

四、转换引擎选择流程(核心逻辑)

整体引擎选择流程可以概括为:

  1. 根据文档类型加载对应的引擎策略(如 word.convert.engine)。
  2. 检查文件大小、格式、密码等前置条件,判断是否满足该引擎使用条件。
  3. 查询引擎健康状态(来自 Redis 缓存)。
  4. priority 顺序尝试可用引擎。
  5. 若当前引擎失败且 fallback = true,则自动切换到下一个备选引擎。
  6. 所有引擎都失败时,返回转换失败状态,并记录详细失败原因,便于定位。

在整个流程中:

  • 转换过程中不阻塞实时健康检查,健康状态由后台任务异步维护。
  • 转换时对健康状态的读取为 O(1) 操作(直接从 Redis 读取)。

五、引擎健康检查机制

系统内置后台引擎健康检查服务,用于持续监控各转换引擎的可用性,为引擎选择与自动降级提供基础数据。

1. 核心特性

  • 定时检查
    默认每 30 秒执行一次(支持 cron 配置),可根据实际情况调整频率。

  • 分布式安全
    通过分布式锁保证多节点部署下,仅 一个节点 执行健康探测任务,避免重复检查和状态竞争。

  • 状态缓存
    检查结果写入 Redis,TTL 默认 60 秒,在保证新鲜度的前提下减少重复探测。

  • 零等待读取
    转换时直接从 Redis 读取引擎状态,延迟通常 < 1ms,对整体转换性能几乎没有影响。

2. 降级策略

为避免“健康检查影响正常转换”,系统设计了多层降级策略:

  • Redis 不可用 → 自动退化为实时检查
    在无缓存的情况下,可按需进行即时健康检测。

  • Redis 无健康状态 → 自动按实时检测处理
    当状态未命中时,可触发临时探测或者按保守策略处理。

目标是:健康检查失败不会影响正常转换流程,只会降低智能选择能力。

六、转换消息去重与超时控制

1. 消息去重机制

系统通过 Redis 原子操作实现转换消息去重,防止在 MQ 场景下的重复消费和重复转换。

  • 使用 SETNX 或等效原子操作。

  • Key 结构示例:

    text
    convert:dedup:{fileId}:{targetFormat}
  • 有效期由 message-expire-time 控制(默认 5 分钟)。

  • 若转换失败,会主动清除去重 Key,允许重试。

效果:

  • 防止重复消息、重复消费、重复转换。
  • 在异常重试或网络抖动场景下,仍能保持整体系统稳定。

2. 转换超时控制

  • 每个转换任务都有最大执行时间限制(由 conversion-timeout 控制)。
  • 超时后自动中断并标记失败,释放占用资源。
  • 防止异常文件或引擎问题在无控制的情况下长期占用线程与进程。

七、配置使用情况总结

配置模块使用状态说明
convert.consumer.*✅ 使用中MQ 消费、去重、超时控制
convert.engine.health.*✅ 使用中引擎健康检查
convert.engine.smart-selection✅ 使用中当前关闭(预留能力)
word/excel/ppt/visio.convert.*✅ 使用中引擎选择与回退核心

八、总结

全局转换引擎机制: 系统通过统一的转换引擎调度层,对不同文档类型按策略选择最合适的转换引擎,并结合引擎健康检查、消息去重与超时控制机制,在分布式环境下实现 稳定、可控、可降级 的文档转换能力。