HR在各辦公室門(mén)口張貼公告,
要求員工掃碼填問(wèn)卷上報健康狀況;
各團隊負責人花式發(fā)送各種郵件,
將疫情期間的工作安排告知有關(guān)成員;
高管助理三天兩頭打電話(huà)給不同部門(mén),
轉達老板的最新指示;
員工們用不同排列組合建了N多個(gè)群,
討論疫情、八卦,以及午飯吃啥。
特殊時(shí)期,各種消息滿(mǎn)天飛,
大家關(guān)注之余都感覺(jué)好累……
抗“疫”+有序復工的關(guān)鍵時(shí)期,企業(yè)如何在管理層面實(shí)時(shí)了解所有員工的健康信息,怎樣第一時(shí)間獲得員工報告的異常信息,又如何將最新戰疫政策發(fā)布到各層級……這些都是企業(yè)目前最關(guān)注的問(wèn)題,當然也有不少企業(yè)正在考慮將這樣的功能集成到公司內部辦公系統中。
微軟一直致力于通過(guò)技術(shù)助力“戰疫”,為了幫助企業(yè)在疫情期間及時(shí)高效地傳遞信息,前不久我們組織技術(shù)專(zhuān)家基于A(yíng)zure 云原生技術(shù)搭建了“一站式防疫信息實(shí)時(shí)互動(dòng)開(kāi)源項目” (即刻查看文章回顧活動(dòng)詳情)并詳細解讀了項目功能和應用場(chǎng)景。
今天我們邀請微軟應用開(kāi)發(fā)解決方案專(zhuān)家,從技術(shù)層面實(shí)力解讀,這個(gè)開(kāi)源平臺如何實(shí)現企業(yè)所需的信息實(shí)時(shí)互動(dòng)服務(wù)。

開(kāi)源項目架構
本次開(kāi)源項目主要基于A(yíng)zure SignalR服務(wù)搭建,該服務(wù)可以幫助我們輕松地為Web應用添加實(shí)時(shí)通信能力。高頻數據更新(如游戲、投票、輪詢(xún))、儀表板、監視、聊天、地圖實(shí)時(shí)定位、實(shí)時(shí)定向廣告,甚至IoT和互聯(lián)設備,以及基于事件的實(shí)時(shí)觸發(fā)器等場(chǎng)景,都是這個(gè)服務(wù)可以大展拳腳的舞臺。
同時(shí)該服務(wù)還可以與其他Azure服務(wù)無(wú)縫集成,進(jìn)而擴展出很多實(shí)用功能。
具體可參考微軟官方文檔:https://azure.microsoft.com/zh-cn/services/signalr-service/
本次項目主要實(shí)現了基于兩類(lèi)用戶(hù)的應用場(chǎng)景:
- 企業(yè)員工:?jiǎn)T工在企業(yè)自己的網(wǎng)頁(yè)、小程序、移動(dòng)應用上日常辦公時(shí),可以實(shí)時(shí)接收企業(yè)針對疫情信息的實(shí)時(shí)推送;
- 企業(yè)管理用戶(hù):管理者可以自定義消息將疫情管理信息,并實(shí)時(shí)發(fā)送到每個(gè)員工的客戶(hù)端上,同時(shí)還可以在監控臺實(shí)時(shí)看到員工針對疫情信息的反饋和員工疫情的統計信息。

實(shí)際上在這個(gè)開(kāi)源項目中,還包含了很多有趣的功能實(shí)現,例如對公司對疫情信息的語(yǔ)音播報、針對疫情視頻評論的實(shí)時(shí)廣播、員工對疫情信息的反饋統計的實(shí)時(shí)統計報表等。
開(kāi)源項目架構:
- 員工/管理員界面:?jiǎn)T工功能頁(yè)面,包含視頻、視頻彈幕、消息實(shí)時(shí)統計柱狀圖、疫情信息通知欄;管理員管理頁(yè)面,包含了信息的發(fā)布文本框。
- 管理員發(fā)送的信息通過(guò)Azure SignalR服務(wù)廣播到客戶(hù)端。
- 員工通過(guò)PC、移動(dòng)設備訪(fǎng)問(wèn)功能頁(yè)面時(shí),可以實(shí)時(shí)接受管理臺發(fā)送的消息。同時(shí)也可以在視頻中發(fā)送彈幕,彈幕會(huì )實(shí)時(shí)廣播到所有訪(fǎng)問(wèn)該頁(yè)面的用戶(hù)客戶(hù)端中。實(shí)時(shí)消息的接收和發(fā)送都是通過(guò)Azure SignalR服務(wù)完成的。
- 針對管理員發(fā)送的實(shí)時(shí)疫情信息,可以直接調用Azure認知服務(wù)API來(lái)實(shí)現對文本的語(yǔ)音播報。

