13 funweb (funboost web manager) 介绍
术语说明:funweb 是 funboost_web_manager 的简称。
通过 funweb 可以查看消费结果;管理队列;管理消费者;查看正在运行的函数; 实时调节并发数量;调节 qps 限制频率;仅从页面就能看到python 函数的消费情况,无需去查看日志文件。
说明:funweb 不一定需要用户安装mongo,用户只要不使用前2个页面就好了,后几个页面都是依赖redis,不依赖mongo.
13.1 介绍 启动 funweb (funboost web manager) (方式一)。
funweb 启动方式很容易很简单,一键就能启动。
python3 -m funboost.funweb.app
web代码在funboost安装包里面,所以你安装了funboost后,可以直接使用命令行运行起来,不需要用户现亲自下载web代码就可以直接一键启动运行。
首先要安装选装 pip install funboost[flask]
(这是因为这是选装,防止用户抱怨funboost依赖太多。)第一步:设置 PYTHONPATH 为你的项目根目录
export PYTHONPATH=你的项目根目录 (这么做是为了这个web可以读取到你项目根目录下的 funboost_config.py里面的配置)
(怎么设置环境变量应该不需要我来教,环境变量都没听说过太low了)
例如 export PYTHONPATH=/home/ydf/codes/ydfhome
或者 export PYTHONPATH=./ (./是相对路径,前提是已近cd到你的项目根目录了,也可以写绝对路径全路径)
win cmd 设置环境变量语法是 set PYTHONPATH=/home/ydf/codes/ydfhome
win powershell 语法是 $env:PYTHONPATH = "/home/ydf/codes/ydfhome"
第二步:启动 funweb 的 flask app
win上这么做: python3 -m funboost.funweb.app
linux上可以这么做性能好一些,也可以按win的做: gunicorn -w 4 --threads=30 --bind 0.0.0.0:27018 funboost.funweb.app:app
使用浏览器打开 127.0.0.1(启动web服务的机器ip):27018,输入默认用户名 密码 admin 123456,即可打开函数运行状态和结果页面。
13.1.b 直接在代码中启动web start_funboost_web_manager() (方式二):
start_funboost_web_manager() 可以随着消费程序一起启动,也可以单独启动。
from funboost.funweb.app import start_funboost_web_manager
start_funboost_web_manager()
13.2 funweb 截图
设置关心的项目,设置 care_project_name,可以让界面仅显示你关心的项目的队列,减少无关返回信息的干扰。

函数消费结果:可查看和搜索函数实时消费状态和结果。对于失败的消息,在页面上用户可以点击重新运行按钮,方便一键重新投递到消息队列。

运行中消费者 by queue: 根据队列名字搜索有哪些消费者

队列操作:查看和操作队列,包括 清空清空 暂停消费 恢复消费 调整qps和并发

队列操作:查看消费曲线图,查看各种消费指标。
包括 历史运行次数 历史运行失败次数 近10秒完成 近10秒失败 近10秒函数运行平均耗时 累计函数运行平均耗时 剩余消息数量

rpc调用:在网页上对30种消息队列发布消息并获取消息的函数执行结;以及可根据taskid获取结果。

