訂閱者上線與下線通知

上線與下線,其實只是該設定的其中一種應用,要達到此種效果,使用的是nchan提供的nchan_subscribe_requestnchan_unsubscribe_request這兩個設定。

顧名思義,就是在訂閱者訂閱時發送一個request到後端伺服器,進而達到上線追蹤的功能,但也不限定此種應用,要如何應用,全由通知的後端伺服器來決定。

  location ~ /sub/(\w+)$ {
    nchan_channel_id $1;
    nchan_subscribe_request /upstream/sub;
    nchan_unsubscribe_request /upstream/unsub;
    nchan_subscriber;
    nchan_channel_group test;
  }

  location = /upstream/unsub {
    proxy_pass http://127.0.0.1:9292/unsub;
    proxy_ignore_client_abort on;  #!!!important!!!!
    proxy_set_header X-Subscriber-Type $nchan_subscriber_type;
    proxy_set_header X-Channel-Id $nchan_channel_id;
    proxy_set_header X-Original-URI $request_uri;
  } 
  location = /upstream/sub {
    proxy_pass http://127.0.0.1:9292/sub;
    proxy_set_header X-Subscriber-Type $nchan_subscriber_type;
    proxy_set_header X-Message-Id $nchan_message_id;
    proxy_set_header X-Channel-Id $nchan_channel_id;
    proxy_set_header X-Original-URI $request_uri;
  }

可以看到nchan_subscribe_request會在有人訂閱時,轉發一個request到/upstream/sub的位置,/upstream/sub這個位置又使用了Nginx自帶的proxy_pass設定,將原始請求反向代理到http://127.0.0.1:9292/sub這個位置,在此就可以使用Nginx的proxy各種參數,範例裡就把各種nchan的參數都放到header裡一起轉發給後端,讓後端程式做進一步判斷。

停止訂閱也是同樣的原理,但要注意的是proxy_ignore_client_abort on這個設定,如果沒有開啟,訂閱者一但立即離線,nchan也就不會轉發到後端伺服器,Nginx會認為整個連線已經結束,進而結束整個進程,所以必須加上忽略訂閱者斷線也要轉發到後端的設定。

Last updated