跳到主要内容

多租户

概述

YedMQ 的多租户功能提供了一种健壮且安全的方式,在单一消息代理基础设施上支持多个组织。这种架构确保了不同租户之间的完全隔离,同时最大限度地提高了资源利用率并降低了运营开销。

默认情况下,对于未指定租户的所有连接,YedMQ 使用名为 public 的租户 ID。

关键特性

租户隔离

  • 命名空间隔离:每个租户拥有其主题的专用命名空间。一个租户的主题和消息对其他租户完全不可见。
  • 连接隔离:客户端会话按租户 ID 隔离。客户端 ID 只需在单个租户内保持唯一即可。
  • REST API 支持:YedMQ 提供租户范围的 REST API 端点,允许对每个租户的主题、会话和消息进行细粒度管理。

默认租户

如果在身份验证过程中未提供租户 ID,YedMQ 将连接分配给名为 public 的默认租户。这确保了与标准 MQTT 客户端的向后兼容性,并简化了不需要多租户的设置。

如何设置租户 ID

YedMQ 主要通过其身份验证插件 (Authentication Plugin) 实现多租户管理。

当新的 MQTT 客户端尝试建立连接时,身份验证插件会拦截该过程。根据客户端的身份(用户名、客户端 ID、证书等),插件可以向代理返回 tenant_id

身份验证过程

  1. 连接参数解析:插件接收连接详细信息,包括客户端 ID、用户名、密码和客户端 IP。
  2. 租户识别:插件逻辑确定客户端属于哪个租户。
  3. 返回租户 ID:插件返回包含 tenant_idAuthenticateResponse

示例(Proto 定义):

message AuthenticateResponse { 
bool authenticated = 1;
// ...
optional string tenant_id = 5; // 租户 ID
}

动态租户创建

YedMQ 中的租户是动态创建的。当客户端以新的 tenant_id(经插件授权)连接,或者针对新租户进行订阅时,YedMQ 会自动为该租户初始化必要的内部结构。

REST API 集成

所有租户相关的资源都可以通过 REST API 使用路径中的租户 ID 进行访问:

  • GET /api/v1/:tenant_id/clients: 列出租户内的客户端。
  • GET /api/v1/:tenant_id/topics: 列出租户内的主题。
  • GET /api/v1/:tenant_id/messages/retained: 列出租户的保留消息。
  • POST /api/v1/:tenant_id/messages: 向租户的主题发布消息。