在這個(gè)Demo代碼中,如果企業(yè)想應用這個(gè)疫情實(shí)時(shí)通知能力,只需在現有功能頁(yè)面(可能是一個(gè)網(wǎng)站或微信小程序,或者使用了JS技術(shù)的移動(dòng)應用)中增加非常少的代碼改動(dòng),就可以快速在現有功能上增加實(shí)時(shí)疫情通知功能。
為何選擇Azure SignalR 服務(wù)
接下來(lái),我們一起看看本次開(kāi)源項目為何選擇Azure SignalR 來(lái)實(shí)現項目核心功能。
Azure SignalR 作為實(shí)時(shí)消息通知的核心,用戶(hù)只需創(chuàng )建實(shí)例,就能在程序中進(jìn)行調用。當然,企業(yè)也可以選擇Azure SignalR 之外的實(shí)時(shí)通訊服務(wù),但會(huì )增加以下問(wèn)題:
- 實(shí)時(shí)消息通知時(shí),需要后臺一有消息前端就立即體現,如何保證信息可以實(shí)時(shí)發(fā)送?
- 客戶(hù)端網(wǎng)絡(luò )不穩定,如何保證客戶(hù)應用體驗,即:如何解決在網(wǎng)絡(luò )中斷又恢復后的信息可達?
- 如何實(shí)現流式數據,如疫情視頻流實(shí)時(shí)同步的需求?(不同于處理塊狀文本消息,處理流式數據還需要考慮如何分片打包的問(wèn)題)
- 用戶(hù)可能采用了各種不同設備或瀏覽器,如何完美適應不同客戶(hù)端?
- 公司現有應用已經(jīng)微服務(wù)化,不同團隊用了不同的語(yǔ)言平臺,如何讓不同服務(wù)可以順暢對接實(shí)時(shí)通訊模塊?
- 系統實(shí)現時(shí)沒(méi)有考慮實(shí)時(shí)通訊,業(yè)務(wù)部門(mén)突然要求一兩天就要上線(xiàn)實(shí)時(shí)通訊功能,怎么快速實(shí)現?
- 如果用戶(hù)訪(fǎng)問(wèn)暴增,如何做到讓實(shí)時(shí)通訊模塊彈性可擴展,而且還能保證會(huì )話(huà)狀態(tài)?
- 服務(wù)器出現軟硬件故障時(shí),如何保證高可用性?
換句話(huà)說(shuō),如果沒(méi)有這樣一個(gè)實(shí)時(shí)通訊服務(wù),開(kāi)發(fā)者就不得不自己用基礎的通訊技術(shù)(如WebSocket)來(lái)實(shí)現高性能、高并發(fā)、靈活擴展、穩定運行的實(shí)時(shí)通訊服務(wù)。而 Azure SignalR 服務(wù)正是這樣一個(gè)為企業(yè)級實(shí)時(shí)通訊而生的服務(wù)。
用過(guò)。Net SignalR或。Net Core SignalR的用戶(hù)可能會(huì )了解,SignalR(已在GitHub上開(kāi)源)是一個(gè)專(zhuān)門(mén)用來(lái)完成實(shí)時(shí)通訊的組件,它已經(jīng)幫開(kāi)發(fā)者解決了很多實(shí)時(shí)通訊需要考慮的問(wèn)題。但這種情況下開(kāi)發(fā)者依然要考慮與擴展性、高可用性、跨平臺性等有關(guān)的細節,而 Azure SignalR 作為一個(gè) Serverless 服務(wù),從最大程度上簡(jiǎn)化了實(shí)現實(shí)時(shí)通訊場(chǎng)景的難度。
服務(wù)器端的實(shí)現
Azure SignalR服務(wù)實(shí)際上是對SignalR的PaaS實(shí)現。SignalR(以。Net Core SignalR為例,實(shí)際上。Net SignalR和。Net Core SignalR略有區別)是一個(gè)組件,包含了服務(wù)器端和客戶(hù)端,它在服務(wù)器端和客戶(hù)端之間建立長(cháng)連接,并提供了從服務(wù)器端調用客戶(hù)端JavaScript函數的API。SignalR通過(guò)這種方式來(lái)保證服務(wù)器端一旦收到信息的更新就會(huì )及時(shí)傳遞給客戶(hù)端。

