在当今的物联网领域,MQTT协议已经成为不可或缺的关键要素,为高效、实时的数据传递提供了核心技术支持。然而,目前市场上提供MQTT能力的项目主要集中在传统的、现有的"开箱即用"物联网设备管理平台上,导致更底层的MQTT协议实现缺乏足够的关注和探索。然而,我们深信MQTT协议的特性有着更广泛的应用前景,不仅仅局限于物联网领域。正是出于这一信念,经过多年的实践和技术积累我们推出了开源项目BifroMQ,专注于MQTT协议的高效处理,尤其是在面对大规模负载时的卓越表现。
▌中立性和可扩展性兼具的MQTT协议中间件
相较于传统的物联网设备管理平台,BifroMQ在设计上秉承与众不同的理念。我们大胆地抛弃了"一揽子解决方案"的传统范式,将注意力集中在高性能MQTT协议的需求上。我们坚信MQTT的协议特性具有更广泛的应用范式,因此BifroMQ致力于充分发挥MQTT协议的潜力,尤其是在处理大规模负载时的卓越性能。
相较于在MQTT实现中内置与下游系统的集成逻辑(如:Kafka),BifroMQ更倾向于通过符合MQTT标准的方式与下游系统"对接"。例如,通过共享订阅(Shared Subscription)机制,将集成逻辑外置,实现更加解耦的桥接和向异构系统转发消息的能力,同时保持高消息吞吐率。这种设计理念使得BifroMQ成为一个高度可定制的中间件,能够轻松适应各类下游系统,满足不同业务场景的需求。
▌构建大规模多租户的Serverless云服务
BifroMQ的使命在于构建适用于大规模多租户的MQTT消息系统,以支持开展Serverless类型云服务的业务特性。这一使命是基于对MQTT协议特性的深刻理解和对其更广泛应用的信心所驱动的。与传统的企业级架构不同,Serverless云服务强调资源按需分配、弹性扩展及高度灵活的服务构建。正因如此,BifroMQ通过其多租户架构和资源共享机制,为Serverless类型的业务提供了"共享资源、独享体验"的特性。
▌企业级部署:灵活性与稳健性兼备
虽然BifroMQ的目标是构建多租户的Serverless云服务,但多租户+共享资源本质上是单租户独享资源的抽象。与我们的理念一致,通过核心组件的自由组合和配置,BifroMQ轻松支持常见的"Shared Nothing"企业级集群部署。实际上,这也是BifroMQ开源版本的默认部署模式。这种灵活性使得BifroMQ能够适应各种规模和需求的系统架构。
▌BifroMQ的架构解析
BifroMQ的架构设计基于"第一性原理",从技术角度分析实现设计目标所需的技术以及如何将这些技术"有机"地组合起来,以达到整体优化的效果。因此,仅从项目结构和代码逻辑很难全面地理解其内涵。下面将从三个主要角度对BifroMQ的整体架构进行高层次的描述。
▌基于去中心化集群管理的模块化架构
首先,抛开MQTT协议本身的实现逻辑,BifroMQ的各个功能服务模块构建在一套去中心化的底层集群构建能力(base-cluster)之上,如下图所示:
▲ BifroMQ 去中心化集群的模块化架构
base-cluster构建的集群逻辑上分为两层:Underlay Cluster和Overlay Cluster。Underlay Cluster被称为"Host" Cluster,每个Host在BifroMQ中对应着运行在操作系统上的一个服务进程(Process)。Host Cluster采用Gossip类的协议(SWIM Protocol)实现了Host成员服务(Membership),并为Overlay Cluster提供了Host地址的抽象。Overlay Cluster被称为"Agent" Cluster,它在Host地址的基础上提供了Agent级别的地址抽象(Agent Address)。在BifroMQ中,Agent对应着实现具体功能的逻辑服务(Service)。这些逻辑服务(通过base-rpc框架统一实现)包括了客户端和服务端两种角色的模块,利用Agent Cluster的能力来实现服务的注册和发现。
这种架构带来的好处包括:
1.逻辑服务与服务所在进程解耦,使得根据部署场景可以更加灵活地封装和组合。
2.逻辑服务的"服务发现"不依赖传统意义上的注册中心或名字服务,从而消除了单点故障的运维风险,使得集群规模能够自由伸缩。
▌模块化的负载隔离与协作
接下来,我们从协议实现的角度描述BifroMQ的结构。在从构建Serverless云服务的角度出发进行架构设计时,需要从负载隔离和管理的角度考虑功能实现的合理性,也就是负载的多租户化。我们将MQTT协议的工作负载进行了拆分,使得每种负载都能以独立子集群的形式存在,而这些子集群通过协作构建了完整的MQTT能力。下面是BifroMQ中MQTT负载相关的模块:
● bifromq-mqtt:负责处理MQTT协议的长连接负载
● bifromq-dist:负责维护MQTT订阅状态的高可靠存取和大规模消息路由
● bifromq-inbox:负责CleanSession=false模式下订阅方会话消息的高可靠存取
● bifromq-retain:负责Retain消息的高可靠存取
这些模块之间的协作关系如下图所示:
▲ BifroMQ 各模块协作关系1
▲ BifroMQ 各模块协作关系2
值得一提的是,bifromq-dist、bifromq-inbox和bifromq-retain模块都充分利用了base-kv的能力,实现了对关键负载的分布式强一致性持久化。在Serverless云服务的运维场景中,这点对保证SLA尤为重要。
▌中立性:面向标准与可扩展的集成
前文提到,BifroMQ的定位是实现MQTT标准的中间件,更加强调中立性和被集成性。与其他包含MQTT能力的"一揽子物联网平台"项目并不处于同一层上。因此,判断"BifroMQ是否具备某种功能或未来是否会支持某种功能?"的标准非常简单:凡是MQTT协议定义的能力都属于bifromq项目需要支持的范畴,而一切超出MQTT协议定义的功能,我们更倾向于以独立组件或服务的方式存在,并通过符合MQTT标准的方式与BifroMQ集成。这种方法有助于构建更大规模的云服务并促进相关技术的成熟。当然,BifroMQ的被集成性还体现在作为中间件本身与各种业务系统的集成上,主要包括三种机制:Plugin、API和Metrics:
▲ 典型场景集成架构
- Plugin机制是实现业务逻辑集成的主要方式。bifromq目前定义了以下plugin接口模块:
- bifromq-plugin-auth-provider:实现客户端认证和基于消息主题的Pub/Sub鉴权逻
- bifromq-plugin-event-collector:实现由各类MQTT相关事件触发的业务逻辑
- bifromq-plugin-setting-provider:实现租户级运行时设置变更管理逻辑
- 这些接口的参考实现可以在BifroMQ-Inside项目中找到。
- API机制(即将推出)提供了BifroMQ的运行时HTTP管理接口,实现服务端订阅管理和断开连接等基本管理操作。
- Metrics机制通过使用micrometer库实现了指标的定义和采样,但没有限定收集端的类型,从而使业务集成方能够自定义(可以参考项目中的build-plugin-demo模块)。
▌总结
综上是对BifroMQ技术架构的整体介绍。请期待我们将在接下来发布的一系列专题文章中,深入探讨BifroMQ的各个组件和设计原则。
最后,为了帮助大家更好地了解BifroMQ的技术架构,我们将于9月21日(周四)举办一场BifroMQ线上直播公开课,欢迎各位关注上述BifroMQ开发者交流群内信息,提前锁定直播地址,与广大同行交流学习!