三十年河东,三十年河西,莫欺前端穷

5,403 阅读8分钟

我永远记得2020年立冬那天,公司CTO指着消防通道旁的折叠桌说:"这是你们前端的新工位。"六台显示器挤在不到四米的狭长空间里,测试机的电源线垂下来,像一串羞辱的省略号。

【生如蝼蚁】

"让外包改个前端框架都磨蹭三天,这种垃圾就该滚回培训机构!"

"这个交互效果让前端自己折腾去,我们后端重点要保证分布式事务的一致性。"

"听说你们搞了个花哨的数据看板?这些花架子东西最费电了。"

"你们外包不要偷吃公司零食哈,这是给正式员工准备的"

作为一个外包前端,我已经习惯了上边这些话。后端、产品、运营、甚至扫地阿姨,都可以肆无忌惮的碾压我的自尊,这一切只因为,我是一个外包。

2020年,刚毕业的我和四个应届生一起来到这家不大不小公司,外包团队一共六个人,都是前端。我们还有一个前辈,比我们早来两年,但也一直没转正。这家公司重点是后端平台,前端在这里只是工具人,干活多,拿钱少,所以在其他人眼里,前端不过是可有可无的存在。

所有人对我们态度都很敷衍。我们甚至连代码仓库权限都没有,提交代码需要复制文件给后端帮忙提交。后端觉得前端是“切图仔”,产品觉得前端只是“实现工具人”,连测试都懒得详细写Bug描述,只甩一句 “你自己看着办”

我不反驳,也不抱怨。我知道,技术圈的地位,不是靠嘴巴争来的。

那天的项目会,我成了全公司笑柄。当我们抱着笔记本走进会议室时,行政部收走了所有空椅子。新来的CTO笑着说:“那个外包,你站着开会,站着开会精神”。我的脸瞬间胀的通红,却又无能为力。会议结束后,我们六个外包兄弟被安排搬到了消防通道的折叠桌......

没人喜欢被踩在脚下,特别是当你明明有能力,甚至比他们更懂技术的时候。此刻我攥紧双拳,指节发白,心底的呐喊如惊雷炸响:"莫欺少年穷!"

【卧薪尝胆】

有一天,公司后端团队遇到一个问题:他们的API网关负载过高,服务器压力陡增,CDN缓存也失效严重,用户体验下降。但短时间内找不到合适的方案优化。

我注意到了这个问题。

表面上看,网关负载高是后端的问题,但我意识到,前端如果能够在客户端做一定的缓存策略,减少不必要的请求,也许能缓解服务器压力。我试着写了一个本地缓存模块,并利用Service Worker进行请求拦截,实现边缘缓存。简单来说,就是在前端做一层“近端缓存”,避免重复请求。

核心技术点包括:

  • Service Worker 拦截 API 请求,先查询本地缓存,如果缓存命中则直接返回,避免重复请求后端。
  • IndexedDB 作为持久化存储,保证缓存数据即使刷新页面也能保留。
  • 基于请求参数构造唯一键,保证不同请求不会互相污染。

我没有多说,一切在都心里。

这次尝试让我意识到一个问题:前端的价值,远不止页面交互。传统认知里,前端只是个展示层,但如果把前端的计算能力利用起来,能做的远比想象中多。

我开始研究WebAssembly、Service Worker、P2P分布式计算。这些技术看起来都很零散,但我有个想法:

能不能利用前端的天然分布式特点,做一个边缘计算平台?

【蝼蚁弑天】

凌晨三点的应急灯管下,我们像群昼伏夜出的矿工。同事小张把测试机架在消防栓上,显示器蓝光映着墙角的"安全出口"标识。"明哥,自研引擎的编译速度还是上不去。" 他敲了敲充电宝,"这已经是第三块了。"

我蜷缩在消防通道的折叠椅上,撕开第十三包速溶咖啡,舔了舔干裂的嘴唇。

"原来如此..." 我盯着突然暴涨的API错误码冷笑。那帮高傲的后端根本不懂,他们精心设计的微服务架构,正在被自己的分布式锁反噬。

我猛地灌了口冷掉的咖啡,苦涩在舌尖炸开。手指在键盘上飞舞,突然灵光一闪——或许可以 "用WebAssembly重写TensorFlow模型?"

当首个WebAssembly计算核在Chrome隐身模式跑通时,我们发现了更惊人的秘密——用户设备的GPU算力池,比企业级服务器高出三个数量级。

"用BloomFilter做动态任务分片!" 我对着白板上的架构图比划,"每个Service Worker都是边缘计算节点,通过WebRTC广播算力值。"

"成了!"前辈老赵突然从机房探出头,他手里还攥着偷接出来的服务器网线,"Node中间层扛住十万QPS了!"我们六个前端同时摸出充电宝给测试机续电,此起彼伏的电源指示灯像深夜的烽火台。

