Celery:Received and deleted unknown message. Wrong destination?!?

Celery:Received and deleted unknown message. Wrong destination?!?

北京说明

我尽量写的简介一点,说一下背景:
celery调用rabbitmq进行消息消费,但是不作为生产者使用;
生产者:java发送(或者其他非celery发起的消息队列形式)
消费者:celery
原来的生产者:apply_async()函数
只发了消息体,发现各种celery消费不了的情况。

分析策略(小白可跳过)

(都是干货)
以下都是各个人的解决方法以及我自己的
1、从github源码处,获取了issue的解决方法1:pip uninstall librabbitmq -- 失败
2、给消息队列接受消息时,将连接从amqp改为pyamqp -- 失败
3、增加一些别的,celery的参数 -- 失败

忘了说了,我得工程是jango起的,不知道非jango有没有遇到这个问题,有的话评论区说一声;

我的分析方法:
从源码中进行日志打印(很气,有些地方加了print就没有任何反应,一启动就自动cancel)
对比celery的启动方式以及celery的消息格式;
给消息格式模拟增加各种参数、headers等;

	**最终成果:**

	成功

解决方法:

celery必须要指定一个task的headers参数,以提供给celery监控获取消息后,传送到对应的函数位置;
celery会有指定的消息体格式[[消息内容],{},{}],具体分析我没深入了,原因可能是为了回调能获取到参数之类的,不然就会取消celery的启动或者取消消息接收;

如果按照我这里的方法不成功,看看上方提供的其他两个方法

