前端架构破局 - NodeJS 落地 WebSocket

Posted 前端巅峰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前端架构破局 - NodeJS 落地 WebSocket相关的知识,希望对你有一定的参考价值。

是全双工通信协议,当客户端与服务端建立连接之后,双方可以互相发送数据,这样的话就不需要客户端通过轮询这种低效的方式获取数据,服务端有新消息直接推送给客户端即可。

传统 HTTP 连接方式如下:

框架中。

但是也许你不清楚,Socket.IO 并不是一个纯粹的 WebSocket 框架。它是将 Websocket 和轮询机制以及其它的实时通信方式封装成了通用的接口,以实现更高效的双向通信。

严格来说,Websocket 只是 Socket.IO 的一部分。

也许你会问:既然 Socket.IO 在 WebSocket 的基础上做了那么多的优化,并且非常成熟,那为什么还要搭一个原生 WebSocket 服务?

首先,Socket.IO 不能通过原生的 ws 协议连接。比如你在浏览器试图通过 ws://localhost:8080/test-socket 这种方式连接 Socket.IO 服务,是连接不上的。因为 Socket.IO 的服务端必须通过 Socket.IO 的客户端连接,不支持默认的 WebSocket 方式连接。

其次,Socket.IO 封装程度非常高,使用它可能不利于你了解 WebSocket 建立连接的原理。

因此,我们本篇就用 Node.js 中基础的 ws 模块,从头开始实现一个原生的 WebSocket 服务,并且在前端用 ws 协议直接连接,体验一把双向通信的感觉!

是 Node.js 下一个简单快速,并且定制程度极高的 WebSocket 实现方案,同时包含了服务端和客户端。

ws 搭建起来的服务端,浏览器可以通过原生 WebSocket 构造函数直接连接,非常便捷。ws 客户端则是模拟浏览器的 WebSocket 构造函数,用于连接其他 WebSocket 服务器进行通信。

注意一点:ws 只能在 Node.js 环境中使用,浏览器中不可用,浏览器请直接使用原生 WebSocket 构造函数

下面开始接入,第一步,安装 ws:

$ npm install ws

安装好后,我们先搭建一个 ws 服务端。

然后运行:

$ node ws-server.js

这样一个监听 8080 端口的 WebSocket 服务器就已经跑起来了。

然后用浏览器打开,看到打印如下:

事件的回调函数,参数是一个 MessageEvent 的实例对象,服务端发来的实际数据需要通过 mevt.data 获取。

而在 ws 客户端,这个参数就是服务端的实际数据,直接获取即可。

连接:

