centrifugo實(shí)時(shí)消息服務(wù)器入門(附demo)

由于公司業(yè)務(wù)需要實(shí)時(shí)獲取后端狀態(tài), 又想避免前臺(tái)輪循的方式, Centrifugo 正好能解決我們的問題, 借此機(jī)會(huì)進(jìn)行學(xué)習(xí)筐乳。以下為一些參考文檔及demo

介紹及原理

官方文檔

demo

目錄

安裝

  • 添加源

    curl -s https://packagecloud.io/install/repositories/FZambia/centrifugo/script.deb.sh | sudo bash
    
  • 安裝 Centrifugo

    sudo apt install centrifugo
    
  • 生成配置文件

    • 生成文件為: config.json, 更多配置可參考: 配置說明

      centrifugo genconfig
      
    • 新手可參考以下配置進(jìn)行測(cè)試, 需要根據(jù)自己環(huán)境進(jìn)行調(diào)整

      {
          "admin": true,
          "port": 8000,
          "debug": true,
          "presence": true,
          "history_size": 100,
          "history_lifetime": 600,
          "publish": true,
          "anonymous": true,
          "subscribe_to_publish": true,
          "join_leave": true,
          "history_recover": true,
          "log_file": "/srv/logs/centrifugo.log",
          "log_level": "debug",
          "engine": "redis",
          "redis_host": "127.0.0.1",
          "redis_port": "6379",
          "redis_db": "12",
          "redis_password": "abc123_",
          "secret":"453a5488-586e-4d46-a79a-920af89e0b30",
          "admin_password":"4ce7384d-cdcd-4d93-96db-9c911a8a53f3",
          "admin_secret":"ef390b3e-f03f-4c7d-8e48-5d39f03bda10",
          "api_key":"12a4e62c-e055-4a23-8bbd-d248740f5458",
          "namespaces":[
              {
                  "name":"public",
                  "anonymous":true,
                  "publish":true,
                  "presence":true,
                  "join_leave":true,
                  "history_size":20,
                  "history_lifetime":30,
                  "history_recover":true
              }
          ]
      }
      

