【原創】圖解 hotwheels



項目地址: tolbrino/hotwheels
項目說明: Erlang messaging server optimized to send 1 message to 40k subscribers to a topic in < 1s

概述

      Janus 是一種消息服務器,專門被優化以便可以處理,以 TCP 單播方式同時發消息給數以千計客戶端的場景。這些客戶端能夠訂閱到各類 topic 上。  
      終極目標是可以在 20k 客戶端同時在線的狀況下,進行消息推送時保證延時低於 2 秒。  

關於 Janus 的歷史

      在羅馬神話中 Janus 是天門神,早晨打開天門,讓陽光普照人間,晚上又把天門關上,使黑暗降臨大地。他的頭部先後各有一副面孔,同時看着兩個不一樣方向,一副看着過去,一副看着將來,所以也稱兩面神,或被尊稱爲時間之神。羅馬有好幾座 Janus 神廟。Janus 掌管全部的出入門戶,所以羅馬人在戰時永遠將 Janus 神殿的門敞開着,以便軍人在敗陣時躲入殿內以求庇護,或是在打敗時凱旋入殿。早期的 Janus 神像的兩副面孔都有鬍子,後來沒有鬍子,可是一副面孔年輕,另外一副面孔年老。Janus 的右手指上刻有數字 CCC(300),左手指上刻着數字 LXV(65),合在一塊兒恰是一年的天數。從紀元前 1 世紀起,羅馬人把祭祀 Janus 的節日和新年結合在一塊兒。羅馬的執政官也在元旦這一天就任,並向 Janus 獻祭,祈求國家的安寧。爲了記念 Janus,羅馬人把正月稱爲 Januarius(mensis),意含「Janus 之月」,英文借用了該詞,先做 Januarie,後做 January 。而在英文吸取 January 一詞以前,撒克遜人把正月叫做 Wulf-Monath(wolf-month),意爲「狼月」,由於此時正值嚴冬,是狼羣出沒村子尋覓食物的時節。

關於 hotwheels(即風火輪)的歷史

      風火輪,雙輪暗藏風火之勢,行動間有風雷之聲,故稱風火輪。可踏在腳下做爲交通工具,踏上其輪,念動咒語,上天入地,無所不能。 傳說是青鸞火鳳所化,一蹬九萬里,雙足十八萬裏。傳說中爲哪吒兵器之一。

監督樹整體結構

|
                                                   janus_app
                                                      |
                                                      | (one_for_one)
               +-------------------+------------------+--------------------+
               |                   |                  |                    |
               |                   |                  |                    |
             topman          janus_acceptor      (supervisor)            mapper
               |                                      |
               |                                      | (simple_one_for_one)
      +--------+-------|                     +--------+-------+
      |        |       |                     |        |       |
      |        |       |                     |        |       |
   pubsub     ...   pubsub                  ...   transport  ...
(topic:<<"T1">>)  (topic:<<"T2">>)                    |
                                                      | (janus_flash 封裝層)
                                                      |
                                                 client_proxy
其中
topman - 維護 pubsub 進程和 Topic 的映射關係;
pubsub - 關聯特定  Topic 的進程 ;維護全部訂閱到該 Topic 的進程信息;
janus_acceptor - 處理來自網絡的 TCP 鏈接;動態建立 transport 和 client_proxy 進程,以處理後續協議交互;
transport - 針對某個 TCP 鏈接上的數據處理;
client_proxy - 實際處理訂閱,取消訂閱,以及消息推送的模塊;
mapper 提供輕量級進程註冊管理功能;

subscriber 行爲

 

janus 針對 subscribe 的內部處理


publisher 行爲


janus 針對 publish 的內部處理

協議細節

subscriber 協議交互


對應
flashbot                                               janus

        <regular-socket/>,0,PING,0
		---------------------------------------------->
		
		{
			"timestamp":[1448,434925,303633],
			"token":[55,97,55,100,48,102,56,98,102,97,97,49,54,101,48,48,48,100,101,99,54,55,48,57,55,99,101,99,97,99,56,56]
		},1
		<----------------------------------------------
		
		<regular-socket/>,0,
		{
			"action":"subscribe",
			"data":"events"
		},0
		---------------------------------------------->
		
												ACK,1
		<----------------------------------------------
		
		{
			"timestamp":[1448,434925,395864],
			"topic":"events",
			"event":"test_event",
			"message_id":"",
			"data":"test"
		},1
		<----------------------------------------------
		
		<regular-socket/>,0,
		{
			"action":"unsubscribe",
			"data":"events"
		},0
		---------------------------------------------->