gapinyc@DESKTOP-9QS7RL5:~/superset-prod$ docker compose build # 重新构建 [+] Building 91.3s (17/21) => [internal] load local bake definitions 0.0s => => reading from stdin 1.61kB 0.0s => [superset internal] load build definition from Dockerfile.superset 0.0s => => transferring dockerfile: 3.06kB 0.0s => [celery internal] load metadata for docker.io/apache/superset:3.1.0 0.3s => [superset-init internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [superset 1/17] FROM docker.io/apache/superset:3.1.0@sha256:afcd2f63479e29da06944087a29e7788f9ecd0250f4611e52aee1c844187e3eb 0.0s => => resolve docker.io/apache/superset:3.1.0@sha256:afcd2f63479e29da06944087a29e7788f9ecd0250f4611e52aee1c844187e3eb 0.0s => CACHED [superset-init 2/17] RUN apt-get update && apt-get install -y --no-install-recommends build-essential libssl-dev libffi-dev 0.0s => CACHED [superset-init 3/17] RUN python -m ensurepip --upgrade || (wget https://bootstrap.pypa.io/get-pip.py -O /tmp/get-pip.py && python /tmp/get-pip.py - 0.0s => CACHED [superset-init 4/17] RUN python -m pip --version 0.0s => CACHED [superset-init 5/17] RUN python -m pip install --upgrade pip && python -m pip install "gevent>=21.12.0" psutil pymysql f 0.0s => CACHED [superset-init 6/17] RUN python -c "import gevent; print(f'✅ Successfully imported gevent {gevent.__version__}')" 0.0s => CACHED [superset-init 7/17] RUN curl -fsSL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | gpg --dearmor -o /usr/share/keyrings/nodesource-keyring.gpg 0.0s => CACHED [superset-init 8/17] RUN echo "deb [signed-by=/usr/share/keyrings/nodesource-keyring.gpg] https://deb.nodesource.com/node_18.x jammy main" > /etc/apt/source 0.0s => [celery 9/17] RUN apt-get update && apt-get install -y nodejs npm && rm -rf /var/lib/apt/lists/* 88.7s => [superset-init 10/17] RUN node --version && npm --version 0.7s => [superset-init 11/17] WORKDIR /app/superset-frontend 0.0s => [superset 12/17] RUN npm config set cache /tmp/npm-cache 0.7s => ERROR [celery 13/17] RUN npm ci 0.6s ------ > [celery 13/17] RUN npm ci: 0.549 npm ERR! code EUSAGE 0.554 npm ERR! 0.554 npm ERR! The `npm ci` command can only install with an existing package-lock.json or 0.554 npm ERR! npm-shrinkwrap.json with lockfileVersion >= 1. Run an install with npm@5 or 0.554 npm ERR! later to generate a package-lock.json file, then try again. 0.554 npm ERR! 0.554 npm ERR! Clean install a project 0.554 npm ERR! 0.554 npm ERR! Usage: 0.554 npm ERR! npm ci 0.554 npm ERR! 0.554 npm ERR! Options: 0.554 npm ERR! [-S|--save|--no-save|--save-prod|--save-dev|--save-optional|--save-peer|--save-bundle] 0.554 npm ERR! [-E|--save-exact] [-g|--global] [--install-strategy <hoisted|nested|shallow>] 0.554 npm ERR! [--legacy-bundling] [--global-style] 0.554 npm ERR! [--omit <dev|optional|peer> [--omit <dev|optional|peer> ...]] 0.554 npm ERR! [--strict-peer-deps] [--no-package-lock] [--foreground-scripts] 0.554 npm ERR! [--ignore-scripts] [--no-audit] [--no-bin-links] [--no-fund] [--dry-run] 0.554 npm ERR! [-w|--workspace <workspace-name> [-w|--workspace <workspace-name> ...]] 0.554 npm ERR! [-ws|--workspaces] [--include-workspace-root] [--no-install-links] 0.554 npm ERR! 0.554 npm ERR! aliases: clean-install, ic, install-clean, isntall-clean 0.555 npm ERR! 0.555 npm ERR! Run "npm help ci" for more info 0.557 0.557 npm ERR! A complete log of this run can be found in: 0.557 npm ERR! /tmp/npm-cache/_logs/2025-10-22T03_35_07_855Z-debug-0.log ------ Dockerfile.superset:76 -------------------- 74 | 75 | # 安装依赖(使用 ci 确保可重复性) 76 | >>> RUN npm ci 77 | 78 | # 构建前端静态资源 -------------------- target superset-init: failed to solve: process "/bin/sh -c npm ci" did not complete successfully: exit code: 1 gapinyc@DESKTOP-9QS7RL5:~/superset-prod$
最新发布
10-23
你遇到了一个 **关键错误**: ``` npm ERR! The `npm ci` command can only install with an existing package-lock.json ``` --- ## 🔴 根本原因 > ❌ 你在容器中运行 `npm ci`,但 **`/app/superset-frontend` 目录下没有 `package-lock.json` 文件!** 这是因为: - 官方 Superset 镜像中的 `/app/superset-frontend` 是源码目录 - 但它 **不包含 `node_modules` 和 `package-lock.json`** - 这些文件应该在构建时由 `npm install` 生成,但官方镜像跳过了前端构建 --- ## ✅ 正确解决方案:**把完整的 Superset 源码(含 lock 文件)复制到容器中** 你需要从本地或 Git 克隆的完整 Superset 项目中,**复制 `superset-frontend` 目录及其 `package-lock.json` 到镜像中**。 --- ### ✅ 解决步骤 #### ✅ Step 1: 获取 Superset 源码(必须包含 `package-lock.json`) ```bash # 如果你还未下载源码 cd ~/superset-prod git clone https://github.com/apache/superset.git cd superset git checkout 3.1.0 # 确保版本匹配 cd .. ``` 这会得到带有 `package-lock.json` 的完整前端目录。 --- #### ✅ Step 2: 修改你的项目结构 确保你的 `~/superset-prod` 目录结构如下: ``` ~/superset-prod/ ├── docker-compose.yml ├── Dockerfile.superset └── superset/ # ← 从 GitHub 克隆的完整源码 ├── superset-frontend/ │ ├── package.json │ ├── package-lock.json # ✅ 必须存在! │ └── ... └── ... ``` --- #### ✅ Step 3: 修改 `Dockerfile.superset` —— 复制前端源码 ```dockerfile # =================================================================================== # ✅ Step 6: 复制并构建前端资源 # =================================================================================== # 将宿主机上的 superset-frontend 目录复制进来(含 package-lock.json) COPY superset/superset-frontend /app/superset-frontend WORKDIR /app/superset-frontend # 提高内存限制 ENV NODE_OPTIONS="--max-old-space-size=4096" # 设置 npm 缓存目录 RUN npm config set cache /tmp/npm-cache # ✅ 使用 npm ci(现在有 package-lock.json 可用) RUN npm ci # 构建前端 RUN npm run build # 构建完成后返回根目录 WORKDIR /app ``` > ⚠️ 注意:`COPY superset/superset-frontend /app/superset-frontend` 必须在 `WORKDIR` 之前执行 --- ### ✅ 完整 `Dockerfile.superset` 关键片段示例 ```dockerfile ARG SUPERSET_VERSION=3.1.0 FROM apache/superset:${SUPERSET_VERSION} USER root # 安装系统依赖 RUN apt-get update && \ apt-get install -y --no-install-recommends \ build-essential \ libssl-dev \ libffi-dev \ python3-dev \ libev-dev \ libjpeg-dev \ zlib1g-dev \ curl \ gnupg \ && rm -rf /var/lib/apt/lists/* # Python 虚拟环境设置 ENV VIRTUAL_ENV=/app/.venv ENV PATH="$VIRTUAL_ENV/bin:$PATH" RUN python -m ensurepip --upgrade || \ (wget https://bootstrap.pypa.io/get-pip.py -O /tmp/get-pip.py && \ python /tmp/get-pip.py --user) RUN python -m pip install --upgrade pip && \ pip install "gevent>=21.12.0" psutil pymysql flask-appbuilder pillow # 安装 Node.js v18 + npm RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - && \ apt-get install -y nodejs && \ rm -rf /var/lib/apt/lists/* # 验证 RUN node --version && npm --version # =================================================================================== # ✅ 复制前端源码(含 package-lock.json) # =================================================================================== COPY superset/superset-frontend /app/superset-frontend WORKDIR /app/superset-frontend ENV NODE_OPTIONS="--max-old-space-size=4096" RUN npm config set cache /tmp/npm-cache # 现在可以成功运行 npm ci RUN npm ci # 构建前端 RUN npm run build WORKDIR /app # 设置时区 ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 清理 RUN pip cache purge && \ npm cache clean --force || true USER superset ``` --- ## ✅ 验证是否成功 ```bash # 重新构建 docker-compose build ``` 你应该看到: - `npm ci` 成功执行 - `npm run build` 生成静态资源 - 最终镜像中 `/app/superset/static/dist/` 包含 `app.bundle.js` 等文件 --- ## 📌 补充说明 | 问题 | 解释 | |------|------| | 为什么不能直接 `npm install`? | `npm install` 会修改 `package-lock.json`,不适合生产构建 | | 为什么必须 `package-lock.json`? | `npm ci` 要求锁文件来保证依赖一致性 | | 是否可以自己生成 `package-lock.json`? | 不推荐,应使用官方版本避免兼容问题 | --- ## ✅ 替代方案:在 Docker 构建时自动克隆 Superset 源码(适合 CI) ```dockerfile # 在 Dockerfile 中自动获取源码 RUN git clone --branch 3.1.0 https://github.com/apache/superset.git /tmp/superset && \ cp -r /tmp/superset/superset-frontend /app/superset-frontend && \ rm -rf /tmp/superset ``` 但需注意: - 增加构建时间 - 需要安装 `git` ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值