当黎明咬破天际时,三千行WASM字节码在血管里沸腾,我自研的分布式边缘计算框架就此出生,我给他起名:ByeJava

【弑神时刻】

双11零点刚过,监控大屏突然血红一片。CTO引以为傲的Java微服务架构开始雪崩,而我们的边缘计算节点正疯狂扩容。

"让那个外包试试?" 角落里突然响起后端Leader的声音。所有人转头看向蜷缩在杂物间的我,显示屏的蓝光把我的影子投射在天花板上,宛如魔神降世。

我按下回车键的瞬间,ByeJava启动界面如业火燎原。二十万台用户设备同时震颤,P2P网络在量子纠缠中苏醒,被封印在民间的算力化作滔天洪流。

大屏上的QPS曲线突然直角拉升,像一柄利剑刺破预警红线。在众人惊恐的注视中,我缓缓起身,工牌上的"临时"标签不知何时变成了鎏金的 "CTO"

【我即天命】

2024年年会现场,酒店会场的镁光灯下,我回忆起曾经的嘲笑,我对着话筒轻笑:"感谢曾经把少年逼成恶龙的人。"

大屏突然切换,ByeJava3.0 已经取代了公司后端服务的半壁江山。我张开双臂,身后浮现出全司实时算力分布图,每一粒光子都在向我俯首称臣。

整个酒店大厅的灯光突然暗下,无数架ByeJava3.0边缘计算控制的无人机缓缓升起,在夜空拼出八个中文大字:莫欺前端穷!

【技术方案】

1. 技术架构

image.png
  • 云端任务协调中心

    • 采用 Node.js 处理任务分配、负载均衡,并利用 Redis/Kafka 作为消息队列。
    • 使用 WebSocket 监听任务执行状态,并协调计算任务。
  • 边缘节点

    • 使用 Node.js 和 Docker 运行计算任务,并缓存计算结果。
    • 通过 WebRTC 实现边缘节点和前端设备的 P2P 计算协作。
  • 终端用户设备

    • 使用 WebAssembly 进行高性能计算,如 AI 推理、图像处理等。
    • 通过 WebRTC 实现计算任务的分布式共享。
    • 使用 Service Workers 和 Web Workers 执行计算任务。

2. 任务调度机制

2.1 任务分发

  1. 云端协调中心 接收计算任务,并判断是否可在本地或边缘执行。

  2. 如果终端计算资源足够,任务直接在用户设备上执行(如 WebAssembly)。

  3. 如果任务复杂,则云端协调中心:

    • 调度最近的边缘节点(Node.js)执行任务。
    • 采用 P2P 方式让多个用户设备共享计算任务。

2.2 任务执行

  • 前端设备

    • 计算任务拆分成小块,由 WebAssembly + Web Workers 并行执行。
    • 计算结果通过 WebRTC 共享,或通过 WebSocket 上报云端。
  • 边缘节点

    • 如果终端设备负载高,任务被推送到边缘节点(Node.js + Docker)。
    • 使用 Kubernetes 进行任务调度,动态扩展计算资源。

2.3 任务结果合并

  • 计算完成后,所有结果返回云端或边缘节点,并进行数据整合。

3. 关键代码示例

3.1 WebRTC P2P 数据传输

const peerConnection = new RTCPeerConnection();

// 创建数据通道
const dataChannel = peerConnection.createDataChannel("computeData");

dataChannel.onopen = () => {
    dataChannel.send(JSON.stringify({ task: "compute", data: [1, 2, 3] }));
};

dataChannel.onmessage = (event) => {
    console.log("Received computed data:", event.data);
};

3.2 WebAssembly 计算任务

// simple.wasm (C 代码)
#include <emscripten.h>

EMSCRIPTEN_KEEPALIVE
int compute(int a, int b) {
    return a + b;
}
WebAssembly.instantiateStreaming(fetch('simple.wasm'))
  .then(obj => {
      console.log(obj.instance.exports.compute(5, 10));
  });

3.3 Node.js 任务调度

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', ws => {
    ws.on('message', message => {
        const task = JSON.parse(message);
        if (task.type === 'compute') {
            // 任务分发到边缘节点
            distributeTask(task.data);
        }
    });
});

function distributeTask(data) {
    console.log("Task assigned to edge node:", data);
    // 可通过 Kafka / Redis 进一步优化
}

【彩蛋】

行政部更换了所有办公室的智能门禁,其实是我们用TensorFlow.js训练的姿态识别系统。当前任CTO最后一次企图用门禁卡刷开机房时,摄像头捕捉到他颤抖的手部骨骼——这个动作特征早已被我们的边缘模型标记为"危险权限请求"。