為此,SignalR提供了以下能力來(lái)滿(mǎn)足實(shí)時(shí)通訊的場(chǎng)景:
- 服務(wù)器和客戶(hù)端的連接管理,包括連接的創(chuàng )建和斷開(kāi)等,以及自動(dòng)連接管理。
- 同時(shí)向所有連接的客戶(hù)端發(fā)送消息,這些消息可能來(lái)自某個(gè)客戶(hù)端或服務(wù)器接收自第三方。
- 向特定客戶(hù)端或客戶(hù)端組發(fā)送消息。
- 可以通過(guò)縮放處理不斷增加的流量。
考慮到客戶(hù)端使用的不同瀏覽器特性或設備特殊性,SignalR提供了三種實(shí)時(shí)通訊技術(shù):WebSocket、服務(wù)器發(fā)送事件(Server Sent Event)以及長(cháng)輪詢(xún)(Long Polling)。開(kāi)發(fā)者可以根據目標客戶(hù)端選擇固定的通訊方式,也可以交給SignalR根據特定規則自動(dòng)選擇當前客戶(hù)端最合適使用的方式。這一點(diǎn)對于要做一款兼容各種瀏覽器的應用來(lái)說(shuō),可以極大節省開(kāi)發(fā)者的時(shí)間和精力。
SignalR在使用時(shí)依然要開(kāi)發(fā)者自己處理在多節點(diǎn)部署時(shí)粘滯會(huì )話(huà)(Sticky session)的問(wèn)題,例如:

客戶(hù)端1如果想和客戶(hù)端3實(shí)時(shí)通訊,需要在Server1和Server2之間實(shí)現粘滯會(huì )話(huà)。此外,開(kāi)發(fā)者也需要考慮如何管理服務(wù)器端TCP資源的問(wèn)題(SignalR 優(yōu)先采用長(cháng)連接,如果用戶(hù)訪(fǎng)問(wèn)量大,則很快會(huì )消耗完單服務(wù)器的TCP連接數),在連接數出現瓶頸或空閑時(shí)如何彈性擴展和收縮服務(wù)器數量,是開(kāi)發(fā)者需要花大量精力來(lái)處理的問(wèn)題。而Azure SignalR 服務(wù)完美的解決了這兩個(gè)問(wèn)題。
Azure SignalR服務(wù)可以讓開(kāi)發(fā)者在新應用或現有應用中快速實(shí)現實(shí)時(shí)通訊能力。使用Azure SignalR服務(wù),每個(gè)客戶(hù)端的實(shí)時(shí)通訊連接都將與Azure SignalR服務(wù)相連接,Azure SignalR服務(wù)作為一個(gè)PaaS服務(wù),可以根據客戶(hù)端數量靈活實(shí)現彈性擴展和收縮,并實(shí)現粘滯會(huì )話(huà)能力。需要實(shí)現實(shí)時(shí)通訊的應用只需維持和Azure SignalR服務(wù)少量的固定連接,通過(guò)這種方式即可實(shí)現實(shí)時(shí)通訊模塊和應用服務(wù)器的解耦。Azure SignalR服務(wù)內置故障轉移能力,保證了服務(wù)穩定性,并承諾99.9%的SLA保障。

客戶(hù)端的連接
客戶(hù)端在建立實(shí)時(shí)通訊連接時(shí),會(huì )在應用端做重定向,進(jìn)而完成和Azure SignalR的連接:

