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,可以让界面仅显示你关心的项目的队列,减少无关返回信息的干扰。 设置关心的项目 care_project_name

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

消费速度图:可查看实时和历史消费速度
从函数结果表,统计的消费速率

运行中消费者 by ip: 根据ip搜索有哪些消费者
运行中消费者按ip分组

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

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

队列操作,查看消费者详情:查看队列的所有消费者详情
队列操作-消费者详情

队列操作,查看消费者的BoosterParams配置 队列操作-消费者配置

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

rpc调用:在网页上对30种消息队列发布消息并获取消息的函数执行结;以及可根据taskid获取结果。
rpc调用,成功时候界面变绿色 rpc调用,出错时候界面变红色

定时任务管理:列表页 [定时任务列表]

定时任务:新增 添加定时任务

定时任务:任务详情 定时任务详情

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 脚本部署功能截图

脚本部署列表页截图 alt text

脚本部署详情页截图 alt text

13.4.5 🆚 与传统方案对比

🏷️ 对比维度

🐢 Supervisor / Xshell / Jenkins

🚀 funweb 脚本部署

配置方式

手写 .ini / 命令行 / Pipeline

Web 表单,点击保存即生效

代码更新

手动 SSH + git pull + 重启

一键 Git Pull + 自动重启(支持分支切换)

日志查看

tail -f / grep / 部署 ELK

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 系统功能-资源监控 截图 alt text

13.6 📖 funweb 系统功能 - 通用日志查看器

funweb 内置的日志查看器是一个功能强大的系统级组件。它旨在为开发者提供一个开箱即用、脱离 SSH 终端的 Web 日志排查方案。

13.6.2 ✨ 功能亮点

  1. 绝对通用的文件读取

    • 不限编程语言:支持查看 Python, Java, Go 等任意语言生成的日志文件。

    • 不限部署方式:完全独立于 funweb 的“脚本部署”功能。无论程序是 nohup 挂起还是作为系统服务运行,只要是文本文件,皆可查看。

  2. 强大的检索与过滤

    • 支持按精确的时间段(起止时间)对日志进行截取筛选。

    • 支持对日志内容进行关键字搜索,快速定位异常(Exception/Error)堆栈。

  3. 极致的实时监控 (tail -f 体验)

    • 底层采用 SSE (Server-Sent Events) 单向事件流技术(mimetype='text/event-stream')。

    • 实现以毫秒级极低延迟,将服务器产生的最新日志增量实时推送到网页端,拒绝卡顿与重复加载。

日志查看器截图

眼又极其清晰的“彩色日志” 这绝对是排查问题的最大爽点!传统的 tail -f 往往是一坨黑白乱码,看久了眼睛疼。

alt text

13.7 funweb 告警配置功能

funweb 内置了轻量级告警系统,无需额外部署监控组件,在 Web 页面上即可完成告警规则的创建、编辑、启停,以及告警记录的查看。后台每 10 秒自动从 Redis 采集各队列的运行指标,与用户配置的告警规则进行比对,触发告警后自动推送通知到企业微信/钉钉/飞书/Webhook。

13.7.1 支持的 5 种告警类型

告警类型

标识

触发条件

阈值说明

📦 积压超标

backlog

队列待消费消息数 >= 阈值

填写消息条数,如 1000

📉 QPS 骤降

qps_drop

近 10 秒 QPS <= 阈值(且有消费者在线)

填写 QPS 下限,如 5

🔌 消费者掉线

consumer_lost

队列无活跃消费者

无需设置阈值,自动检测

📈 失败率飙升

fail_spike

近 10 秒失败率 >= 阈值%(且调用数 >= 最少调用数)

填写百分比,如 20 表示 20%

⏱ 耗时过高

avg_time_high

近 10 秒平均函数执行耗时 >= 阈值

填写秒数,如 30

数据来源说明:所有指标均由消费者进程每 10 秒主动心跳上报至 Redis,后台检查线程每 10 秒从 Redis 读取并比对规则。无需重启即可生效。

13.7.2 支持的通知渠道

渠道

标识

说明

企业微信

wechat

填写企业微信群机器人 Webhook 地址

钉钉

dingtalk

填写钉钉群机器人 Webhook 地址

飞书

feishu

填写飞书群机器人 Webhook 地址

自定义 Webhook

webhook

填写任意 HTTP 地址,POST JSON {"content": "消息内容"}

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 告警配置截图

告警规则列表页 alt text