小编给大家分享一下HiveMQ是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
HiveMQ是企业级MQTT Broker,提供高性能、高可用、高扩展、高安全性的企业级服务。
它是纯Java实现的。
官网地址:http://www.hivemq.com
基于它如上的描述,所以后续我们就是基于它的高性能、高可用、高扩展、高安全性这几个特点来分析它的源码。
注意:本篇源码都是基于HiveMQ 3.1.2版本源码讲解。
Single
多个客户端直接与Broker连接。 Cluster
多个客户端与Load Balancer连接,由Load Balancer做负载均衡,将连接分发到各个Broker。 多个Broker组成Cluster,由JGroup进行集群通讯。 多个Broker由一致性hash环虚节点,进行集群中数据的主主备份,以达到高可用。 HiveMQ提供多种集群Discovery来达到不同组网场景中的集群发现。
Handlers由实现Netty ChannelHandlerAdapter。处理SSL;处理MQTT协议的codec;处理监控数据收集;处理流量限制;扩展点回调触发等客户端长链接。
SPI是HiveMQ扩展出来为做HiveMQ Broker端二次开发,提供各种- - - Callback、 Cache、Scheduler、Authentication、Authorization、- Configuration等等扩展点;还提供了各种异步/同步的接口Service。以便开发人员基于HiveMQ开发属于自己的业务;
Plugins是基于SPI提供出来的扩展点,按照HiveMQ的Plugin开发要求,注册属于客户自己的Plugin,HiveMQ官方也给我们提供出来了一些基础插件及各种插件的示例。
ClusterServices是处理集群连接、数据备份、数据交换、节点状态、一致性has虚拟节点等处理的一堆Service
Persistences是处理消息的存储、Cluster节点间的数据存储/同步。
LocalPersistences是处理消息在当前节点的信息存储。
使用Guice做DI
使用Netty 4做网络框架
使用JGroups做Cluster Node之间的集群通讯
使用Exodus做Broker信息文件持久化存储
使用Dropwizard Metrics做Broker的统计、监控
使用Kryo做序列化/反序列化
使用Jetty做Broker端servlet容器
使用Resteasy做Broker端restfull框架
使用Quartz/做Broker端任务的调度
其他还有一些使用的框架不一一列举
官方工具: https://www.hivemq.com/developers/community/
身份认证:https://www.hivemq.com/docs/4.2/extensions/introduction.html(貌似可以为每个网格提供一个身份认证器?)
硬件配置及性能优化:https://www.hivemq.com/docs/4.2/hivemq/system-requirements.html(包含文件句柄数调整及TCP缓冲器大小调整)
hivemq扩展开发库:https://github.com/hivemq?q=extension&type=&language=java(提供各种各样的api,感觉可以做很多东西)
扩展开发库api:https://www.hivemq.com/docs/4.2/extensions-javadoc/index.html
hivemq扩展程序HTTP提供了就绪检查,这意味着服务能够检测HiveMQ实例是否脱机:https://github.com/hivemq/hivemq-heartbeat-extension
基准1000W连接/40个节点=25W/node
Message Rate for Publisher
Test | Msg/sec |
---|---|
QoS 0 | 4.00 |
QoS 1 | 2.00 |
详细性能测试报告可到官网下载PDF文档
机器:
Test | Msg/sec |
---|---|
Instance Type | c4.2xlarge |
RAM | 15GiB (~16GB) |
vCPU | 8 |
Physical Processor | Intel Xeon E5-2666 v3 |
Clock Speed (GHz) | 2.9 |
Dedicated EBS Bandwidth (Mbps) | 1000 |
Operating System | Vanilla Amazon Linux ami-b73b63a0 |
结论:
hivemq client话费8分47秒连接1000W个连接到hivemq,平均每秒500个连接
CPU:38%→25%
内存:6.97-7.6
Quick Results: Connect & Subscribe Test - 10,000,000 MQTT clients
HiveMQ 3.3.0
40 node Cluster
Connect Duration: Connect Speed (avg):
CPU Memory
Subscribe Duration: Subscribe Speed (avg):
CPU Memory
8 min 47 sec 19,011 connects/sec 30 % 5.07 GB
4 min 31 sec 36,765 subscribes/sec 38 % 6.97 GB
测试表明,HiveMQ每秒平均可处理174万条消息(每秒1,739,876毫秒/秒)出,而每秒可处理16.7万条消息(166,925毫秒/秒)入。 在30分钟的测试时间内,总共有31.3亿条消息(3,131,776,800 msg)传出消息和3亿msg(300,465,888 msg)传入消息。
查看系统带宽时,HiveMQ平均每秒处理389.78兆字节(408,711,565字节/秒)出,并处理327.84 MB /秒(343,762,614字节/秒))入。
在测试执行期间,CPU使用率平均为64.72%,内存为11.33 GB(12,164,655,331字节)。
QoS 0测试表明
HiveMQ在大型群集中具有强大的吞吐能力,可以充分发挥其在水平扩展方面的优势。 具有1000万个并发连接的客户端的HiveMQ实现了每秒170万条外发消息的恒定吞吐量,平均CPU负载不超过64%。 为了使数字更易于掌握,让我们将它们与一些庞大的Internet应用程序进行比较,其中一个很好的例子是WhatsApp。 2014年,WhatsApp发推文称,一天之内,它们已收到640亿条消息(传入200亿条消息,传出440亿条消息)。 将总计640亿条消息与我们在测试中获得的数量进行比较,每30分钟添加传入和传出流量时,我们有3,432,242,688条消息。每天总共增加了1647.5亿条消息(164,747,649,024条消息)。 HiveMQ群集每天可以轻松处理通过整个WhatsApp基础架构发送的消息量的2.5倍! 在查看性能以及负载指标时,很明显,HiveMQ不仅提供高吞吐量,而且以64%的CPU和73%的内存使用率保持受控和稳定的状态。
QoS 1测试表明,
HiveMQ每秒平均可处理78万条消息(779,576 msg / sec),每秒可处理78万条消息(779.577 msg / sec)。 在30分钟的测试期间内,总共有14亿条消息(1,403,237,449 msg)传出消息和14亿消息(1,403,237,882 msg)传入。
查看系统带宽时,HiveMQ平均每秒处理279.44兆字节(293,010,785字节/秒),并处理220.24 MB /秒(230,935,379字节/秒)。
HiveMQ可以处理硬件上的10.000.000个连接,并具有出色的,稳定的吞吐量,同时在传入和传出两个方向(QoS 1测试)上具有170万个传出消息(QoS 0测试)和780 msg / sec。 HiveMQ能够轻松地水平扩展到群集节点的中间两位数 HiveMQ能够处理具有高放大倍数的大型扇出情况。在测试时间范围内,吞吐量保持恒定且稳定,消息速率随群集大小和CPU数量而变化 HiveMQ具有水平扩展的能力,因此非常适合小型和大型部署。 它是最具扩展性的MQTT代理,即使提供QoS 1保证,也具有出色的性能。
生产:Linux是生产环境当前支持的唯一操作系统。建议使用CentOS7或其他基于RHEL的发行版。
至少4GB RAM
4个或更多CPU
100GB或更多可用磁盘空间。
生产:需要OpenJDK JRE 11或更高版本。
您可以通过几种方式优化Linux配置:
如果在Linux操作系统上运行HiveMQ,请确保允许HiveMQ进程打开足够数量的文件。要调整限制,请在/etc/security/limits.conf文件中添加以下几行:
hivemq hard nofile 1000000
hivemq soft nofile 1000000
root hard nofile 1000000
root soft nofile 1000000
在具有许多连接的系统上,可能有必要调整TCP配置并使系统打开更多套接字。要进行这些调整,请在/etc/sysctl.conf文件中添加以下行:
#这会使内核在服务过载时主动发送RST数据包。
net.ipv4.tcp_fin_timeout = 30
#可分配的最大文件句柄。
fs.file-MAX = 5097152
#启用等待插座的快速回收。
net.ipv4.tcp_tw_recycle = 1
#从协议的角度来看,在安全的情况下,允许将等待套接字重新用于新连接。
net.ipv4.tcp_tw_reuse = 1
#的默认大小接收缓冲区的套接字使用。
net.core.rmem_default = 524288
#该套接字使用的发送缓冲区的默认大小。
net.core.wmem_default = 524288
#套接字使用的已接收缓冲区的最大大小。
net.core.rmem_max = 67108864
#套接字使用的已发送缓冲区的最大大小。
net.core.wmem_max = 67108864
#每个TCP连接的接收缓冲区的大小。(最小值,默认值,最大值)
net.ipv4.tcp_rmem = 4096 87380 16777216
#每个TCP连接发送的缓冲区的大小。(最小值,默认值,最大值)
net.ipv4.tcp_wmem = 4096 65536 16777216
要应用更改,请键入sysctl -p或重新启动系统。
以上是“HiveMQ是什么”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。