[{"data":1,"prerenderedAt":816},["ShallowReactive",2],{"content:\u002Fposts\u002Frabbitmq-delayed-message-plugin-setup":3,"surround:\u002Fposts\u002Frabbitmq-delayed-message-plugin-setup":805},{"id":4,"title":5,"body":6,"categories":773,"date":775,"description":776,"draft":777,"extension":778,"image":779,"meta":780,"navigation":782,"path":783,"permalink":779,"pinned":777,"published":779,"readingTime":784,"recommend":779,"references":779,"seo":789,"sitemap":790,"stem":791,"tags":792,"type":803,"updated":775,"__hash__":804},"content\u002Fposts\u002Fposts\u002Frabbitmq-delayed-message-plugin-setup.md","RabbitMQ 进阶实战：延迟消息插件安装与配置指南",{"type":7,"value":8,"toc":743},"minimark",[9,19,35,40,64,68,73,76,86,89,96,115,129,133,141,147,166,179,183,189,195,203,211,219,229,236,244,247,253,260,264,268,274,280,284,315,318,322,326,334,339,345,349,357,365,371,375,381,385,391,397,419,423,426,543,548,595,599,733],[10,11,15],"alert",{"title":12,"type":13,"icon":14},"AI 迁移提示","info","tabler:robot",[16,17,18],"p",{},"本文由 AI 协助从旧站迁移，尚未完成逐篇人工审校；内容如有疏漏，将在复核后修订。",[16,20,21,22,26,27,34],{},"RabbitMQ 实现延迟消息有两条主流路线：",[23,24,25],"strong",{},"DLQ + TTL","（不用装插件，有队头阻塞问题）和 ",[23,28,29,33],{},[30,31,32],"code",{"code":32},"rabbitmq_delayed_message_exchange"," 插件","（精确延迟，需要额外安装）。本文记录插件在 Docker Compose 环境下的完整安装流程、Spring AMQP 的使用示例，以及两种方案在什么场景该选哪一种。",[36,37,39],"h2",{"id":38},"_1-前置条件","1. 前置条件",[41,42,43,51,54,61],"ul",{},[44,45,46,47,50],"li",{},"RabbitMQ 3.12+（官方 Docker 镜像 ",[30,48,49],{"code":49},"rabbitmq:3.13-management"," 以下都适用）",[44,52,53],{},"Docker + Docker Compose",[44,55,56,57,60],{},"能访问 GitHub（下载插件 ",[30,58,59],{"code":59},".ez"," 文件）",[44,62,63],{},"Java + Spring Boot 项目（本文示例基于 Spring Boot 3.x + spring-boot-starter-amqp）",[36,65,67],{"id":66},"_2-下载对应版本的插件","2. 下载对应版本的插件",[69,70,72],"h3",{"id":71},"_21-确认-rabbitmq-版本","2.1 确认 RabbitMQ 版本",[16,74,75],{},"进入运行中的容器查询：",[77,78,84],"pre",{"className":79,"code":81,"language":82,"meta":83},[80],"language-bash","docker exec \u003C容器名> rabbitmqctl version\n","bash","",[30,85,81],{"__ignoreMap":83},[16,87,88],{},"或者查 compose 文件里固定的镜像 tag。",[69,90,92,93,95],{"id":91},"_22-下载匹配的-ez-文件","2.2 下载匹配的 ",[30,94,59],{"code":59}," 文件",[16,97,98,99,106,107,110,111,114],{},"访问 ",[100,101,105],"a",{"href":102,"rel":103},"https:\u002F\u002Fgithub.com\u002Frabbitmq\u002Frabbitmq-delayed-message-exchange\u002Freleases",[104],"nofollow","rabbitmq-delayed-message-exchange Releases","，在每个 release 的说明里找 ",[23,108,109],{},"Compatible RabbitMQ versions","，选一个覆盖你版本的插件 release，下载 ",[30,112,113],{"code":113},"rabbitmq_delayed_message_exchange-\u003Cversion>.ez","。",[10,116,119],{"title":117,"type":118},"不要按主版本号想当然对应","warning",[16,120,121,122,125,126,114],{},"RabbitMQ 3.9 时代流传的\"插件版本和 RabbitMQ 主版本号一致\"已经",[23,123,124],{},"不再成立","。现在插件有独立的版本号，必须看 release notes 里标注的兼容版本范围，",[23,127,128],{},"强行用不匹配的插件会导致 RabbitMQ 启动失败",[36,130,132],{"id":131},"_3-安装插件两种方式","3. 安装插件：两种方式",[69,134,136,137,140],{"id":135},"_31-快速方式docker-cp-注入运行中的容器仅限临时测试","3.1 快速方式：",[30,138,139],{"code":139},"docker cp"," 注入运行中的容器（仅限临时测试）",[77,142,145],{"className":143,"code":144,"language":82,"meta":83},[80],"# 1. 先查一下容器里真实的插件目录\ndocker exec \u003C容器名> rabbitmq-plugins directories -s\n# Plugin archives directory: \u002Fopt\u002Frabbitmq\u002Fplugins  ← 这一行就是目标路径\n\n# 2. 拷贝进去\ndocker cp rabbitmq_delayed_message_exchange-3.13.0.ez \u003C容器名>:\u002Fopt\u002Frabbitmq\u002Fplugins\u002F\n\n# 3. 修正文件权限（docker cp 默认 root:root，容器服务以 rabbitmq 用户运行，读不到会启用失败）\ndocker exec -u root \u003C容器名> chown rabbitmq:rabbitmq \\\n    \u002Fopt\u002Frabbitmq\u002Fplugins\u002Frabbitmq_delayed_message_exchange-3.13.0.ez\n\n# 4. 启用插件（热启用，不需要重启容器）\ndocker exec \u003C容器名> rabbitmq-plugins enable rabbitmq_delayed_message_exchange\n",[30,146,144],{"__ignoreMap":83},[10,148,150],{"title":149,"type":118},"这种方式的插件活不过容器重建",[16,151,152,154,155,158,159,162,163,114],{},[30,153,139],{"code":139}," 进去的文件",[23,156,157],{},"只存在于当前容器的可写层","。一旦执行 ",[30,160,161],{"code":161},"docker compose down && up"," 或镜像更新，容器重建后插件消失，还要重装一遍。仅适合本地快速测试，",[23,164,165],{},"生产环境请用 3.2 的 compose 挂载方式",[10,167,170],{"title":168,"type":169},"必要时再重启","tip",[16,171,172,175,176,114],{},[30,173,174],{"code":174},"rabbitmq-plugins enable"," 是热启用，正常情况下立即生效、不需要重启。只有在启用报错 \u002F 插件没被正确加载时，才需要 ",[30,177,178],{"code":178},"docker restart \u003C容器名>",[69,180,182],{"id":181},"_32-推荐方式docker-compose-挂载持久化","3.2 推荐方式：docker-compose 挂载持久化",[16,184,185,186,188],{},"把 ",[30,187,59],{"code":59}," 文件放在项目目录下，bind mount 到容器的插件目录。这样容器重建、迁移时插件跟着跑。",[16,190,191,194],{},[23,192,193],{},"项目目录结构","：",[77,196,201],{"className":197,"code":199,"language":200},[198],"language-text","my-rabbitmq\u002F\n├── docker-compose.yaml\n├── enabled_plugins\n└── plugins\u002F\n    └── rabbitmq_delayed_message_exchange-3.13.0.ez\n","text",[30,202,199],{"__ignoreMap":83},[16,204,205,210],{},[23,206,207],{},[30,208,209],{"code":209},"enabled_plugins","（用于 RabbitMQ 启动时自动启用插件，省得手动 enable）：",[77,212,217],{"className":213,"code":215,"language":216,"meta":83},[214],"language-erlang","[rabbitmq_management,rabbitmq_delayed_message_exchange].\n","erlang",[30,218,215],{"__ignoreMap":83},[10,220,222],{"title":221,"type":118},"注意末尾那个点 `.`",[16,223,224,225,228],{},"这是 Erlang 配置文件语法，末尾的英文句点",[23,226,227],{},"必须有","，否则启动时会报语法错误。",[16,230,231,194],{},[23,232,233],{},[30,234,235],{"code":235},"docker-compose.yaml",[77,237,242],{"className":238,"code":240,"language":241,"meta":83},[239],"language-yaml","services:\n  rabbitmq:\n    image: rabbitmq:3.13-management\n    container_name: rabbitmq\n    restart: unless-stopped\n    ports:\n      - \"5672:5672\"       # AMQP\n      - \"15672:15672\"     # Management UI\n    environment:\n      RABBITMQ_DEFAULT_USER: admin\n      RABBITMQ_DEFAULT_PASS: ChangeMe_StrongPassword\n    volumes:\n      # 持久化消息与元数据\n      - rabbitmq-data:\u002Fvar\u002Flib\u002Frabbitmq\n      # 把本地 plugins\u002F 目录挂到容器插件路径（具体路径用 rabbitmq-plugins directories -s 确认）\n      - .\u002Fplugins:\u002Fopt\u002Frabbitmq\u002Fcommunity-plugins\n      # 预启用插件清单\n      - .\u002Fenabled_plugins:\u002Fetc\u002Frabbitmq\u002Fenabled_plugins:ro\n    # 通过 RABBITMQ_PLUGINS_DIR 让 RabbitMQ 从默认目录 + 我们挂的目录都查找插件\n    # 冒号分隔，官方镜像里插件目录为 \u002Fopt\u002Frabbitmq\u002Fplugins\n    command: >\n      bash -c \"\n        export RABBITMQ_PLUGINS_DIR=\u002Fopt\u002Frabbitmq\u002Fplugins:\u002Fopt\u002Frabbitmq\u002Fcommunity-plugins &&\n        rabbitmq-server\n      \"\n\nvolumes:\n  rabbitmq-data:\n","yaml",[30,243,240],{"__ignoreMap":83},[16,245,246],{},"启动：",[77,248,251],{"className":249,"code":250,"language":82,"meta":83},[80],"docker compose up -d\ndocker compose logs -f rabbitmq\n",[30,252,250],{"__ignoreMap":83},[16,254,255,256,259],{},"日志里看到 ",[30,257,258],{"code":258},"Starting RabbitMQ 3.13.x ... Applying plugin configuration ... plugins are ready"," 即为成功。",[36,261,263],{"id":262},"_4-启用与验证","4. 启用与验证",[69,265,267],{"id":266},"_41-确认插件已启用","4.1 确认插件已启用",[77,269,272],{"className":270,"code":271,"language":82,"meta":83},[80],"docker exec rabbitmq rabbitmq-plugins list -e\n",[30,273,271],{"__ignoreMap":83},[16,275,276,277,114],{},"输出中应该看到 ",[30,278,279],{"code":279},"[E*] rabbitmq_delayed_message_exchange",[69,281,283],{"id":282},"_42-web-ui-验证","4.2 Web UI 验证",[285,286,287,298,303],"ol",{},[44,288,289,290,293,294,297],{},"浏览器打开 ",[30,291,292],{"code":292},"http:\u002F\u002F\u003C服务器 IP>:15672","，用 ",[30,295,296],{"code":296},"admin"," \u002F 上面设置的密码登录",[44,299,300],{},[23,301,302],{},"Exchanges → Add a new exchange",[44,304,305,308,309,314],{},[23,306,307],{},"Type"," 下拉菜单里应该新增了 ",[23,310,311],{},[30,312,313],{"code":313},"x-delayed-message"," 选项",[16,316,317],{},"能看到这个类型就说明插件工作正常。",[36,319,321],{"id":320},"_5-spring-boot-使用示例","5. Spring Boot 使用示例",[69,323,325],{"id":324},"_51-添加依赖maven","5.1 添加依赖（Maven）",[77,327,332],{"className":328,"code":330,"language":331,"meta":83},[329],"language-xml","\u003Cdependency>\n    \u003CgroupId>org.springframework.boot\u003C\u002FgroupId>\n    \u003CartifactId>spring-boot-starter-amqp\u003C\u002FartifactId>\n\u003C\u002Fdependency>\n","xml",[30,333,330],{"__ignoreMap":83},[16,335,336,194],{},[30,337,338],{"code":338},"application.yml",[77,340,343],{"className":341,"code":342,"language":241,"meta":83},[239],"spring:\n  rabbitmq:\n    host: 127.0.0.1\n    port: 5672\n    username: admin\n    password: ChangeMe_StrongPassword\n",[30,344,342],{"__ignoreMap":83},[69,346,348],{"id":347},"_52-声明-delayed-message-exchange-queue","5.2 声明 delayed-message exchange + queue",[77,350,355],{"className":351,"code":353,"language":354,"meta":83},[352],"language-java","@Configuration\npublic class RabbitMQConfig {\n\n    public static final String DELAYED_EXCHANGE = \"delayed.exchange\";\n    public static final String DELAYED_QUEUE    = \"delayed.queue\";\n    public static final String DELAYED_ROUTING  = \"delayed.key\";\n\n    @Bean\n    public CustomExchange delayedExchange() {\n        Map\u003CString, Object> args = new HashMap\u003C>();\n        \u002F\u002F x-delayed-type 指定底层路由行为，direct \u002F topic \u002F fanout 均可\n        args.put(\"x-delayed-type\", \"direct\");\n        return new CustomExchange(\n                DELAYED_EXCHANGE,\n                \"x-delayed-message\",   \u002F\u002F 插件提供的 exchange 类型\n                true,                   \u002F\u002F durable\n                false,                  \u002F\u002F autoDelete\n                args\n        );\n    }\n\n    @Bean\n    public Queue delayedQueue() {\n        return new Queue(DELAYED_QUEUE, true);\n    }\n\n    @Bean\n    public Binding delayedBinding() {\n        return BindingBuilder.bind(delayedQueue())\n                .to(delayedExchange())\n                .with(DELAYED_ROUTING)\n                .noargs();\n    }\n}\n","java",[30,356,353],{"__ignoreMap":83},[69,358,360,361,364],{"id":359},"_53-发送带-x-delay-的消息","5.3 发送带 ",[30,362,363],{"code":363},"x-delay"," 的消息",[77,366,369],{"className":367,"code":368,"language":354,"meta":83},[352],"@Service\n@RequiredArgsConstructor\npublic class DelayedMessageProducer {\n\n    private final RabbitTemplate rabbitTemplate;\n\n    \u002F**\n     * 发送延迟消息\n     * @param payload     消息内容\n     * @param delayMillis 延迟毫秒数\n     *\u002F\n    public void sendDelayed(String payload, long delayMillis) {\n        rabbitTemplate.convertAndSend(\n                RabbitMQConfig.DELAYED_EXCHANGE,\n                RabbitMQConfig.DELAYED_ROUTING,\n                payload,\n                message -> {\n                    \u002F\u002F x-delay 单位是毫秒；注意 int 类型、最大约 24.8 天\n                    message.getMessageProperties().setHeader(\"x-delay\", (int) delayMillis);\n                    return message;\n                }\n        );\n    }\n}\n",[30,370,368],{"__ignoreMap":83},[69,372,374],{"id":373},"_54-消费端","5.4 消费端",[77,376,379],{"className":377,"code":378,"language":354,"meta":83},[352],"@Component\n@Slf4j\npublic class DelayedMessageConsumer {\n\n    @RabbitListener(queues = RabbitMQConfig.DELAYED_QUEUE)\n    public void onMessage(String payload) {\n        log.info(\"收到延迟消息: {} @ {}\", payload, Instant.now());\n    }\n}\n",[30,380,378],{"__ignoreMap":83},[69,382,384],{"id":383},"_55-调用示例","5.5 调用示例",[77,386,389],{"className":387,"code":388,"language":354,"meta":83},[352],"producer.sendDelayed(\"5 秒后送达\", 5_000);\nproducer.sendDelayed(\"1 分钟后送达\", 60_000);\n",[30,390,388],{"__ignoreMap":83},[16,392,393,394,114],{},"5 秒 \u002F 60 秒后，消费端会在对应时刻收到消息，",[23,395,396],{},"多条不同延迟的消息互不阻塞",[10,398,400],{"title":399,"type":118},"x-delay 最大值上限",[16,401,402,404,405,408,409,412,413,416,417,114],{},[30,403,363],{"code":363}," 使用 Erlang 的 32-bit 整数，最大约 ",[30,406,407],{"code":407},"2^32 - 1"," 毫秒，折合约 ",[23,410,411],{},"49.7 天","（社区流传 24.8 天是把它当成 32-bit 有符号整数的误解；实际实现是无符号）。",[23,414,415],{},"超过这个上限直接消息被丢弃","，业务里需要超长延迟时应考虑数据库定时扫描 + 短延迟补偿的组合方案，而不是无脑上 ",[30,418,363],{"code":363},[36,420,422],{"id":421},"_6-选型对比dlq-ttl-vs-延迟消息插件","6. 选型对比：DLQ + TTL vs 延迟消息插件",[16,424,425],{},"两种方案都能实现延迟消息，但机制和适用场景完全不同：",[427,428,429,445],"table",{},[430,431,432],"thead",{},[433,434,435,439,442],"tr",{},[436,437,438],"th",{},"维度",[436,440,441],{},"DLQ + TTL（传统方案）",[436,443,444],{},"delayed-message 插件",[446,447,448,460,471,488,499,510,521,532],"tbody",{},[433,449,450,454,457],{},[451,452,453],"td",{},"是否需要装插件",[451,455,456],{},"❌ 纯原生",[451,458,459],{},"✅ 需额外安装",[433,461,462,465,468],{},[451,463,464],{},"延迟精度",[451,466,467],{},"依赖队列头部消息是否到期",[451,469,470],{},"精确，ms 级",[433,472,473,478,485],{},[451,474,475],{},[23,476,477],{},"队头阻塞",[451,479,480,481,484],{},"✅ ",[23,482,483],{},"有","——短 TTL 消息会被队头的长 TTL 消息挡住",[451,486,487],{},"❌ 无",[433,489,490,493,496],{},[451,491,492],{},"每条消息可独立延迟",[451,494,495],{},"勉强支持（per-message TTL），但会触发队头阻塞",[451,497,498],{},"✅ 原生支持",[433,500,501,504,507],{},[451,502,503],{},"最大延迟",[451,505,506],{},"理论无上限",[451,508,509],{},"约 49.7 天（单条 32-bit 毫秒）",[433,511,512,515,518],{},[451,513,514],{},"消息堆积性能",[451,516,517],{},"消息在队列中等 TTL，性能平稳",[451,519,520],{},"延迟消息在 Mnesia 索引中，数量大时有压力",[433,522,523,526,529],{},[451,524,525],{},"运维复杂度",[451,527,528],{},"低",[451,530,531],{},"需管理插件版本与兼容性",[433,533,534,537,540],{},[451,535,536],{},"集群支持",[451,538,539],{},"原生完美",[451,541,542],{},"插件在集群下需要注意 Mnesia 状态同步",[16,544,545,194],{},[23,546,547],{},"选型建议",[41,549,550,559,568,578],{},[44,551,552,555,556,558],{},[23,553,554],{},"所有消息统一延迟","（比如\"订单创建 30 分钟后统一检查支付状态\"）→ ",[23,557,25],{},"，无队头阻塞问题、更简单、无依赖。",[44,560,561,564,565,567],{},[23,562,563],{},"每条消息延迟时间不同","（比如用户自选\"5 分钟后提醒 \u002F 1 小时后提醒 \u002F 1 天后提醒\"）→ ",[23,566,444],{},"，能规避 DLQ 方案的队头阻塞。",[44,569,570,573,574,577],{},[23,571,572],{},"超过 49.7 天的超长延迟"," → 两种方案都不合适，改用",[23,575,576],{},"数据库定时扫描 + 到期前几分钟投递到普通队列","的组合。",[44,579,580,583,584,587,588,591,592,114],{},[23,581,582],{},"消息量巨大（每天百万级别延迟消息）"," → 延迟消息插件的内存压力会显现，此时建议转用 ",[23,585,586],{},"Redis ZSet","、",[23,589,590],{},"Kafka 的 delay topic","、或专业延迟队列如 ",[23,593,594],{},"RocketMQ 的定时消息",[36,596,598],{"id":597},"_7-常见故障排查","7. 常见故障排查",[427,600,601,614],{},[430,602,603],{},[433,604,605,608,611],{},[436,606,607],{},"现象",[436,609,610],{},"可能原因",[436,612,613],{},"对策",[446,615,616,637,655,666,682,706,717],{},[433,617,618,623,628],{},[451,619,620,622],{},[30,621,174],{"code":174}," 报 plugin not found",[451,624,625,627],{},[30,626,59],{"code":59}," 文件不在 RabbitMQ 扫描的插件目录里",[451,629,630,633,634],{},[30,631,632],{"code":632},"rabbitmq-plugins directories -s"," 确认路径；docker-compose 方式检查 ",[30,635,636],{"code":636},"RABBITMQ_PLUGINS_DIR",[433,638,639,645,650],{},[451,640,641,642],{},"启用报 ",[30,643,644],{"code":644},"permission denied",[451,646,647,649],{},[30,648,59],{"code":59}," 文件权限不对",[451,651,652],{},[30,653,654],{"code":654},"chown rabbitmq:rabbitmq \u003C.ez 文件>",[433,656,657,660,663],{},[451,658,659],{},"RabbitMQ 启动直接 crash，日志报版本不兼容",[451,661,662],{},"插件版本与 RabbitMQ 不匹配",[451,664,665],{},"按 2.2 节核对 Compatible versions，换对应 release",[433,667,668,673,676],{},[451,669,670,671],{},"Web UI 里 Exchange Type 下拉没有 ",[30,672,313],{"code":313},[451,674,675],{},"插件没启用 \u002F 启用失败",[451,677,678,681],{},[30,679,680],{"code":680},"rabbitmq-plugins list -e"," 确认；查容器日志",[433,683,684,690,696],{},[451,685,686,687,689],{},"消息没按 ",[30,688,363],{"code":363}," 延迟，立刻就到了",[451,691,692,693,695],{},"往普通 exchange 发了、而不是 ",[30,694,313],{"code":313}," 类型",[451,697,698,699,702,703],{},"确认 ",[30,700,701],{"code":701},"CustomExchange"," 的 type 参数是 ",[30,704,705],{"code":705},"\"x-delayed-message\"",[433,707,708,711,714],{},[451,709,710],{},"消息到了但延迟不准（慢几秒）",[451,712,713],{},"集群模式下 Mnesia 同步抖动 \u002F 插件精度限制",[451,715,716],{},"延迟任务场景接受秒级误差；强一致场景换方案",[433,718,719,724,730],{},[451,720,721,723],{},[30,722,363],{"code":363}," 值超过 49.7 天，消息消失",[451,725,726,727,729],{},"超过 ",[30,728,363],{"code":363}," 支持上限",[451,731,732],{},"改用数据库定时扫描组合方案",[10,734,736],{"title":735,"type":13},"作者注",[16,737,738,739,742],{},"本文示例基于 RabbitMQ 3.13 + Spring Boot 3.x + ",[30,740,741],{"code":741},"spring-boot-starter-amqp","。不同 RabbitMQ 版本的插件兼容范围会变化，最终以对应 release notes 里的 Compatible versions 为准。",{"title":83,"searchDepth":744,"depth":744,"links":745},4,[746,748,754,759,763,771,772],{"id":38,"depth":747,"text":39},2,{"id":66,"depth":747,"text":67,"children":749},[750,752],{"id":71,"depth":751,"text":72},3,{"id":91,"depth":751,"text":753},"2.2 下载匹配的 .ez 文件",{"id":131,"depth":747,"text":132,"children":755},[756,758],{"id":135,"depth":751,"text":757},"3.1 快速方式：docker cp 注入运行中的容器（仅限临时测试）",{"id":181,"depth":751,"text":182},{"id":262,"depth":747,"text":263,"children":760},[761,762],{"id":266,"depth":751,"text":267},{"id":282,"depth":751,"text":283},{"id":320,"depth":747,"text":321,"children":764},[765,766,767,769,770],{"id":324,"depth":751,"text":325},{"id":347,"depth":751,"text":348},{"id":359,"depth":751,"text":768},"5.3 发送带 x-delay 的消息",{"id":373,"depth":751,"text":374},{"id":383,"depth":751,"text":384},{"id":421,"depth":747,"text":422},{"id":597,"depth":747,"text":598},[774],"服务","2026-02-27","在 Docker Compose 下安装 rabbitmq_delayed_message_exchange 插件，Spring AMQP 声明延迟 exchange、发送带 x-delay 的消息，并与传统 DLQ + TTL 方案做选型对比。",false,"md",null,{"slots":781},{},true,"\u002Fposts\u002Frabbitmq-delayed-message-plugin-setup",{"text":785,"minutes":786,"time":787,"words":788},"10 min read",9.74,584400,1948,{"title":5,"description":776},{"loc":783},"posts\u002Fposts\u002Frabbitmq-delayed-message-plugin-setup",[793,794,795,796,797,798,799,800,801,802],"RabbitMQ","消息队列","AMQP","延迟队列","延迟消息","插件","Docker","Docker Compose","Java","Spring Boot","tech","6vMj94ABNXvIt_F9NX0bwtImEHzf4E4W7ItpLixmgQ8",[806,811],{"title":807,"path":808,"stem":809,"date":810,"type":803,"children":-1},"突破内网延迟：ZeroTier 私有 Planet 节点搭建全攻略","\u002Fposts\u002Fzerotier-private-planet-setup","posts\u002Fposts\u002Fzerotier-private-planet-setup","2026-02-25",{"title":812,"path":813,"stem":814,"date":815,"type":803,"children":-1},"Alpine Linux 极简安装流程与生产环境轻量化配置","\u002Fposts\u002Falpine-install-config","posts\u002Fposts\u002Falpine-install-config","2026-03-01",1788712223685]