定时任务管理:列表页
[
]
13.3 funboost web 图片对应的测试代码
import asyncio
import time
import random
from funboost import boost, FunctionResultStatusPersistanceConfig, BoosterParams,BrokerEnum,enable_ctrl_c_quit_on_windows,ConcurrentModeEnum
from funboost.funweb.app import start_funboost_web_manager
class MyBoosterParams(BoosterParams):
project_name:str = 'test_project1' # 核心配置,项目名,设置后,web接口就可以只关心某个项目下的队列,减少无关返回信息的干扰。
broker_kind:str = BrokerEnum.REDIS
is_send_consumer_heartbeat_to_redis : bool= True # 向redis发送心跳,这样才能从redis获取相关队列的运行信息。
is_using_rpc_mode:bool = True # 必须设置这一个参数为True,才能支持rpc功能。
booster_group : str = 'test_group1' # 方便按分组启动消费
should_check_publish_func_params:bool = True # 发布消息时,是否检查消息内容是否正确,不正确的消息格式立刻从接口返回报错消息内容不正确。
function_result_status_persistance_conf: FunctionResultStatusPersistanceConfig = FunctionResultStatusPersistanceConfig(
is_save_result=True, is_save_status=True, expire_seconds=7 * 24 * 3600, is_use_bulk_insert=False)
@boost(MyBoosterParams(queue_name='queue_test_g01t',qps=1,))
def f(x):
time.sleep(5)
print(f'hi: {x}')
if random.random() > 0.9:
raise ValueError('f error')
return x + 1
@boost(MyBoosterParams(queue_name='queue_test_g02t',qps=0.5,
max_retry_times=0,))
def f2(x,y):
time.sleep(2)
print(f'hello: {x} {y}')
if random.random() > 0.5:
raise ValueError('f2 error')
return x + y
@boost(MyBoosterParams(queue_name='queue_test_g03t',qps=0.5,
max_retry_times=0,concurrent_mode=ConcurrentModeEnum.ASYNC))
async def aio_f3(x):
await asyncio.sleep(3)
print(f'f3aa: {x}')
if random.random() > 0.5:
raise ValueError('f3 error')
return x + 1
if __name__ == '__main__':
start_funboost_web_manager(port=27018) # 也可以在python代码中启动web,来启动 funweb funboost队列管理界面。可以不需要命令行来启动。
f.multi_process_consume(4)
f2.multi_process_consume(5)
aio_f3.consume()
for i in range(0, 1000000):
f.push(i)
f2.push(i)
aio_f3.push(i)
time.sleep(1)
enable_ctrl_c_quit_on_windows()
13.4 🚀 funweb 系统功能-脚本部署管理
funweb 的脚本部署功能独立于 funboost 的消息队列调度——即使不用 funboost 消费,也可以用来部署和管理任意脚本。
💡 funweb 脚本部署 = Supervisor + Jenkins + ELK 的轻量替代方案
🏷️ 能力 |
📝 对标 |
✨ funweb 实现 |
|---|---|---|
进程守护 |
Supervisor |
启动、停止、重启、崩溃自动保活 |
自动发版 |
Jenkins |
Git Pull + 分支切换 + 自动重启 |
日志聚合 |
ELK |
关键字搜索、时间筛选、10GB+ 大文件二分查找、级别着色 |
13.4.1 核心功能
部署管理:新建、编辑、复制、删除部署配置,配置项包括 部署名称、项目根目录、启动命令、环境变量。
进程控制:一键启动、停止、重启。支持配置多进程数量(默认1个),每个进程独立管理。
自动启动/自动重启:可配置
auto_start(web 服务启动时自动拉起)和auto_restart(进程崩溃后自动重启,可设最大连续重试次数,默认3次)。人工在页面停止的进程不会被自动重启。更新并重启:一键执行
git pull+ 重启,支持分支切换、模糊搜索分支,git 操作失败自动取消重启。日志查看:支持关键字搜索、按时间范围筛选(快捷按钮 + 自定义范围)、自动刷新。基于二分查找实现,兼容 10GB 级大日志文件。日志按级别着色显示(DEBUG 绿/INFO 青/WARNING 金黄/ERROR 粉红/CRITICAL 血红/print 天蓝)。
健康检查:启动后自动检测进程存活(可配置检查时长,默认10秒),进程秒退立即报错并显示日志尾部辅助诊断。
PID 安全:通过进程创建时间二次校验,防止系统重启后 PID 复用导致误判或误杀。
13.4.2 使用方式
启动 funweb 后,在左侧导航栏点击「脚本部署」进入。
新建部署示例:
配置项 |
示例值 |
|---|---|
部署名称 |
my_worker |
项目根目录 |
/home/user/my_project |
启动命令 |
python main.py |
进程数量 |
2 |
自动启动 |
✓ |
自动重启 |
✓ |
项目根目录会自动加入 PYTHONPATH。脚本以后台方式运行(Linux 用 nohup,Windows 用静默后台进程),关闭 web 管理页面或 Flask 进程不影响已部署的脚本运行。
stdout/stderr 自动重定向到 {日志目录}/{部署名称}.nohup.log,多进程时每个进程独立日志文件。
13.4.2.2 funboost 查看日志按时间筛选范围说明
如果你要按时间范围筛选日志,请用nb_log。
funboost 后台会搜索 时间字符串,所以你的print和日志最开头需要是 %Y-%M-%d %H:%m:%S ,建议你导入使用nb_log,print和日志自动有这样的时间前缀。
如果你不想用nb_log,还想支持日志按时间范围筛选,需要确保你的控制台输出,每个打印前面都是有这个时间前缀 %Y-%M-%d %H:%m:%S
13.4.3 funweb 脚本部署功能说明
脚本部署功能不依赖 funboost 框架本身,可以部署任意 Python 脚本甚至非 Python 命令,只要能在命令行运行即可。
部署配置持久化在 Redis 中,重启 web 服务后配置不丢失。
兼容 Windows 和 Linux。
13.4.4 脚本部署功能截图
脚本部署列表页截图

脚本部署详情页截图