配置說明

  • 基本配置說明

    Centrifugo – real-time messaging server
    
    Usage:
      [flags]
      [command]
    
    Available Commands:
      checkconfig Check configuration file
      genconfig   Generate simple configuration file to start with
      help        Help about any command
      version     Centrifugo version information
    
    Flags:
      -a, --address string             interface address to listen on 服務(wù)的地址
          --admin                      enable admin web interface 是否開啟admin的管理界面
          --admin_insecure             use insecure admin mode – no auth required for admin socket admin安全驗(yàn)證, 節(jié)點(diǎn): /, 可直接訪問admin管理界面, 默認(rèn)為false, 登錄admin需要admin_password, 反之可直接登錄
          --api_insecure               use insecure API mode  后臺(tái)推送安全驗(yàn)證, 節(jié)點(diǎn): /api. 默認(rèn)為 false, 此時(shí)訪問節(jié)點(diǎn)需要api_key. 當(dāng)設(shè)置為 true 后, 任何人都將可以訪問此節(jié)點(diǎn)
          --client_insecure            start in insecure client mode 客戶端是否需要安全驗(yàn)證, 默認(rèn)為false, 客戶端必須擁有 JWT token 才能訪問
      -c, --config string              path to config file (default "config.json")
          --debug                      enable debug endpoints 是否開啟dubug節(jié)點(diǎn), 開啟后可訪問 /debug/pprof/ 查看一些Centrifugo的網(wǎng)絡(luò)狀態(tài)
      -e, --engine string              engine to use: memory or redis (default "memory") 消息存儲(chǔ)引擎, 默認(rèn)為內(nèi)存, 部署多個(gè)實(shí)例會(huì)造成數(shù)據(jù)不同步, 因此推薦使用 redis
          --grpc_api                   enable GRPC API server 是否開啟grpc api, 目前我們將使用 http_api
      -h, --help                       help for this command
          --internal_port string       custom port for internal endpoints 開啟自定義默認(rèn)端口, 默認(rèn)為8000, 開啟額外的端口為admin訪問
          --log_file string            optional log file - if not specified logs go to STDOUT  log輸出文件
          --log_level string           set the log level: debug, info, error, fatal or none (default "info") log級(jí)別
      -n, --name string                unique node name 命名空間名稱, 此空間下的屬性會(huì)覆蓋common部分, 但不會(huì)繼承
          --pid_file string            optional path to create PID file
      -p, --port string                port to bind HTTP server to (default "8000")  服務(wù)端口號(hào)
          --prometheus                 enable Prometheus metrics endpoint
          --redis_db int               Redis database (Redis engine)
          --redis_host string          Redis host (Redis engine) (default "127.0.0.1")
          --redis_master_name string   name of Redis master Sentinel monitors (Redis engine)
          --redis_password string      Redis auth password (Redis engine)
          --redis_port string          Redis port (Redis engine) (default "6379")
          --redis_sentinels string     comma-separated list of Sentinel addresses (Redis engine)
          --redis_tls                  enable Redis TLS connection
          --redis_tls_skip_verify      disable Redis TLS host verification
          --redis_url string           Redis connection URL in format redis://:password@hostname:port/db (Redis engine)
          --tls                        enable TLS, requires an X509 certificate and a key file
          --tls_cert string            path to an X509 certificate file
          --tls_key string             path to an X509 certificate key
    
    • 注意點(diǎn):
      • engine:
        • 主要功能: 在節(jié)點(diǎn)之間發(fā)布消息,處理PUB / SUB代理訂閱阳惹,保存/檢索狀態(tài)和歷史數(shù)據(jù)。
        • 分類:
          • Memory: 測(cè)試學(xué)習(xí)可直接使用默認(rèn)的 Memory 引擎. 使用簡(jiǎn)單, 但不允許縮放節(jié)點(diǎn)
          • Redis: 允許將節(jié)點(diǎn)進(jìn)行橫向拓展, 各節(jié)點(diǎn)通過redis共享信息
      • name: 命名空間名稱
        • 名字唯一, 命名格式^[-a-zA-Z0-9_]{2,}$
        • 命名空間和渠道配置沒有繼承, 命名空間必須單獨(dú)配置參數(shù), 不然會(huì)使用默認(rèn)值
  • 渠道配置說明

    • 渠道定義: 用戶可以訂閱渠道, 并接受該渠道推送的所有消息
    • 渠道命名中的特別字符
      • :, 命名空間分隔符, namespace:channelName
      • $, 私有渠道前綴, 客戶端必須正確的提供簽名
      • #, 用戶渠道分隔符, channelName#42, 代表只有用戶42才能訂閱此渠道, 此時(shí)需要在生成JWT token 時(shí)正確在 payload 中加入?yún)?shù) "sub": "42", 多個(gè)用戶可使用以下方式, channelName#42,43
    • 配置
      • publish: 是否允許客戶端直接推送消息到渠道, 一般情況下由后端進(jìn)行消息推送
      • subscribe_to_publish: 在推送消息之前, 是否必須要訂閱渠道才能推送
      • anonymous: 匿名訪問, JWT token 中sub為空, 默認(rèn)為false, 當(dāng)設(shè)置為true時(shí), 將默認(rèn)使用空字符串為用戶id
      • presence: 是否可查看當(dāng)前渠道的連接信息(連接的用戶)
      • join_leave: 渠道內(nèi)用戶是否接收渠道內(nèi)訂閱/取消訂閱的信息推送
      • history_recover: 是否開啟消息回復(fù), 適用于在斷掉連接重連時(shí)使用, 此時(shí) history_size 和 history_lifetime 必須配置
      • history_size: 保存多少歷史消息
      • history_lifetime: 歷史消息的保存時(shí)長(zhǎng). 單位為秒

部署

參考demo中的README

