文档章节

【原创】图解 hotwheels

摩云飞
 摩云飞
发布于 2015/12/17 16:52
字数 1627
阅读 5977
收藏 137


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



© 著作权归作者所有

共有 人打赏支持
摩云飞
粉丝 368
博文 534
码字总数 952694
作品 0
徐汇
程序员
加载中

评论(14)

站内留言
站内留言
@七哥 单独
摩云飞
摩云飞

引用来自“职通网”的评论

[root@jobell hotwheels]# make sh
erl -make -smp disable
erl -pa ebin mochiweb/ebin +A 8 +K true +P 120000 -smp disable -mnesia dir '"/tmp/janus.db"' -s mnesia start -janus cluster -janus listen_port 8081 -name debug
Erlang/OTP 18 [erts-7.0] [source-4d83b58] [async-threads:8] [hipe] [kernel-poll:true]

Eshell V7.0 (abort with ^G)
(debug@jobell.cc)1> bot:test(flashbot, 20000).
67.1980ms | min
500.0000ms | 5823 - 29.12%
1000.0000ms | 8291 - 41.45%
1500.0000ms | 5886 - 29.43%
1254.4400ms | max

=INFO REPORT==== 18-Dec-2015::15:14:24 ===
setup: 25943.54ms, good: 20000, bad: 0, run: 28264.72ms
ok
职通网
职通网
[root@jobell hotwheels]# make sh
erl -make -smp disable
erl -pa ebin mochiweb/ebin +A 8 +K true +P 120000 -smp disable -mnesia dir '"/tmp/janus.db"' -s mnesia start -janus cluster -janus listen_port 8081 -name debug
Erlang/OTP 18 [erts-7.0] [source-4d83b58] [async-threads:8] [hipe] [kernel-poll:true]

Eshell V7.0 (abort with ^G)
(debug@jobell.cc)1> bot:test(flashbot, 20000).
67.1980ms | min
500.0000ms | 5823 - 29.12%
1000.0000ms | 8291 - 41.45%
1500.0000ms | 5886 - 29.43%
1254.4400ms | max

=INFO REPORT==== 18-Dec-2015::15:14:24 ===
setup: 25943.54ms, good: 20000, bad: 0, run: 28264.72ms
ok
职通网
职通网
R18下可以跑起来。只不过就是有一些警告说调用了过时的api
摩云飞
摩云飞

引用来自“Kabie”的评论

看了下。。。这项目7年了。。。R18上搞不好跑不起来了……
嗯,项目是比较老了,要想真正跑起来,需要改一些东西,我在 R17 上进行的上述测试,相信 R18 上也一样可以~~
Kabie
Kabie
看了下。。。这项目7年了。。。R18上搞不好跑不起来了……
摩云飞
摩云飞

引用来自“八宝粥”的评论

跟icomet是同一场景么?有何区别和优势?
之前没了解过 icomet ,查阅了一下相关资料,icomet 确实很强大。 简单想了想区别: hotwheels 是基于 erlang 语言编写的,所以应该容易扩展为分布式+集群部署,另外,可能在 SMP 场景下有一定优势;另外,hotwheels 仅仅定义了几条和订阅、发布相关的内容,所以,我认为 hotwheels 的价值更多体现在其结构设计上(在 erlang 语言中,结构设计比较重要)。 icomet 是基于 libevent 实现的,所以在并发处理能力上应该是很强大的,毕竟基于 libevent 实现的产品级应用有很多(例如 memcached、MySQL-Proxy等) 至于优势,我觉得还是根据使用语言的具体情况来进行判断吧~~
八宝粥
八宝粥
跟icomet是同一场景么?有何区别和优势?
摩云飞
摩云飞

引用来自“葫芦咩”的评论

这个更像写轮眼13
确实,估计写轮眼就是参考的风火轮~~
摩云飞
摩云飞

引用来自“yak”的评论

这能推送到手机app吗?

引用来自“职通网”的评论

按照说的,只要支持tcp就可以推送的。所以可以推送到手机app的。
理论上讲是可以的,但毕竟这个东东不是专门针对手机推送设计的...
App-V 原创文章贴 (持续更新)

先整理了一部分文章出来以供参考,资源链接会不定期持续进行更新 App-V 参考工具之(一):Process Monitor http://bbs.winos.cn/thread-57593-1-1.html App-V 参考工具之(二):Client Di...

像教授
2017/11/26
0
0
用SourceTree轻松Git项目图解

这篇文档的目的是:让使用Git更轻松。 看完这篇文档你能做到的是: 1、简单的用Git管理项目。 2、怎样既要开发又要处理发布出去的版本bug情况。 SourceTree是一个免费的Git图形化管理工具,m...

Lunqi
2015/09/03
9.3K
2
机器学习 人工智能 博文链接汇总

115 [入门问题] [TensorFlow] [深度学习] [好玩儿的算法应用实例] [聊天机器人] [神经网络] [机器学习] [机器学习算法应用实例] [自然语言处理] [数据科学] [Python] [Java] [机器学习--初...

aliceyangxi1987
2017/05/13
0
0
[Java教程 05] 常量与进制概述

前言 上一节我们介绍了注释、关键字与标识符,本章给大家介绍一下常量,准备好没有,要开车了! 常量 常量概述 在程序执行的过程中其值不可以发生改变 Java中常量分类 字面值常量 自定义常量...

呆萌钟
04/03
0
0
Blog归档

不知不觉,从2009年到现在博客已经156篇了,其中138篇原创,3篇翻译,15篇转载。在首页做个归档,方便查找。 Troubleshooting系列 《write through设置不当导致读写速度很慢》--http://taot...

taojin1240
2012/05/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

49.Nginx防盗链 访问控制 解析php相关 代理服务器

12.13 Nginx防盗链 12.14 Nginx访问控制 12.15 Nginx解析php相关配置(502的问题) 12.16 Nginx代理 扩展 502问题汇总 http://ask.apelearn.com/question/9109 location优先级 http://blog....

王鑫linux
今天
1
0
Nginx防盗链、访问控制、解析php相关配置、Nginx代理

一、Nginx防盗链 1. 编辑虚拟主机配置文件 vim /usr/local/nginx/conf/vhost/test.com.conf 2. 在配置文件中添加如下的内容 { expires 7d; valid_referers none blocked server_names *.tes......

芬野de博客
今天
0
0
spring EL 和资源调用

资源调用 import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.PropertySource;import org.springframework.core.io.Resource;......

Canaan_
今天
1
0
memcached命令行、memcached数据导出和导入

一、memcached命令行 yum装telnet yum install telent 进入memcached telnet 127.0.0.1 11211 命令最后的2表示,两位字节,30表示过期时间(秒) 查看key1 get key1 删除:ctrl+删除键 二、m...

Zhouliang6
今天
1
0
Linux定时备份MySQL数据库

做项目有时候要备份数据库,手动备份太麻烦,所以找了一下定时备份数据库的方法 Linux里有一个 crontab 命令被用来提交和管理用户的需要周期性执行的任务,就像Windows里的定时任务一样,用这...

月夜中徘徊
今天
1
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部