物联网的消息传递

为一个物联网用例部署消息代理模块,对于broker接口的可延展性而言会带来新的挑战。我们现在谈论的物联网涉及到数千个连接,消费者和目的,这让我们必须思考如何更仔细地配置和监控我们消息传递的基础设施。在本文中,我将尝试总结一些可用于当前Apache ActiveMQ的技术,以便更好地进行物联网部署。我还将介绍为5.12.0版本开发的一些新功能,以便更好地适应这个新世界。最后我会试着阐释我们的发展方向,以及我们未来可以做些什么。

ActiveMQ垂直缩放

用于物联网的两种最常用的消息传递协议是MQTT和AMQP,我们花了大量时间精力来让着两个协议在新版本中变得更稳定。但协议不是一切,每次有人开始调用broker接口时,都会出现同样的疑惑:如何从单个broker接口获得最大的可扩展性?所以,这里有一些提示:

  • 每一次都从broker扩展技术开始。这基本上意味着无论您的broker接口需要处理多少连接和目的地,都尽可能使用最少的线程。因此,建议使用NIO传输并转换每个目标线程的设置。
  • ActiveMQ的第一个MQTT协议的实现是假定QoS1和QoS2的订阅者在内部会被映射到JMS持久订阅者。JMS持久订阅者会有太多的信息堆积,并且不能很好地扩展。在以后的版本中,您会有其他的协议实现方式,如使用虚拟主题,这应该能更好的扩展信息。
  • 试用新5.12.0版本的另一个原因是这个版本对于预先分配日志文件的KahaDB消息存储的改进。你可以在这篇文章中找到关于这方面的更多信息,但是在某些文件系统上的这些调整可以显着提高性能

所有这些小小的配置调整总结在新的示例配置文件中,你可以在这里找到

examples/conf/activemq-mqtt.xml

文件在新的5.12.0发行版中。

对broker进行垂直扩展只是一部分。一个成功的物联网应用平台需要解决几个更重要的问题。

SSL

许多物联网设备依靠SSL证书进行身份验证。这不是什么新的设置,我们在传统的消息传递设置中也是这么操作的,但差异在于传输的规模。手动维护包含少量证书的密钥存储库很容易。但当证书数量开始增加时,情况就完全不同了。

在5.12.0版本中,我们增加了一些新功能来帮助人们处理这个问题。有几个标准化工具可以解决这些问题,并在JDK中得到支持。所以现在,您可以使用证书吊销列表,该列表提供了一种在运行期间撤销无效证书的简单方法。

您还可以使用OCSP(联机证书状态协议),它提供了更加自动化的方式与您的证书颁发客户端进行通信。您可以在这里找到关于这些功能的更多信息。

我认为,SSL证书配置对于物联网部署(和一般的云服务器)来说是一个更大的问题,对此已经有新兴的有趣项目试图解决它,如pki.io。我们将尝试支持所有人们在这个领域中进行的工作,现在在CRL和OCSP的支持下,在处理证书时您可以有更大的灵活性。

在压力下监测

在谈论物联网部署时,我经常遇到的一个主题是如何监视处于垂直缩放限制(无论它们是什么)的broker。我们通常使用JMX或"通知消息"机制来监视broker行为。尽管这些都是broker处于限制时的理想工具,但当broker处于临界时,情况会变得不那么理想。

随着大量目的地和连接的进出,登记MBeans和取消“通知消息”机制的成本可能会变得非常昂贵,特别是需要处理大量数据的时候。这可以阻碍broker需要做的实际工作。

想要从broker实例中获得最大收益的人通常只会关掉所有的东西,比如说

< broker useJmx = “false” advisorySupport = “false”  ... >

但这让我们对broker的状态一无所知,在日志中也无法获取信息。

我们提出的一个解决方案是使mbean注册更具选择性

从5.12.0开始,您可以定义要禁止注册的mbean名称,方法是在管理上下文中定义它们

<managementContext>
  <managementContext
    suppressMBean="endpoint=dynamicProducer,endpoint=Consumer,
                   connectionName=*,destinationName=ActiveMQ.Advisory.*"/>
</managementContext>

使用此功能,您可以自定义您需要的broker视图,并通过抑制注册/注销高频短暂的mbeans,您可以帮助您的broker处理负载。因此,即使在高规模/负载情况下,您也可以获取broker的基本指标。我们可以在这个领域做更多的事情如通过定义自定义视图等,敬请期待。

旧版MQTT

Apache ActiveMQ实现了MQTT 3.1.1规范,但MQTT不是一种新协议。同时我们已经部署了大量使用旧(3.1)客户端的设备。我们努力启用已知的使用案例中,老客户期望与3.1.1规范中的不同的部分。例如,您可以启用“美元主题”的发布,并看到在不成功的订阅尝试中的行为差异。我们将尽力涵盖所有这些角落案例,并为传统客户提供支持,而明智的做法是为这些客户提供支持。

ActiveMQ Artemis

