1. 程式人生 > 其它 >基於nchan 開發訊息服務的一些核心知識點

基於nchan 開發訊息服務的一些核心知識點

以前簡單說明下如何整合,在此說明下集成核心的指令,可以加速我們的整合

參考整合模式

此圖以前簡單介紹過


核心: 基於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