13.4.5 🆚 与传统方案对比
🏷️ 对比维度 |
🐢 Supervisor / Xshell / Jenkins |
🚀 funweb 脚本部署 |
|---|---|---|
配置方式 |
手写 |
Web 表单,点击保存即生效 |
代码更新 |
手动 SSH + |
一键 Git Pull + 自动重启(支持分支切换) |
日志查看 |
|
Web 端时间范围 + 关键字搜索,10GB 毫秒级响应 |
进程守护 |
Supervisor 需额外部署 / nohup 无保活 |
内置守护线程,崩溃自动重启 |
健康检查 |
Supervisor 仅显示 FATAL |
秒退时自动弹出 Traceback 堆栈 |
PID 安全 |
PID 复用可能误杀其他进程 |
PID + 创建时间双重校验,绝不误杀 |
跨平台 |
Supervisor 不支持 Windows |
Win/Linux 双端一致 |
权限要求 |
Supervisor 需 root |
普通用户即可运行 |
多进程扩容 |
手动重复执行命令 |
修改进程数字段,一键重启 |
协同成本 |
教 QA 敲命令行很困难 |
分享 URL,非技术人员也能点击操作 |
操作透明度 |
操作后仅提示成功/失败 |
弹框显示完整 Shell 命令和工作路径 |
13.4.6 funweb 是否支持远程部署(部署到其他机器)?
答:funweb 可以在你自己的电脑开浏览器,打开网址,点击部署到远程机器。
例如你的linux机器ip是 10.1.2.3 你在linux机器部署启动 funweb ,暴露端口,假设端口是 27011
然后你再自己的浏览器,打开 10.1.2.3/27011 ,登录,点击网页左侧脚本部署模块
你点击 更新重启 按钮就可以更新拉取git仓库代码,并启动脚本。
13.5 funweb 系统功能-资源监控
你把funweb部署在任何电脑,就能持续采集和监控该电脑的cpu 内存 磁盘使用率了。
实现方式是有个线程,每隔10秒使用psutil采集服务器的资源使用率,保存到redis zset中。
funweb页面展示这些指标的实时仪表盘以及长期走势曲线。
实现代码在 funboost\funweb\system_monitor.py
funweb 系统功能-资源监控 截图

13.6 📖 funweb 系统功能 - 通用日志查看器
funweb 内置的日志查看器是一个功能强大的系统级组件。它旨在为开发者提供一个开箱即用、脱离 SSH 终端的 Web 日志排查方案。
13.6.2 ✨ 功能亮点
绝对通用的文件读取
不限编程语言:支持查看 Python, Java, Go 等任意语言生成的日志文件。
不限部署方式:完全独立于
funweb的“脚本部署”功能。无论程序是nohup挂起还是作为系统服务运行,只要是文本文件,皆可查看。
强大的检索与过滤
支持按精确的时间段(起止时间)对日志进行截取筛选。
支持对日志内容进行关键字搜索,快速定位异常(Exception/Error)堆栈。
极致的实时监控 (
tail -f体验)底层采用 SSE (Server-Sent Events) 单向事件流技术(
mimetype='text/event-stream')。实现以毫秒级极低延迟,将服务器产生的最新日志增量实时推送到网页端,拒绝卡顿与重复加载。
日志查看器截图
眼又极其清晰的“彩色日志” 这绝对是排查问题的最大爽点!传统的 tail -f 往往是一坨黑白乱码,看久了眼睛疼。

13.7 funweb 告警配置功能
funweb 内置了轻量级告警系统,无需额外部署监控组件,在 Web 页面上即可完成告警规则的创建、编辑、启停,以及告警记录的查看。后台每 10 秒自动从 Redis 采集各队列的运行指标,与用户配置的告警规则进行比对,触发告警后自动推送通知到企业微信/钉钉/飞书/Webhook。
13.7.1 支持的 5 种告警类型
告警类型 |
标识 |
触发条件 |
阈值说明 |
|---|---|---|---|
📦 积压超标 |
|
队列待消费消息数 >= 阈值 |
填写消息条数,如 |
📉 QPS 骤降 |
|
近 10 秒 QPS <= 阈值(且有消费者在线) |
填写 QPS 下限,如 |
🔌 消费者掉线 |
|
队列无活跃消费者 |
无需设置阈值,自动检测 |
📈 失败率飙升 |
|
近 10 秒失败率 >= 阈值%(且调用数 >= 最少调用数) |
填写百分比,如 |
⏱ 耗时过高 |
|
近 10 秒平均函数执行耗时 >= 阈值 |
填写秒数,如 |
数据来源说明:所有指标均由消费者进程每 10 秒主动心跳上报至 Redis,后台检查线程每 10 秒从 Redis 读取并比对规则。无需重启即可生效。
13.7.2 支持的通知渠道
渠道 |
标识 |
说明 |
|---|---|---|
企业微信 |
|
填写企业微信群机器人 Webhook 地址 |
钉钉 |
|
填写钉钉群机器人 Webhook 地址 |
飞书 |
|
填写飞书群机器人 Webhook 地址 |
自定义 Webhook |
|
填写任意 HTTP 地址,POST JSON |
13.7.3 告警记录
页面下方展示告警记录列表,包含以下信息:
告警时间
告警详情(如"队列 queue_order 积压 1523 >= 1000")
触发规则名称和队列名
告警记录存储在 Redis 有序集合中,最多保留 500 条,30 天自动过期。
13.7.4 告警去重机制
为防止同一问题反复告警刷屏,每条规则对每个队列都有独立的告警间隔控制:
同一规则 + 同一队列,在告警间隔时间内(默认 300 秒)不会重复发送告警
间隔时间可在规则配置中自定义,最小 60 秒
13.7.5 告警消息格式示例
当告警触发时,推送的消息格式如下:
🚨 [Funboost 告警]
队列 queue_order 积压 1523 >= 1000
告警时间: 2026-05-09 14:30:00
告警规则: 订单队列积压告警
告警来源: 10.0.0.5 (PID: 12345)
13.7.6 告警配置截图
告警规则列表页






