基於nchan 開發訊息服務的一些核心知識點
阿新 • • 發佈:2022-06-05
以前簡單說明下如何整合,在此說明下集成核心的指令,可以加速我們的整合
參考整合模式
此圖以前簡單介紹過
核心: 基於redis 以及一些訊息管理api,我們利用nchan 提供的auth 以及訊息轉發能力,對於訊息進行處理,對於訊息做一些擴充套件
幾個核心指令
- 認證&安全
因為部分處理屬於長連線,連線是在首次建立處理的,具有一些特殊性,與短連結是不一樣的
核心指令
nchan_authorize_request
當然我們也可以基於openresety 做一些擴充套件基於access_by_lua*
同時如果有些訂閱有特殊場景的,可以直接基於nginx 的指令處理(比如ip 處理,internel,以及監聽本地埠)
而且有些場景我們存在對於通道許可權的回收(比如許可權改變)解決方法:對於通道id 與訂閱是一樣的可以刪除通道(直接基於api delete 操作)
對於複雜雙工通道的,因為刪除通道會解除安裝相關的連線,所以效果也是類似的
- 狀態處理
核心是對於建立連線的客戶端狀態統計,包含了訂閱以及取消訂閱
nchan_subscribe_request
nchan_unsubscribe_request
注意使用以上的時候注意配置proxy_ignore_client_abort on;
否則訊息狀態可能會不正常(449 狀態碼)
- 訊息轉發
基於訊息轉發hook 我們可以擴充套件訊息,當然也可以進行傳送資料的校驗以及許可權處理(以及的後端服務以及配置)
nchan_publisher_upstream_request
- 歷史訊息處理
主要是新建立連線的訊息訂閱者對於訊息的處理,這個還是推薦首次基於拉模式或者歷史(通過短連結api),對於特殊場景的訊息處理
可能需要使用直接拉去歷史訊息的處理
nchan_subscriber_first_message
- 訊息儲存
對於實際使用推薦的肯定是基於redis的(當然單機基於記憶體也是可以的),如果已經有redis cluster 這個是比較推薦的,可以提高系統的可靠性
對於redis 的安全同時也支援配置使用者密碼
nchan_redis_username
nchan_redis_password
nchan_redis_server
- 訊息訂閱狀態的監控
nchan 包含了內建的以及一些其他擴充套件點,基於內建的meta 特殊通道組,我們可以獲取定於以及傳送資訊
location ~ /channel_events/(.+) {
#channel events subscriber location
nchan_subscriber;
nchan_channel_group meta; #"meta" is a SPECIAL channel group
nchan_channel_id $1;
}
以及類似nginx stauts 的 nchan_stub_status 指令(基於可以做一些監控)
一些限制
預設每個連線可以建立的通道為255(屬於設計上的考慮),如果需要突破255限制就需要使用雙工通道了
具體參考src/util/nchan_channel_id.c
參考配置
nchan_channel_id "$1" "$2" "common_channel";
同時對於以上處理的許可權變動建立也會存在問題的(刪除通道,可能會對於其他使用的有影響)
說明
以上是一些使用總結,還是推薦研究下原始碼
參考資料
https://nchan.io/#getting-started
https://www.cnblogs.com/rongfengliang/p/16343179.html