HR在各辦公室門口張貼公告,
要求員工掃碼填問卷上報(bào)健康狀況;
各團(tuán)隊(duì)負(fù)責(zé)人花式發(fā)送各種郵件,
將疫情期間的工作安排告知有關(guān)成員;
高管助理三天兩頭打電話給不同部門,
轉(zhuǎn)達(dá)老板的最新指示;
員工們用不同排列組合建了N多個(gè)群,
討論疫情、八卦,以及午飯吃啥。
特殊時(shí)期,各種消息滿天飛,
大家關(guān)注之余都感覺好累……
抗“疫”+有序復(fù)工的關(guān)鍵時(shí)期,企業(yè)如何在管理層面實(shí)時(shí)了解所有員工的健康信息,怎樣第一時(shí)間獲得員工報(bào)告的異常信息,又如何將最新戰(zhàn)疫政策發(fā)布到各層級……這些都是企業(yè)目前最關(guān)注的問題,當(dāng)然也有不少企業(yè)正在考慮將這樣的功能集成到公司內(nèi)部辦公系統(tǒng)中。
微軟一直致力于通過技術(shù)助力“戰(zhàn)疫”,為了幫助企業(yè)在疫情期間及時(shí)高效地傳遞信息,前不久我們組織技術(shù)專家基于Azure 云原生技術(shù)搭建了“一站式防疫信息實(shí)時(shí)互動(dòng)開源項(xiàng)目” (即刻查看文章回顧活動(dòng)詳情)并詳細(xì)解讀了項(xiàng)目功能和應(yīng)用場景。
今天我們邀請微軟應(yīng)用開發(fā)解決方案專家,從技術(shù)層面實(shí)力解讀,這個(gè)開源平臺如何實(shí)現(xiàn)企業(yè)所需的信息實(shí)時(shí)互動(dòng)服務(wù)。
開源項(xiàng)目架構(gòu)
本次開源項(xiàng)目主要基于Azure SignalR服務(wù)搭建,該服務(wù)可以幫助我們輕松地為Web應(yīng)用添加實(shí)時(shí)通信能力。高頻數(shù)據(jù)更新(如游戲、投票、輪詢)、儀表板、監(jiān)視、聊天、地圖實(shí)時(shí)定位、實(shí)時(shí)定向廣告,甚至IoT和互聯(lián)設(shè)備,以及基于事件的實(shí)時(shí)觸發(fā)器等場景,都是這個(gè)服務(wù)可以大展拳腳的舞臺。
同時(shí)該服務(wù)還可以與其他Azure服務(wù)無縫集成,進(jìn)而擴(kuò)展出很多實(shí)用功能。
具體可參考微軟官方文檔:https://azure.microsoft.com/zh-cn/services/signalr-service/
本次項(xiàng)目主要實(shí)現(xiàn)了基于兩類用戶的應(yīng)用場景:
- 企業(yè)員工:員工在企業(yè)自己的網(wǎng)頁、小程序、移動(dòng)應(yīng)用上日常辦公時(shí),可以實(shí)時(shí)接收企業(yè)針對疫情信息的實(shí)時(shí)推送;
- 企業(yè)管理用戶:管理者可以自定義消息將疫情管理信息,并實(shí)時(shí)發(fā)送到每個(gè)員工的客戶端上,同時(shí)還可以在監(jiān)控臺實(shí)時(shí)看到員工針對疫情信息的反饋和員工疫情的統(tǒng)計(jì)信息。
實(shí)際上在這個(gè)開源項(xiàng)目中,還包含了很多有趣的功能實(shí)現(xiàn),例如對公司對疫情信息的語音播報(bào)、針對疫情視頻評論的實(shí)時(shí)廣播、員工對疫情信息的反饋統(tǒng)計(jì)的實(shí)時(shí)統(tǒng)計(jì)報(bào)表等。
開源項(xiàng)目架構(gòu):
- 員工/管理員界面:員工功能頁面,包含視頻、視頻彈幕、消息實(shí)時(shí)統(tǒng)計(jì)柱狀圖、疫情信息通知欄;管理員管理頁面,包含了信息的發(fā)布文本框。
- 管理員發(fā)送的信息通過Azure SignalR服務(wù)廣播到客戶端。
- 員工通過PC、移動(dòng)設(shè)備訪問功能頁面時(shí),可以實(shí)時(shí)接受管理臺發(fā)送的消息。同時(shí)也可以在視頻中發(fā)送彈幕,彈幕會實(shí)時(shí)廣播到所有訪問該頁面的用戶客戶端中。實(shí)時(shí)消息的接收和發(fā)送都是通過Azure SignalR服務(wù)完成的。
- 針對管理員發(fā)送的實(shí)時(shí)疫情信息,可以直接調(diào)用Azure認(rèn)知服務(wù)API來實(shí)現(xiàn)對文本的語音播報(bào)。
在這個(gè)Demo代碼中,如果企業(yè)想應(yīng)用這個(gè)疫情實(shí)時(shí)通知能力,只需在現(xiàn)有功能頁面(可能是一個(gè)網(wǎng)站或微信小程序,或者使用了JS技術(shù)的移動(dòng)應(yīng)用)中增加非常少的代碼改動(dòng),就可以快速在現(xiàn)有功能上增加實(shí)時(shí)疫情通知功能。
為何選擇Azure SignalR 服務(wù)
接下來,我們一起看看本次開源項(xiàng)目為何選擇Azure SignalR 來實(shí)現(xiàn)項(xiàng)目核心功能。
Azure SignalR 作為實(shí)時(shí)消息通知的核心,用戶只需創(chuàng)建實(shí)例,就能在程序中進(jìn)行調(diào)用。當(dāng)然,企業(yè)也可以選擇Azure SignalR 之外的實(shí)時(shí)通訊服務(wù),但會增加以下問題:
- 實(shí)時(shí)消息通知時(shí),需要后臺一有消息前端就立即體現(xiàn),如何保證信息可以實(shí)時(shí)發(fā)送?
- 客戶端網(wǎng)絡(luò)不穩(wěn)定,如何保證客戶應(yīng)用體驗(yàn),即:如何解決在網(wǎng)絡(luò)中斷又恢復(fù)后的信息可達(dá)?
- 如何實(shí)現(xiàn)流式數(shù)據(jù),如疫情視頻流實(shí)時(shí)同步的需求?(不同于處理塊狀文本消息,處理流式數(shù)據(jù)還需要考慮如何分片打包的問題)
- 用戶可能采用了各種不同設(shè)備或?yàn)g覽器,如何完美適應(yīng)不同客戶端?
- 公司現(xiàn)有應(yīng)用已經(jīng)微服務(wù)化,不同團(tuán)隊(duì)用了不同的語言平臺,如何讓不同服務(wù)可以順暢對接實(shí)時(shí)通訊模塊?
- 系統(tǒng)實(shí)現(xiàn)時(shí)沒有考慮實(shí)時(shí)通訊,業(yè)務(wù)部門突然要求一兩天就要上線實(shí)時(shí)通訊功能,怎么快速實(shí)現(xiàn)?
- 如果用戶訪問暴增,如何做到讓實(shí)時(shí)通訊模塊彈性可擴(kuò)展,而且還能保證會話狀態(tài)?
- 服務(wù)器出現(xiàn)軟硬件故障時(shí),如何保證高可用性?
換句話說,如果沒有這樣一個(gè)實(shí)時(shí)通訊服務(wù),開發(fā)者就不得不自己用基礎(chǔ)的通訊技術(shù)(如WebSocket)來實(shí)現(xiàn)高性能、高并發(fā)、靈活擴(kuò)展、穩(wěn)定運(yùn)行的實(shí)時(shí)通訊服務(wù)。而 Azure SignalR 服務(wù)正是這樣一個(gè)為企業(yè)級實(shí)時(shí)通訊而生的服務(wù)。
用過。Net SignalR或。Net Core SignalR的用戶可能會了解,SignalR(已在GitHub上開源)是一個(gè)專門用來完成實(shí)時(shí)通訊的組件,它已經(jīng)幫開發(fā)者解決了很多實(shí)時(shí)通訊需要考慮的問題。但這種情況下開發(fā)者依然要考慮與擴(kuò)展性、高可用性、跨平臺性等有關(guān)的細(xì)節(jié),而 Azure SignalR 作為一個(gè) Serverless 服務(wù),從最大程度上簡化了實(shí)現(xiàn)實(shí)時(shí)通訊場景的難度。
服務(wù)器端的實(shí)現(xiàn)
Azure SignalR服務(wù)實(shí)際上是對SignalR的PaaS實(shí)現(xiàn)。SignalR(以。Net Core SignalR為例,實(shí)際上。Net SignalR和。Net Core SignalR略有區(qū)別)是一個(gè)組件,包含了服務(wù)器端和客戶端,它在服務(wù)器端和客戶端之間建立長連接,并提供了從服務(wù)器端調(diào)用客戶端JavaScript函數(shù)的API。SignalR通過這種方式來保證服務(wù)器端一旦收到信息的更新就會及時(shí)傳遞給客戶端。
為此,SignalR提供了以下能力來滿足實(shí)時(shí)通訊的場景:
- 服務(wù)器和客戶端的連接管理,包括連接的創(chuàng)建和斷開等,以及自動(dòng)連接管理。
- 同時(shí)向所有連接的客戶端發(fā)送消息,這些消息可能來自某個(gè)客戶端或服務(wù)器接收自第三方。
- 向特定客戶端或客戶端組發(fā)送消息。
- 可以通過縮放處理不斷增加的流量。
考慮到客戶端使用的不同瀏覽器特性或設(shè)備特殊性,SignalR提供了三種實(shí)時(shí)通訊技術(shù):WebSocket、服務(wù)器發(fā)送事件(Server Sent Event)以及長輪詢(Long Polling)。開發(fā)者可以根據(jù)目標(biāo)客戶端選擇固定的通訊方式,也可以交給SignalR根據(jù)特定規(guī)則自動(dòng)選擇當(dāng)前客戶端最合適使用的方式。這一點(diǎn)對于要做一款兼容各種瀏覽器的應(yīng)用來說,可以極大節(jié)省開發(fā)者的時(shí)間和精力。
SignalR在使用時(shí)依然要開發(fā)者自己處理在多節(jié)點(diǎn)部署時(shí)粘滯會話(Sticky session)的問題,例如:
客戶端1如果想和客戶端3實(shí)時(shí)通訊,需要在Server1和Server2之間實(shí)現(xiàn)粘滯會話。此外,開發(fā)者也需要考慮如何管理服務(wù)器端TCP資源的問題(SignalR 優(yōu)先采用長連接,如果用戶訪問量大,則很快會消耗完單服務(wù)器的TCP連接數(shù)),在連接數(shù)出現(xiàn)瓶頸或空閑時(shí)如何彈性擴(kuò)展和收縮服務(wù)器數(shù)量,是開發(fā)者需要花大量精力來處理的問題。而Azure SignalR 服務(wù)完美的解決了這兩個(gè)問題。
Azure SignalR服務(wù)可以讓開發(fā)者在新應(yīng)用或現(xiàn)有應(yīng)用中快速實(shí)現(xiàn)實(shí)時(shí)通訊能力。使用Azure SignalR服務(wù),每個(gè)客戶端的實(shí)時(shí)通訊連接都將與Azure SignalR服務(wù)相連接,Azure SignalR服務(wù)作為一個(gè)PaaS服務(wù),可以根據(jù)客戶端數(shù)量靈活實(shí)現(xiàn)彈性擴(kuò)展和收縮,并實(shí)現(xiàn)粘滯會話能力。需要實(shí)現(xiàn)實(shí)時(shí)通訊的應(yīng)用只需維持和Azure SignalR服務(wù)少量的固定連接,通過這種方式即可實(shí)現(xiàn)實(shí)時(shí)通訊模塊和應(yīng)用服務(wù)器的解耦。Azure SignalR服務(wù)內(nèi)置故障轉(zhuǎn)移能力,保證了服務(wù)穩(wěn)定性,并承諾99.9%的SLA保障。
客戶端的連接
客戶端在建立實(shí)時(shí)通訊連接時(shí),會在應(yīng)用端做重定向,進(jìn)而完成和Azure SignalR的連接:
- 客戶端連接到應(yīng)用服務(wù)器。
- 應(yīng)用服務(wù)器向Azure SignalR服務(wù)請求令牌。
- Azure SignalR服務(wù)驗(yàn)證服務(wù)器的請求后返回令牌。
- 應(yīng)用服務(wù)器獲得Azure SignalR服務(wù)授權(quán)后,將客戶端的連接請求重定向到Azure SignalR服務(wù),并附加Azure SignalR服務(wù)的令牌。
- 客戶端使用獲得的Azure SignalR服務(wù)令牌,連接到重定向的Azure SignalR服務(wù)地址。
這種情況下,添加實(shí)時(shí)通訊模塊只需要對應(yīng)用進(jìn)行很少量的改動(dòng),并且對開發(fā)者而言,也不需要從頭構(gòu)建一個(gè)完整的實(shí)時(shí)通訊服務(wù)框架。
在對不同語言的支持方面,Azure SignalR服務(wù)提供了基于ASP.Net Core、ASP.Net、JavaScript、Java的客戶端以及REST API,方便開發(fā)者使用自己熟悉的開發(fā)語言進(jìn)行實(shí)時(shí)通訊的開發(fā)。
更多應(yīng)用場景
借助Azure SignalR服務(wù),企業(yè)不僅可以在戰(zhàn)疫過程中快速構(gòu)建實(shí)時(shí)消息通訊平臺,還可以在很多需要實(shí)時(shí)通訊的業(yè)務(wù)場景中快速構(gòu)建實(shí)時(shí)通訊的能力。例如:
進(jìn)行一對一、一對多、多對多的實(shí)時(shí)消息通信場景,典型場景包括聊天室、游戲?qū)崟r(shí)聊天、游戲?qū)崟r(shí)積分榜、團(tuán)隊(duì)協(xié)作(如會議白板)、在線教育場景下的實(shí)時(shí)交互(包括文本、語音和視頻)。
進(jìn)行一對一、一對多、多對多的實(shí)時(shí)消息通信場景,典型場景包括聊天室、游戲?qū)崟r(shí)聊天、游戲?qū)崟r(shí)積分榜、團(tuán)隊(duì)協(xié)作(如會議白板)、在線教育場景下的實(shí)時(shí)交互(包括文本、語音和視頻)。
實(shí)時(shí)狀態(tài)通知和事件更新,典型的場景包括金融市場變動(dòng)信息、金融產(chǎn)品價(jià)格提醒、物流實(shí)時(shí)位置共享、物聯(lián)網(wǎng)設(shè)備狀況實(shí)時(shí)更新、智慧家居(城市)等。
需要低延遲的實(shí)時(shí)流媒體,例如實(shí)時(shí)游戲、在線拍賣、股票推薦、視頻直播等。
最后需要特別說明:Azure SignalR服務(wù)除了支持各種開發(fā)平臺的集成和使用,還支持各類客戶端類型,如瀏覽器、桌面應(yīng)用、移動(dòng)應(yīng)用、服務(wù)器端進(jìn)程、物聯(lián)網(wǎng)設(shè)備、游戲主機(jī)等。
福利時(shí)間
今天的技術(shù)干貨就介紹到這兒,關(guān)于 Azure SignalR 服務(wù)的更多信息和使用方法,歡迎查看官方文檔或者留言與我們交流。當(dāng)然,我們更加鼓勵(lì)還沒有嘗試過“防疫開源項(xiàng)目“的小伙伴們,點(diǎn)擊文末閱讀原文,查看 GitHub 開源項(xiàng)目文檔,與我們一起交流探討,更有百萬 Azure 福利暖心贈(zèng)送噢。
最后,我們?yōu)楸敬雾?xiàng)目上線了免費(fèi)技術(shù)課程,歡迎大家掃描下方二維碼,于本周三觀看學(xué)習(xí)。