項目地址:
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 ]}.