HR在各办公室门口张贴公告,
要求员工扫码填问卷上报健康状况;
各团队负责人花式发送各种邮件,
将疫情期间的工作安排告知有关成员;
高管助理三天两头打电话给不同部门,
转达老板的最新指示;
员工们用不同排列组合建了N多个群,
讨论疫情、八卦,以及午饭吃啥。
特殊时期,各种消息满天飞,
大家关注之余都感觉好累……
抗“疫”+有序复工的关键时期,企业如何在管理层面实时了解所有员工的健康信息,怎样第一时间获得员工报告的异常信息,又如何将最新战疫政策发布到各层级……这些都是企业目前最关注的问题,当然也有不少企业正在考虑将这样的功能集成到公司内部办公系统中。
微软一直致力于通过技术助力“战疫”,为了帮助企业在疫情期间及时高效地传递信息,前不久我们组织技术专家基于Azure 云原生技术搭建了“一站式防疫信息实时互动开源项目” (即刻查看文章回顾活动详情)并详细解读了项目功能和应用场景。
今天我们邀请微软应用开发解决方案专家,从技术层面实力解读,这个开源平台如何实现企业所需的信息实时互动服务。
![](http://www.ctiforum.com/uploadfile/2020/0303/20200303103125569.jpg)
开源项目架构
本次开源项目主要基于Azure SignalR服务搭建,该服务可以帮助我们轻松地为Web应用添加实时通信能力。高频数据更新(如游戏、投票、轮询)、仪表板、监视、聊天、地图实时定位、实时定向广告,甚至IoT和互联设备,以及基于事件的实时触发器等场景,都是这个服务可以大展拳脚的舞台。
同时该服务还可以与其他Azure服务无缝集成,进而扩展出很多实用功能。
具体可参考微软官方文档:https://azure.microsoft.com/zh-cn/services/signalr-service/
本次项目主要实现了基于两类用户的应用场景:
- 企业员工:员工在企业自己的网页、小程序、移动应用上日常办公时,可以实时接收企业针对疫情信息的实时推送;
- 企业管理用户:管理者可以自定义消息将疫情管理信息,并实时发送到每个员工的客户端上,同时还可以在监控台实时看到员工针对疫情信息的反馈和员工疫情的统计信息。
![](http://www.ctiforum.com/uploadfile/2020/0303/20200303103221188.jpg)
实际上在这个开源项目中,还包含了很多有趣的功能实现,例如对公司对疫情信息的语音播报、针对疫情视频评论的实时广播、员工对疫情信息的反馈统计的实时统计报表等。
开源项目架构:
- 员工/管理员界面:员工功能页面,包含视频、视频弹幕、消息实时统计柱状图、疫情信息通知栏;管理员管理页面,包含了信息的发布文本框。
- 管理员发送的信息通过Azure SignalR服务广播到客户端。
- 员工通过PC、移动设备访问功能页面时,可以实时接受管理台发送的消息。同时也可以在视频中发送弹幕,弹幕会实时广播到所有访问该页面的用户客户端中。实时消息的接收和发送都是通过Azure SignalR服务完成的。
- 针对管理员发送的实时疫情信息,可以直接调用Azure认知服务API来实现对文本的语音播报。
![](http://www.ctiforum.com/uploadfile/2020/0303/20200303103257856.jpg)
在这个Demo代码中,如果企业想应用这个疫情实时通知能力,只需在现有功能页面(可能是一个网站或微信小程序,或者使用了JS技术的移动应用)中增加非常少的代码改动,就可以快速在现有功能上增加实时疫情通知功能。
为何选择Azure SignalR 服务
接下来,我们一起看看本次开源项目为何选择Azure SignalR 来实现项目核心功能。
Azure SignalR 作为实时消息通知的核心,用户只需创建实例,就能在程序中进行调用。当然,企业也可以选择Azure SignalR 之外的实时通讯服务,但会增加以下问题:
- 实时消息通知时,需要后台一有消息前端就立即体现,如何保证信息可以实时发送?
- 客户端网络不稳定,如何保证客户应用体验,即:如何解决在网络中断又恢复后的信息可达?
- 如何实现流式数据,如疫情视频流实时同步的需求?(不同于处理块状文本消息,处理流式数据还需要考虑如何分片打包的问题)
- 用户可能采用了各种不同设备或浏览器,如何完美适应不同客户端?
- 公司现有应用已经微服务化,不同团队用了不同的语言平台,如何让不同服务可以顺畅对接实时通讯模块?
- 系统实现时没有考虑实时通讯,业务部门突然要求一两天就要上线实时通讯功能,怎么快速实现?
- 如果用户访问暴增,如何做到让实时通讯模块弹性可扩展,而且还能保证会话状态?
- 服务器出现软硬件故障时,如何保证高可用性?
换句话说,如果没有这样一个实时通讯服务,开发者就不得不自己用基础的通讯技术(如WebSocket)来实现高性能、高并发、灵活扩展、稳定运行的实时通讯服务。而 Azure SignalR 服务正是这样一个为企业级实时通讯而生的服务。
用过。Net SignalR或。Net Core SignalR的用户可能会了解,SignalR(已在GitHub上开源)是一个专门用来完成实时通讯的组件,它已经帮开发者解决了很多实时通讯需要考虑的问题。但这种情况下开发者依然要考虑与扩展性、高可用性、跨平台性等有关的细节,而 Azure SignalR 作为一个 Serverless 服务,从最大程度上简化了实现实时通讯场景的难度。
服务器端的实现
Azure SignalR服务实际上是对SignalR的PaaS实现。SignalR(以。Net Core SignalR为例,实际上。Net SignalR和。Net Core SignalR略有区别)是一个组件,包含了服务器端和客户端,它在服务器端和客户端之间建立长连接,并提供了从服务器端调用客户端JavaScript函数的API。SignalR通过这种方式来保证服务器端一旦收到信息的更新就会及时传递给客户端。
![](http://www.ctiforum.com/uploadfile/2020/0303/20200303103044748.jpg)
为此,SignalR提供了以下能力来满足实时通讯的场景:
- 服务器和客户端的连接管理,包括连接的创建和断开等,以及自动连接管理。
- 同时向所有连接的客户端发送消息,这些消息可能来自某个客户端或服务器接收自第三方。
- 向特定客户端或客户端组发送消息。
- 可以通过缩放处理不断增加的流量。
考虑到客户端使用的不同浏览器特性或设备特殊性,SignalR提供了三种实时通讯技术:WebSocket、服务器发送事件(Server Sent Event)以及长轮询(Long Polling)。开发者可以根据目标客户端选择固定的通讯方式,也可以交给SignalR根据特定规则自动选择当前客户端最合适使用的方式。这一点对于要做一款兼容各种浏览器的应用来说,可以极大节省开发者的时间和精力。
SignalR在使用时依然要开发者自己处理在多节点部署时粘滞会话(Sticky session)的问题,例如:
![](http://www.ctiforum.com/uploadfile/2020/0303/20200303102005523.png)
客户端1如果想和客户端3实时通讯,需要在Server1和Server2之间实现粘滞会话。此外,开发者也需要考虑如何管理服务器端TCP资源的问题(SignalR 优先采用长连接,如果用户访问量大,则很快会消耗完单服务器的TCP连接数),在连接数出现瓶颈或空闲时如何弹性扩展和收缩服务器数量,是开发者需要花大量精力来处理的问题。而Azure SignalR 服务完美的解决了这两个问题。
Azure SignalR服务可以让开发者在新应用或现有应用中快速实现实时通讯能力。使用Azure SignalR服务,每个客户端的实时通讯连接都将与Azure SignalR服务相连接,Azure SignalR服务作为一个PaaS服务,可以根据客户端数量灵活实现弹性扩展和收缩,并实现粘滞会话能力。需要实现实时通讯的应用只需维持和Azure SignalR服务少量的固定连接,通过这种方式即可实现实时通讯模块和应用服务器的解耦。Azure SignalR服务内置故障转移能力,保证了服务稳定性,并承诺99.9%的SLA保障。
![](http://www.ctiforum.com/uploadfile/2020/0303/20200303103823921.jpg)
客户端的连接
客户端在建立实时通讯连接时,会在应用端做重定向,进而完成和Azure SignalR的连接:
![](http://www.ctiforum.com/uploadfile/2020/0303/20200303103729957.jpg)
- 客户端连接到应用服务器。
- 应用服务器向Azure SignalR服务请求令牌。
- Azure SignalR服务验证服务器的请求后返回令牌。
- 应用服务器获得Azure SignalR服务授权后,将客户端的连接请求重定向到Azure SignalR服务,并附加Azure SignalR服务的令牌。
- 客户端使用获得的Azure SignalR服务令牌,连接到重定向的Azure SignalR服务地址。
这种情况下,添加实时通讯模块只需要对应用进行很少量的改动,并且对开发者而言,也不需要从头构建一个完整的实时通讯服务框架。
在对不同语言的支持方面,Azure SignalR服务提供了基于ASP.Net Core、ASP.Net、JavaScript、Java的客户端以及REST API,方便开发者使用自己熟悉的开发语言进行实时通讯的开发。
更多应用场景
借助Azure SignalR服务,企业不仅可以在战疫过程中快速构建实时消息通讯平台,还可以在很多需要实时通讯的业务场景中快速构建实时通讯的能力。例如:
进行一对一、一对多、多对多的实时消息通信场景,典型场景包括聊天室、游戏实时聊天、游戏实时积分榜、团队协作(如会议白板)、在线教育场景下的实时交互(包括文本、语音和视频)。
进行一对一、一对多、多对多的实时消息通信场景,典型场景包括聊天室、游戏实时聊天、游戏实时积分榜、团队协作(如会议白板)、在线教育场景下的实时交互(包括文本、语音和视频)。
实时状态通知和事件更新,典型的场景包括金融市场变动信息、金融产品价格提醒、物流实时位置共享、物联网设备状况实时更新、智慧家居(城市)等。
需要低延迟的实时流媒体,例如实时游戏、在线拍卖、股票推荐、视频直播等。
最后需要特别说明:Azure SignalR服务除了支持各种开发平台的集成和使用,还支持各类客户端类型,如浏览器、桌面应用、移动应用、服务器端进程、物联网设备、游戏主机等。
福利时间
今天的技术干货就介绍到这儿,关于 Azure SignalR 服务的更多信息和使用方法,欢迎查看官方文档或者留言与我们交流。当然,我们更加鼓励还没有尝试过“防疫开源项目“的小伙伴们,点击文末阅读原文,查看 GitHub 开源项目文档,与我们一起交流探讨,更有百万 Azure 福利暖心赠送噢。
最后,我们为本次项目上线了免费技术课程,欢迎大家扫描下方二维码,于本周三观看学习。
![](http://www.ctiforum.com/uploadfile/2020/0303/20200303103946147.jpg)