仔細再看一次騰訊云的小程序解決方案,發現一個新大陸。
傳統的 LAMP 架構,PHP-CGI 這種方式是很難處理長連接的。要么寫死循環的方式來握住請求,要么使用 swoole 這種,通過 C 拓展來支持。
而 NodeJS 由于官方 DEMO 就是支持跑一個 HTTP 服務,所以處理這些長連接會方便一些(大家好懂一些,我覺得 PHP-CLI 方式也是一樣的)。
信道服務
建立連接過程
- 小程序請求業務服務器
- 業務服務器和信道服務建立連接
- 業務服務器告訴小程序你可以和信道服務建立 ws 了
- 小程序和信道服務建立 ws
- 信道服務請求業務小程序的 ws 建立完成
連接成功后的通信方式
- 小程序請求信道服務,信道服務轉發請求給業務
- 業務請求信道服務,信道服務推送到客戶端
我最開始看的時候,沒注意信道服務是一個云服務,琢磨著騰訊云的 SDK 難道有什么新的黑魔法來實現 PHP 的長連接。
看里面的代碼,各種 onConnect\onRequest,看著就很像長連接的 API,但他基于 CI 是怎么實現的長連接了?看 composer.json 里面沒有用什么黑魔法,搜索代碼里面沒沒看到任何死循環。
客戶端代理
為什么信道服務的 icon 是一朵云?
原來騰訊云把這個信道服務抽象成了一個 PaaS 的云服務,這根本就是一個客戶端代理。而開源出來的 PHP-SDK,里面沒有任何長連接的實現方案。
- 業務服務器 -gt; 小程序:業務服務器只需要請求信道服務即可,信道服務接收到業務的請求后,會將 HTTP Body 部分,轉成 WS 的消息推送給小程序。
- 小程序 -gt; 業務服務器:則正常通過 WS 發送消息給信道服務,信道服務轉成 HTTP 請求轉發到業務服務器。
對于一些使用 PHP 開發的歷史業務,大規模的長連接改造是非常困難,但部署一個長連接轉發服務卻容易很多(比如用 NodeJS 來寫一個)。
騰訊云的這個思路可以幫助各種業務快速支持包括 SSE 和 WS 這兩種長連接方案。并且由于業務服務器本身是 HTTP 方式,可以很容易給低版本 IE 做輪訓兼容。
最后感謝騰訊云開源了他們的方案。
Tags: 微信小程序開發 騰訊云
文章來源:https://www.mxgw.info/a/client-proxy-for-websocket