app.ws(的路由组并指向 websocket.js 文件,代码如下:

就可以访问到这个子路由。

路由组的作用是定义一个 websocket 连接组,不同需求连接这个组下的不同子路由。比如可以将 单聊群聊 设置为两个子路由,分别处理各自的连接通信逻辑。

完整代码如下:

就是 WebSocket 实例,表示建立的连接。

属性,赋值为一个函数来监听服务端消息:

ws.onmessage = 方法用于发送信息,向服务端发送数据:

ws.send(属性,以及 send 方法都是一致的。不过因为服务端是 Node.js 实现,因此会有更丰富的支持。

比如下面两种监听事件的写法效果是一样的:

模块提供了快捷的获取方法:

怎么获取:

后,我们看看它到底是什么样子。经过打印,发现它的数据结构比想象到还要简单,就是由所有在线客户端的 WebSocket 实例组成的一个 Set 集合。

那么,获取当前在线客户端的数量:

wss.clients.size

简单粗暴的实现广播:

wss.clients.forEach(存储在线客户端的状态和数据,这样检索分类更快,效率更高。

局部广播实现,那一对一私聊就更容易了。找到两个客户端对应的 WebSocket 实例互发消息就行。

建立连接的第一步是客户端发起一个 HTTP 的连接请求,那么我们在这个 HTTP 请求上做验证,如果验证失败,则中断 WebSocket 的连接创建,不就可以了?

顺着这个思路,我们来改造一下服务端代码。

因为要在 HTTP 层做校验,所以用 http 模块创建服务器,关掉 WebSocket 服务的端口。

连接服务端时,服务端会进行协议升级,也就是将 http 协议升级成 websocket 协议,此时会触发 upgrade 事件:

server.on(认证简单说就是账号+密码认证,而且账号密码是带在 URL 里的。

假设我有账号是 ruims,密码是 123456,那么客户端连接是这样:

就是 ruims:123456 的 base64 编码,服务端可以获取到这个编码来做认证。

Quary 传参比较简单,就是普通的 URL 传参,可以带一个短一点的加密字符串过去,服务端获取到该字符串然后做认证:

协议连接,那 wss 是什么意思?

其实非常简单,和 https 原理一摸一样。

https 表示安全的 http 协议,组成是 HTTP + SSL

wss 则表示安全的 ws 协议,组成是 WS + SSL

那为什么一定要用 wss 呢?除了安全性,还有一个关键原因是:如果你的 web 应用是 https 协议,你在当前应用中使用 WebSocket 就必须是 wss 协议,否则浏览器拒绝连接。

配置 wss 直接在 https 配置中加一个 location 即可,直接上 nginx 配置:

location /websocket 
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection upgrade;

然后客户端连接就变成了这样:

var ws = new WebSocket(\'wss://[host]/websocket\')
BFF 应用

BFF 或许你听说过,全称是 Backend For Frontend,意思是为前端服务的后端,在实际应用架构中属于前端和后端的一个 中间层

这个中间层一般是由 Node.js 实现,那么它有什么作用呢?

众所周知,现在后端的主流架构是微服务,微服务情况下 API 会划分的非常细,商品服务就是商品服务,通知服务就是通知服务。当你想在商品上架时给用户发一个通知,可能至少需要调两个接口。

这样的话对前端其实是不友好的,于是后来出现了 BFF 中间层,相当于一个后端请求的中间代理站,前端可以直接请求 BFF 的接口,然后 BFF 再向后端接口请求,将需要的数据组合起来,一次返回前端。

那我们在上面讲的一大堆 WebSocket 的知识,在 BFF 层如何应用呢?

我想到的应用场景至少有 4 个:

  1. 查看当前在线人数,在线用户信息
  2. 登录新设备,其他设备退出登录
  3. 检测网络连接/断开
  4. 站内消息,小圆点提示

这些功能以前是在后端实现的,并且会与其他业务功能耦合。现在有了 BFF,那么 WebSocket 完全可以在这一层实现,让后端可以专注核心数据逻辑。

由此可见,掌握了 WebSocket 在 Node.js 中的实践应用,作为前端的我们可以破除内卷,在另一个领域继续发挥价值,岂不美哉?

源码+答疑

本文所有的代码都是经过我亲自实践,为了便于小伙伴们查阅和试验,我建了一个 GitHub 仓库专门存放本文的完整源码,以及之后文章的完整源码。

仓库地址在这里:https://github.com/ruidoc/blog-codes

欢迎大家查阅和试验。

首发公众号

如果本文对你有启发,请左手一个,右手一个在看,祝你脱单不脱发,早日成为技术专家~

如对文中细节有疑问,欢迎加微信咨询~ 

阿里云天池Apache Spark落幕:AI医疗进入落地实践深水期,达摩院如何用生态破局?

机器之心原创

作者:徐丹
一次疫情,让阿里达摩院医疗 AI 团队一战成名。

他们利用整个假期,疫情爆发初期迅速将技术落地,率先在「郑州小汤山」落地的第一套 CT 影像识别系统代码和图片已经被分别收藏在中国国家博物馆和中国科技馆。

疫情之后,达摩院医疗 AI 产品迅速进入落地阶段,成长与痛点并存。

面对技术落地面临的普遍困境,达摩院以「数字人体」系列比赛为抓手,逐渐搭建起行业生态。


10 月 10 日,AI 医疗行业最高规格赛事——阿里云、英特尔(中国)有限公司联合主办的 Apache Spark AI 在杭州落下帷幕。

脊柱外科疾病已经越来越困扰着老年人及久坐的上班一族,脊柱病变发展缓慢且不明显,长此以往会压迫神经和血管,甚至造成大脑指挥失灵。

此次比赛正是瞄准脊柱外科疾病,参与者需要提供提供全自动算法来定位锥体、椎间盘的位置和相应分类以帮助筛查病例。

比赛历时 121 天,覆盖了脊柱外科疾病核心症状 7 种。来自学校、科研机构、医疗企业等各个地方的 3330 名选手组成了 3107 支参赛队伍。

这些开发者们将单个病灶诊断准确度提高至 70%,单个病例筛查时间提高至 0.05min。

阿里云天池是全球最大规模的大数据赛事平台,从 2017 年便开始深耕 AI 医疗赛道举办「数字人体」系列比赛, Apache Spark AI 已经是该系列的第三场。

天池大赛的背后,是阿里云磨砺医疗 AI 决心。

软硬协同,英特尔新款 CPU「首秀」

2017 年,阿里云天池第一届「数字人体」比赛正式启动,如今已经走过了三个年头,前两届分别聚焦于宫颈癌风险智能和肺部结节智能诊断。

今年脊柱智能诊断大赛传承了以往比赛中的开放性、权威性。

比赛并不是在阿里内部的「孤军作战」,而是延续了阿里一贯的生态打法,联合了行业中的多个合作伙伴,比如湘雅医院、解放军 301 医院等骨科医疗界权威专家;香港大学、南洋理工大学、浙江大学等学术资源。

同时首次开放了具备行业共识和全球影响力的 MRI 骨科数据集,具有行业里程碑式的意义。

但相比前两场,此次比赛也有一定的创新。相比前两场有一定的创新,首先这是「数字人体」系列首次应用开源 Apache Spark 技术。如今开源 Spark 技术已经在中国技术圈里生根发芽,获得越来越多开发者的信赖,这次天池大赛也将 Spark 技术推向了医疗领域。

另外参赛选手更加开放,除学生外,还有大量来自科研机构、互联网企业的开发者。在闯入决赛的 6 支队伍中,既有来自「北京大学前沿交叉学科研究院」的研究生,也有来自国内外医疗 AI 企业的从业人员,比如健康管理企业「妙健康」和硅谷「深透医疗」的工程师。

比赛也取得了很多成果,「我们开放了经过行业认证的 MRI 优质骨科数据集,发布了英特尔和 ECS 编制的白皮书,各个算法团队将单个病灶诊断准确度提高至 70%,单个病例筛查时间提高至 0.05min。」达摩院人工智能工程中心负责人华先胜说。

阿里云天池Apache Spark落幕:AI医疗进入落地实践深水期,达摩院如何用生态破局?


值得注意的是,此次 Apache Spark 还是英特尔第三代至强可扩展处理器的「首秀」。今年 6 月 18 日英特尔全球发布了新款 CPU,Spark AI 算是其首次在公开环境中使用并产生成果。

「随着数据越来越多,我们需要有越来越大的算来解决和处理数据的问题。」阿里云计算平台总经理贾扬清表示,云平台和英特尔等硬件制造商的软硬件协同设计变得越重要,「今天硬件提供越来越多的能力,软件特别像海棉一样把算力吸起来,这才能产生高效广泛的应用。」

阿里云天池Apache Spark落幕:AI医疗进入落地实践深水期,达摩院如何用生态破局?

(阿里云计算平台总经理贾扬清)

今年 6 月 18 日英特尔全球发布了第三代至强可扩展处理器(Cooper Lake),继续加大其在内置 AI 加速方面的投入,将 bfloat16 支持整合到其独有的深度学习加速技术(增强型英特尔 Deep Learning Boost)当中。支持同时为 CPU 的 AI 训练和推理性能提供加速。

根据英特尔工程师,增强型英特尔 Deep Learning Boost 可将人工智能推理和训练性能最高提升 1.87 倍,自然语言处理的训练性能提升 1.7 倍,推理提升 1.9 倍。

复赛 CPU 赛道同时使用了英特尔开源的 Analytics Zoo。Analytics Zoo 是一个统一的大数据和 AI 平台,可无缝地将 Spark、TensorFlow、PyTorch 和 Ray 程序集成到一个端到端的流水线中。

复赛选手基于 Analytics Zoo 集成的英特尔优化 TensorFlow 和 PyTorch 框架以及 bfloat16 的加速能力,有效提高了赛题的训练和推理性能。

「我们希望做的事情是让英特尔的硬件制造商和云计算的云服务商一起合作,给产业界和科研人员提供更好的算法、数据和算力。」英特尔大数据技术全球 CTO Jason dai 表示。

4 年耕耘,「AI 医疗是未来,阿里必须做」

「数字人体」系列比赛的背后是达摩院在医疗 AI 行业的长期耕耘。

「达摩院」的名字被整个医疗 AI 行业记住是在疫情期间,疫情爆发之初,达摩院就迅速将 AI 技术投入到医疗实践。

先是连夜研发智能疫情机器人,免费拨打控摸排电话排查身体异常人群;后又将 AI 算法正式用于新馆肺炎病原学检测,并与浙江省疾控中心合作,用算法将疑似病例基因分析时间缩至半小时。

2 月 15 日,达摩院还基于 5000 CT 影像样本数据快速研发出了 CT 影响算法,在郑州小汤山上线,可以在 20 秒内对新冠疑似患者 CT 影像做出判读,并量化病症的轻重程度,目前分析结果准确率达到 99%。

如今,达摩院算法识别标注的第一张新冠肺炎 CT 影像的代码和照片就被分别收藏在中国国家博物馆和中国科技馆。

或许整个达摩院都没有预料到自己的技术能如此迅速的在实践中产生作用,疫情期间的成就来源于持续 4 年的积累与坚守。

「人工智能进入医疗健康领域是一个必的事情,阿里没人做怎么行?」达摩院医疗 AI 团队的成立是来自于华先胜对未来精准的预判。在 AI 已经渗透到各行各业之时,医疗在当时还是待开垦的沃地。

阿里云天池Apache Spark落幕:AI医疗进入落地实践深水期,达摩院如何用生态破局?

(达摩院人工智能工程中心负责人华先胜)

在团队刚刚搭建的 2016 年,人工智能如何在医疗领域发挥作用还并不清晰,达摩院毅然冲进了这片 “无人区”,决定先研发技术,定下了「允许医疗先不赚钱」的规定,从肺部 CT 影像开始切入医疗 AI。

2017 年,达摩院正式成立前期就在国际权威的肺结节检测大赛上打破世界纪录,将在样本数据中成功发现结节占比的比例提升至 89.7%。后来这项技术直接为第一套新冠 CT 自动诊断系统打下了基础。

此后达摩院技术持续突破,在 Nature 子刊、CVPR 等顶尖学术期刊与会议上,发表了多篇论文。

但彼时达摩院还没有清晰的技术商业化路径,直到疫情为团队,甚至整个 AI 医疗行业技术落地按下了加速键。

抗疫高峰期时,医院影像科业务量飞速增长,多数医生加班加点通宵读片,但仅靠肉眼测评耗时且不精准,不少医院认识到 AI 医疗影像判读的价值;疫苗研发迫在眉睫,一些 AI 技术也进入了医药研发领域;远程医疗逐渐普及,「智能问诊机器人」等产品的需求开始增加,医院加速进行数字化转型…

这些这些逐渐明晰的落地场景都验证了华先胜先生最初的判断。据 IDC 数据,2025 年人工智能应用市场总值将达到 1270 亿美元,其中医疗行业将占市场规模五分之一。

但需要清醒认识到的是,医疗领域专业、复杂,技术落地从来不是一个简单的事情。在整个行业都逐渐从理论向实践转型的过程中,还面临着非常多的痛点。

比如高质量数据的缺失。医疗影像数据面临着质量参差不齐,标准化程度低、人工标注难度大等诸多行业性难题。没有数据集,算法的精度和准确性便得不到保证。

行业人才也缺失。「AI」和「医疗」都是专业性极强的领域,AI + 医疗需要的也是复合型人才,但目前全球生物医学交叉领域选手都非常少。

很多医疗 AI 领域科研人员在学校都很难接触到真实的医学场景,都是从技术角度切入产品研发,学术味浓但未必适合医生使用。

新京报「寻找中国创客」报道曾指出,有时一家三甲医院能同时安装 10 余家 AI 公司的产品,同质化严重,医院真正使用的只有一两家。

如何解决?阿里的做法是,以比赛为切入点打入行业生态。

「每一个选手解决的小问题都能推动行业前进」

在一定程度上,「数字人体」系列比赛也可以说是达摩院的「黄埔军校」,一些优秀的比赛选手日后都进入到了阿里云工作,这让阿里云在医疗 AI 领域首先就跑赢在了「人才」的起跑线上。

「医疗 AI 领域还没有现成的人才,目前人才都是用非专业的,民间众筹的方式培养出来,好处就是可以挑选出对这个领域有发自内心热爱的人。

我们希望这个比赛可以为也许现在还不知道在哪里的同学种上一个梦想的种子,培养出一些复合型人才为产业座贡献。」阿里云市场营销和公共事务总经理刘湘雯说。

(阿里云市场营销和公共事务总经理刘湘雯)

「数字人体」系列比赛一直都是面向全行业开发者,此次 Spark AI 更加开放,尤其鼓励企业选手参赛,所以选手在接受不同领域知识时的成长也更加明显。

此次 GPU 赛道冠军便是一个「复合型团队」,由妙宜家健康科技集团、东北大学、中山大学联合组成。

谈及夺冠原因时,妙宜家常德杰表示直言,「在比赛过程中,我们需要和学生沟通、和专业的医生沟通,算法人员和业务人员沟通一定会存在障碍,但我们最后把遇见的问题都反映在了模型里,才取得了比较好的成绩。」

就具体问题而言,来自深透医疗的项磊举了一个例子,「判断椎间盘类别时,医生会只看椎间盘在哪,但算法人员并不知道椎间盘区域在哪。这就需要与医生配合,在设计算法时先设计分割的网络,分割出椎间盘区域以提高分类的精确性。」

此外,阿里云天池联合三甲医院开放的骨科数据集也让算法的训练环境更加接近真实的医疗场景。不少来自学校和科研机构的成员则更多希望把象牙塔的技术拿到实际医疗场景中「遛一遛」。

北京大学前沿交叉学科研究院张立从读博就开始就做医疗影像处理,但始终局限在学校科研领域,他表示参赛就是想将科研成果应用到医疗实践。

「我们组的科研方向就是医疗图像处理、计算机视觉算法等,一开始就有一个非常好的人体姿态识别检测算法,看到天池比赛,觉得我们的算法也有这样这样的拓展性,希望能找到脊柱影像识别等领域的应用方向。」

数据集的开放便可以在医疗场景和科研环境中架起一道桥梁。

「我们提供 500 多份的腰椎核磁的数据,7 种典型的锥体和椎间盘的状态,多样性、困难度都比较大,非常接近真实情况」华先胜表示。

很多开发者在真实的数据中都会碰见并想方设法解决以往没有遇见的问题,比如数据噪声大、结果太容易过拟合、算法模型在训练集上表现不错但测试集上结果并不好等。

每一个选手解决的小的问题汇聚在有 50 万开发者的天池平台上,就可以推动行业向前走一步。「虽然每次只能解决一个小的问题,但通过大会的推进便可以在领域中凝练问题进而推动产品和解决方案的落地。」

比赛结束后,阿里云会汇聚行业从业者、研究人员、医生就当下实际问题进行研讨和观点碰撞,不说官话,都是在探讨实践中遇见的问题、困境和可能的解决方案。


在此基础上,阿里云还将比赛的经验加以凝练总结,发布了《阿里云天池大赛赛题解析》,提取了阿里云天池 7 年 200 多场数据大赛精华,是国内首本针对大数据竞赛的图书,对于相关技巧、技术、内涵进行了详尽阐述。

阿里打法:比赛为抓手,构建 AI 医疗系统工程底座

开发者、三甲医院、专家智库、企业… 每一次的「数字人体」比赛也都是一次行业生态参与者的集会,阿里也正在医疗行业复制自己的「阿里打法」,要成为底层基础设施的建设者和行业解决方案的提供者。

「当年拿一个电脑拿一个简单的数据集应用的日子已经过去,人工智能落地非常强烈的需求就是要有一个系统工程底座,能够把从需求到解决方案的链路打通。」贾扬清说。

在贾扬清看来,人工智能在未来必然要经历一个「祛魅」过程,现在开发应用要从需求出发,需求 - 建模 - 模型迭代 - 上线 - 结果回流,是一个门厂的系统工程。

在未来,阿里云真正想要的构建的就是系统工程底座,将解决方案打包给需要的人。「五年后人工智能可能成为一个非常容易的工具给每个人使用。」

天池比赛就是构建平台非常重要的抓手。

「天池比赛已经承办了很多年,现在是做算法和代码的的平台,会聚集行业专家和开发者,我们希望在接下来的年月里能够跟大家一起共创人工智能下半场,真正实现产业数字化。」

✄------------------------------------------------

加入机器之心(全职记者 / 实习生):hr@jiqizhixin.com

投稿或寻求报道:content@jiqizhixin.com

广告 & 商务合作:bd@jiqizhixin.com


以上是关于前端架构破局 - NodeJS 落地 WebSocket的主要内容,如果未能解决你的问题,请参考以下文章

破局AI落地难,数据标注行业需率先变革丨曼孚科技

对话开发者:Serverless 落地的困境与破局

TICA 2019 图像识别在测试中落地实践

破局自动驾驶落地难,数据标注行业变革是关键丨曼孚科技

百度关于微前端架构EMP的探索:落地生产可用的微前端架构

旅游+NFT的破局者,BTV为旅游产业解决百年难题

(c)2006-2024 SYSTEM All Rights Reserved IT常识