- 客戶(hù)端連接到應用服務(wù)器。
- 應用服務(wù)器向Azure SignalR服務(wù)請求令牌。
- Azure SignalR服務(wù)驗證服務(wù)器的請求后返回令牌。
- 應用服務(wù)器獲得Azure SignalR服務(wù)授權后,將客戶(hù)端的連接請求重定向到Azure SignalR服務(wù),并附加Azure SignalR服務(wù)的令牌。
- 客戶(hù)端使用獲得的Azure SignalR服務(wù)令牌,連接到重定向的Azure SignalR服務(wù)地址。
這種情況下,添加實(shí)時(shí)通訊模塊只需要對應用進(jìn)行很少量的改動(dòng),并且對開(kāi)發(fā)者而言,也不需要從頭構建一個(gè)完整的實(shí)時(shí)通訊服務(wù)框架。
在對不同語(yǔ)言的支持方面,Azure SignalR服務(wù)提供了基于A(yíng)SP.Net Core、ASP.Net、JavaScript、Java的客戶(hù)端以及REST API,方便開(kāi)發(fā)者使用自己熟悉的開(kāi)發(fā)語(yǔ)言進(jìn)行實(shí)時(shí)通訊的開(kāi)發(fā)。
更多應用場(chǎng)景
借助Azure SignalR服務(wù),企業(yè)不僅可以在戰疫過(guò)程中快速構建實(shí)時(shí)消息通訊平臺,還可以在很多需要實(shí)時(shí)通訊的業(yè)務(wù)場(chǎng)景中快速構建實(shí)時(shí)通訊的能力。例如:
進(jìn)行一對一、一對多、多對多的實(shí)時(shí)消息通信場(chǎng)景,典型場(chǎng)景包括聊天室、游戲實(shí)時(shí)聊天、游戲實(shí)時(shí)積分榜、團隊協(xié)作(如會(huì )議白板)、在線(xiàn)教育場(chǎng)景下的實(shí)時(shí)交互(包括文本、語(yǔ)音和視頻)。
進(jìn)行一對一、一對多、多對多的實(shí)時(shí)消息通信場(chǎng)景,典型場(chǎng)景包括聊天室、游戲實(shí)時(shí)聊天、游戲實(shí)時(shí)積分榜、團隊協(xié)作(如會(huì )議白板)、在線(xiàn)教育場(chǎng)景下的實(shí)時(shí)交互(包括文本、語(yǔ)音和視頻)。
實(shí)時(shí)狀態(tài)通知和事件更新,典型的場(chǎng)景包括金融市場(chǎng)變動(dòng)信息、金融產(chǎn)品價(jià)格提醒、物流實(shí)時(shí)位置共享、物聯(lián)網(wǎng)設備狀況實(shí)時(shí)更新、智慧家居(城市)等。
需要低延遲的實(shí)時(shí)流媒體,例如實(shí)時(shí)游戲、在線(xiàn)拍賣(mài)、股票推薦、視頻直播等。
最后需要特別說(shuō)明:Azure SignalR服務(wù)除了支持各種開(kāi)發(fā)平臺的集成和使用,還支持各類(lèi)客戶(hù)端類(lèi)型,如瀏覽器、桌面應用、移動(dòng)應用、服務(wù)器端進(jìn)程、物聯(lián)網(wǎng)設備、游戲主機等。
福利時(shí)間
今天的技術(shù)干貨就介紹到這兒,關(guān)于 Azure SignalR 服務(wù)的更多信息和使用方法,歡迎查看官方文檔或者留言與我們交流。當然,我們更加鼓勵還沒(méi)有嘗試過(guò)“防疫開(kāi)源項目“的小伙伴們,點(diǎn)擊文末閱讀原文,查看 GitHub 開(kāi)源項目文檔,與我們一起交流探討,更有百萬(wàn) Azure 福利暖心贈送噢。
最后,我們?yōu)楸敬雾椖可暇(xiàn)了免費技術(shù)課程,歡迎大家掃描下方二維碼,于本周三觀(guān)看學(xué)習。