Q&A

  1. 啟動(dòng)centrifugo后, 建立連接報(bào)錯(cuò): "attempt to call field 'replicate_commands' (a nil value)"
    • 詳細(xì)細(xì)節(jié)參考issus
    • centrifugo啟動(dòng)后存儲(chǔ)引擎有兩種可選方案, 內(nèi)存和redis. 此bug出現(xiàn)在使用redis引擎的時(shí)候, centrifugo 2.x 版本依賴redis版本為 3.2.x 以上, 請(qǐng)檢查依賴, 并升級(jí)
    • Ubuntu 16.04 默認(rèn)源中的 Redis 版本是3.0版本套腹,不是最新版捶障,要想通過 apt-get install 的方式安裝最新版,首先添加 Redis 源。可執(zhí)行以下步驟升級(jí):
      • 首先安裝依賴:sudo apt-get install software-properties-common -y
      • 使用如下命令添加 Redis 鏡像源:sudo add-apt-repository ppa:chris-lea/redis-server -y
      • 使用如下命令安裝 Redis:sudo apt-get update && sudo apt-get install redis-server -y
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末揭厚,一起剝皮案震驚了整個(gè)濱河市却特,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌筛圆,老刑警劉巖裂明,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異太援,居然都是意外死亡闽晦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門提岔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仙蛉,“玉大人,你說我怎么就攤上這事碱蒙≤瘢” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵赛惩,是天一觀的道長(zhǎng)哀墓。 經(jīng)常有香客問我,道長(zhǎng)喷兼,這世上最難降的妖魔是什么篮绰? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮季惯,結(jié)果婚禮上吠各,老公的妹妹穿的比我還像新娘。我一直安慰自己星瘾,他們只是感情好走孽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著琳状,像睡著了一般磕瓷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上念逞,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天困食,我揣著相機(jī)與錄音,去河邊找鬼翎承。 笑死硕盹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的叨咖。 我是一名探鬼主播瘩例,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼啊胶,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了垛贤?” 一聲冷哼從身側(cè)響起焰坪,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎聘惦,沒想到半個(gè)月后某饰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡善绎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年黔漂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片禀酱。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡炬守,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出比勉,到底是詐尸還是另有隱情劳较,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布浩聋,位于F島的核電站观蜗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏衣洁。R本人自食惡果不足惜墓捻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坊夫。 院中可真熱鬧砖第,春花似錦、人聲如沸环凿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)智听。三九已至羽杰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間到推,已是汗流浹背考赛。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留莉测,地道東北人颜骤。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像捣卤,于是被迫代替她去往敵國(guó)和親忍抽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子八孝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 九 而奔這時(shí)除了學(xué)習(xí)季節(jié)性利益最大部門的業(yè)務(wù)技能唆阿,其他時(shí)間也就是打混混時(shí)間。這時(shí)候奔和馳也開始熟起來锈锤,但也只...
    韓馳冰閱讀 330評(píng)論 0 0
  • 又是天山遠(yuǎn) 還有云去閑 曦光九州燦 木窠鵲兒旋
    象天之性閱讀 115評(píng)論 0 0
  • 4.25日作業(yè) 請(qǐng)運(yùn)用會(huì)議模板,將今日或近期開會(huì)內(nèi)容用思維導(dǎo)圖整理出來闲询。 有幾年不做辦公室了久免,也很少參加會(huì)議,竟然...
    玉蘭心教育閱讀 550評(píng)論 0 0
  • 如果你還不了解AI的準(zhǔn)確含義扭弧,請(qǐng)查看我之前的文章: 人人都能搞懂的AI(一) 人人都能搞懂的AI(二)- AI項(xiàng)目...
    Hawwwk閱讀 348評(píng)論 0 0
  • 清明節(jié)阎姥。上墳。 前年鸽捻,或是大前年呼巴,父親花了些錢,擴(kuò)建墳?zāi)褂眩盐液臀业钠拮拥膲炇叶家徊⒃旌靡赂稀D赣H父親的,我和妻子的厚满,...
    張全敏閱讀 210評(píng)論 0 0