對應
00000000  3c 72 65 67 75 6c 61 72  2d 73 6f 63 6b 65 74 2f <regular -socket/
00000010  3e 00 50 49 4e 47 00                             >.PING.
    00000000  7b 22 74 69 6d 65 73 74  61 6d 70 22 3a 5b 31 34 {"timest amp":[14
    00000010  34 38 2c 34 33 34 39 32  35 2c 33 30 33 36 33 33 48,43492 5,303633
    00000020  5d 2c 22 74 6f 6b 65 6e  22 3a 5b 35 35 2c 39 37 ],"token ":[55,97
    00000030  2c 35 35 2c 31 30 30 2c  34 38 2c 31 30 32 2c 35 ,55,100, 48,102,5
    00000040  36 2c 39 38 2c 31 30 32  2c 39 37 2c 39 37 2c 34 6,98,102 ,97,97,4
    00000050  39 2c 35 34 2c 31 30 31  2c 34 38 2c 34 38 2c 34 9,54,101 ,48,48,4
    00000060  38 2c 31 30 30 2c 31 30  31 2c 39 39 2c 35 34 2c 8,100,10 1,99,54,
    00000070  35 35 2c 34 38 2c 35 37  2c 35 35 2c 39 39 2c 31 55,48,57 ,55,99,1
    00000080  30 31 2c 39 39 2c 39 37  2c 39 39 2c 35 36 2c 35 01,99,97 ,99,56,5
    00000090  36 5d 7d 01                                      6]}.
00000017  3c 72 65 67 75 6c 61 72  2d 73 6f 63 6b 65 74 2f <regular -socket/
00000027  3e 00 7b 22 61 63 74 69  6f 6e 22 3a 22 73 75 62 >.{"acti on":"sub
00000037  73 63 72 69 62 65 22 2c  22 64 61 74 61 22 3a 22 scribe", "data":"
00000047  65 76 65 6e 74 73 22 7d  00                      events"} .
    00000094  41 43 4b 01                                      ACK.
    00000098  7b 22 74 69 6d 65 73 74  61 6d 70 22 3a 5b 31 34 {"timest amp":[14
    000000A8  34 38 2c 34 33 34 39 32  35 2c 33 39 35 38 36 34 48,43492 5,395864
    000000B8  5d 2c 22 74 6f 70 69 63  22 3a 22 65 76 65 6e 74 ],"topic ":"event
    000000C8  73 22 2c 22 65 76 65 6e  74 22 3a 22 74 65 73 74 s","even t":"test
    000000D8  5f 65 76 65 6e 74 22 2c  22 6d 65 73 73 61 67 65 _event", "message
    000000E8  5f 69 64 22 3a 22 22 2c  22 64 61 74 61 22 3a 22 _id":"", "data":"
    000000F8  74 65 73 74 22 7d 01                             test"}.
00000050  3c 72 65 67 75 6c 61 72  2d 73 6f 63 6b 65 74 2f <regular -socket/
00000060  3e 00 7b 22 61 63 74 69  6f 6e 22 3a 22 75 6e 73 >.{"acti on":"uns
00000070  75 62 73 63 72 69 62 65  22 2c 22 64 61 74 61 22 ubscribe ","data"
00000080  3a 22 65 76 65 6e 74 73  22 7d 00                :"events "}.

publisher 協議交互


對應
flashbot                                               janus

        <regular-socket/>,0,PUBLISH,0
		{
			"topic":"events",
			"event":"test_event",
			"message_id":"",
			"data":"test"
		}
		---------------------------------------------->
		
		{
			"timestamp":[1448,434925,395595],
			"token":[100,52,97,53,56,51,54,99,57,97,50,52,50,57,52,57,55,48,52,102,48,100,99,53,102,55,56,101,101,97,53,98]
		},1
		<----------------------------------------------
對應
00000000  3c 72 65 67 75 6c 61 72  2d 73 6f 63 6b 65 74 2f <regular -socket/
00000010  3e 00 50 55 42 4c 49 53  48 00 7b 22 74 6f 70 69 >.PUBLIS H.{"topi
00000020  63 22 3a 22 65 76 65 6e  74 73 22 2c 22 65 76 65 c":"even ts","eve
00000030  6e 74 22 3a 22 74 65 73  74 5f 65 76 65 6e 74 22 nt":"tes t_event"
00000040  2c 22 6d 65 73 73 61 67  65 5f 69 64 22 3a 22 22 ,"messag e_id":""
00000050  2c 22 64 61 74 61 22 3a  22 74 65 73 74 22 7d    ,"data": "test"}
    00000000  7b 22 74 69 6d 65 73 74  61 6d 70 22 3a 5b 31 34 {"timest amp":[14
    00000010  34 38 2c 34 33 34 39 32  35 2c 33 39 35 35 39 35 48,43492 5,395595
    00000020  5d 2c 22 74 6f 6b 65 6e  22 3a 5b 31 30 30 2c 35 ],"token ":[100,5
    00000030  32 2c 39 37 2c 35 33 2c  35 36 2c 35 31 2c 35 34 2,97,53, 56,51,54
    00000040  2c 39 39 2c 35 37 2c 39  37 2c 35 30 2c 35 32 2c ,99,57,9 7,50,52,
    00000050  35 30 2c 35 37 2c 35 32  2c 35 37 2c 35 35 2c 34 50,57,52 ,57,55,4
    00000060  38 2c 35 32 2c 31 30 32  2c 34 38 2c 31 30 30 2c 8,52,102 ,48,100,
    00000070  39 39 2c 35 33 2c 31 30  32 2c 35 35 2c 35 36 2c 99,53,10 2,55,56,
    00000080  31 30 31 2c 31 30 31 2c  39 37 2c 35 33 2c 39 38 101,101, 97,53,98
    00000090  5d 7d 01                                         ]}.
相關文章
相關標籤/搜索