您可能没有注意到,在Java message broker中有一些合并。HornetQ代理已经捐赠给Apache,现在是ActiveMQ项目的一部分。它的异步核心为下一代ActiveMQ提供了一个良好的基础,它应该比当前的broker更有伸缩性和更好的性能。它已经对AMQP和MQTT协议有了初步的支持。随着这些协议的加强和以上功能的完全实现,它应该成为您的物联网基础架构的主干的一个非常好的message broker。

来自朋友的帮助

来解决这个难题中,关于broker优化的部分一定是非常重要的一部分。但对于真正的大型物联网部署,我们需要的不仅仅是这些。我们需要有一个更复杂的基础设施,使我们能够分割我们的流量(连接,目的地等),提供容错和高可用性功能。有一些有趣的项目可以帮助为物联网需求构建弹性消息传递基础架构。

Qpid Dispatch Router为客户端,代理和其他基于AMQP的端点之间的消息提供无代理路由。它有助于构建最佳的拓扑结构,并将消息从客户端路由到最终目的地。例如,调度路由器可以作为客户端和代理之间的网关,帮助将大量连接或目的地集中并分散到多个代理,而无需客户端认知。这只是将路由器添加到消息传递网络可以提供帮助的示例之一。这是一个有趣的话题,未来你会在这个领域听到更多有趣的话题。

另一方面Fabric8OpenShift为我们提供了一种配置和管理此消息传递基础架构的简单方法。您可以使用它们轻松部署新broker,路由器,网关并探索现有组件。Fabric8还提供了一个网关,可用于在端点之间分配流量。

有很多方法来解决这个问题,最终的解决方案肯定取决于实际的用例。但是,将所有这些组件都集成在一起,并在最终解决方案的架构设计中发挥良好的作用是至关重要的。

结论

有了这篇文章,我试图对我们的现状以及支持物联网案例的方向给出一些看法。我希望你喜欢它,并发现它很有用。我将在十月份的Voxxed Days BelgradeApacheCon上详细介绍这个话题。

本文的版权归 KKM 所有,如需转载请联系作者。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏性能与架构

内容平台 Medium 的技术体系

Medium 是全球知名的内容平台,访问量惊人 据半年前的数据统计,用户在 Medium 上阅读时间的总和已经达到 2600年,每月有2500万阅读者,每周有数...

3666
来自专栏ThoughtWorks

你的微服务敢独立交付么?| 洞见

最近经常在项目或是社区里听到大家谈论微服务架构,但谈论的焦点更多集中在微服务拆分,分布式架构,微服务门槛,DevOps配套设施等话题上。

902
来自专栏ImportSource

我所知道的那点微服务

忽然一夜春风来,人间处处微服务。这真是一个相当火的概念啊。笔者第一次知道微服务这个概念是在15年4月份,应该是。 铺垫 有一日翻到martin fowler的博...

36110
来自专栏网络

资深女程序员告诉你:微服务架构如何实践?80%以上男程序员点赞

上篇文章给大家介绍了什么是微服务架构,本文将会讲到如何实践微服务。 不知道微服务架构的,可以看我上一篇文章 微服务听上去好像不错,具体怎么落地啊?这需要回答下面...

3897
来自专栏developerHaoz 的安卓之旅

Android 谈谈自动化测试

最近,手头上的项目基本开发完成,优化也做的差不多了,本以为可以安心准备上线。然而老板却反映说测试人员发现 App 总会出现一些莫名的 bug.

2223
来自专栏IT大咖说

测试人员必看:传统测试向工程效能转型的最佳实践

内容来源:2018 年 5 月 20 日,eBay中国研发中心技术主管茹炳晟在“2018全球技术周暨第四届南京(全球)软件大会”进行《Quality Engin...

4470
来自专栏Spark学习技巧

第5篇:数据库系统的实现

前言 前面的文章中,主要都是在围绕关系数据库理论进行研究,没有涉及到数据库系统的具体实现。 虽说数据库系统的具体实现因业务环境,RDBMS等因素而异,但总体开发...

3107
来自专栏Java架构解析

Java程序员,最常用的20%技术

我想到了我当年第一份工作,也是两个月从零学JAVA。当时就买了3本书,强啃了6周。记住一点,时间有限,别听网上很多大牛的,他们说的太杂。你要抓重点,你只要让人家...

1100
来自专栏程序人生 阅读快乐

Nginx模块开发指南:使用C++11和Boost程序库

Nginx 是由俄罗斯工程师Igor Sysoev 开发的一个高性能Web 服务器,运行效率远超传统的Apache、Tomcat,是世界第二大Web 服务器,被...

832
来自专栏杨建荣的学习笔记

Active Data Guard初探(一) (r10笔记第76天)

对于Active Data Guard,我是这样想的,可能会有很多不对的地方,互相讨论,一起补充吧。 如果有一天我成了Oracle的产品架构师,时光倒退...

3309

扫码关注云+社区

领取腾讯云代金券