PHIMMessageBus 是一个轻量级、可扩展的 IM 消息解析与分发中间层,用来在 IM SDK 与业务处理逻辑之间建立一层清晰、稳定的消息总线。

它的核心目标不是替代 IM SDK,而是把“消息识别、模型映射、路由分发、Handler 订阅”这些通用能力抽出来,降低业务侧接入和维护成本。

特性

  • SDK 解耦:支持接入任意 IM SDK,不依赖具体实现
  • 自动解析:将原始消息数据解析为强类型业务模型
  • 精准分发:按消息类型分发给对应的 Handler
  • 可扩展:支持自定义 KeyProviderModelFactoryParser
  • 低侵入:业务层只关注注册和处理,不关注分发细节
  • 可观测:内置日志能力,便于调试链路问题

适用场景

当你的 IM 消息系统存在以下问题时,PHIMMessageBus 会比较适合:

  • 原始消息结构复杂,业务层重复做字典解析
  • 多种消息类型混杂在同一条回调链路中
  • 不同业务方都需要监听特定消息
  • 消息类型、解析规则、业务处理逻辑耦合严重
  • 想在不改业务代码的情况下替换或适配不同 IM SDK

整体架构

整个系统分为两个阶段:

  • 初始化阶段:建立消息类型与处理关系
  • 运行时阶段:完成消息解析与分发

从职责划分上看,框架内部主要由以下几部分组成:

  • PHIMCenter:统一入口,负责配置、注册和分发
  • PHIMMessageRegistry:维护 messageKey -> ModelType 的映射关系
  • PHIMDispatchCenter:维护 ModelType -> Handler 的订阅关系,并执行解析与分发
  • PHIMMessageKeyProvider:从原始消息中提取消息类型标识
  • PHIMMessageModelFactory:负责将字典数据构建为业务模型
  • PHIMMessageBodyParser:负责按需提取消息体中需要解析的字段

架构设计

初始化阶段

在系统初始化阶段,主要完成两件事情:

第一是注册消息类型,通过 Registry 建立 messageKey 到 ModelType 的映射; 第二是注册监听关系,通过 DispatchCenter 建立 ModelType 到 Handler 的订阅关系。

虽然这两个过程在实现上是分离的,但在 API 层做了封装,对外只暴露一个 addHandler 方法,简化使用成本。

消息处理阶段

在消息处理阶段,整个流程是一个典型的“解析 + 路由 + 分发”链路:

首先从 RawMessage 中解析出原始字典数据; 然后通过 KeyProvider 提取消息类型 key; 在 Registry 中查找对应的模型类型; 接着进入 DispatchCenter,在这里通过 Parser 对数据进行按需提取; 再通过 ModelFactory 构建业务模型; 最终封装成统一的 MessageContainer,并根据 messageKey 分发给所有订阅的 Handler

快速开始

1. 基础配置

PHIMCenter.shared.setPrintLog(true)
PHIMCenter.shared.setKeyProvider(PHExampleKeyProvider())
PHIMCenter.shared.setModelFactory(PHExampleModelFactory())

2. 注册消息监听

PHIMCenter.shared.addHandler(self, for: [
    PHExampleMessage.self
])

3. 实现消息处理

extension ViewController: PHIMHandlerProtocol {

    func handle(_ message: PHIMMessageContainer) {
        if let msg = message.body as? PHExampleMessage {
            print("收到消息: \(msg)")
        }
    }
}

4. 分发消息

下面示例模拟 IM SDK 回调,将原始消息传入消息总线:

let rawContent = """
{
    "content": {
        "homeScore": 2,
        "statusId": 2,
        "awayScore": 4,
        "matchTiming": "第一节07:24",
        "scheduleId": 3916567
    },
    "type": 60016
}
"""

let message = PHExmapleIMRawMessage(
    rawContent: rawContent,
    sessionId: "1",
    sessionType: .chatroom
)

PHIMCenter.shared.dispatch([message])

核心组件

PHIMCenter

统一入口,负责:

  • 初始化配置
  • 注册 Handler
  • 分发消息
  • 控制日志输出

PHIMMessageRegistry

注册中心,负责:

  • 维护 messageKey -> MessageModel 映射关系
  • 为运行时路由提供模型类型查找能力

PHIMDispatchCenter

分发中心,负责:

  • 维护消息订阅关系
  • 调用 Parser 提取消息体
  • 调用 ModelFactory 构建模型
  • 将消息精准分发给对应 Handler

PHIMMessageProtocol

public protocol PHIMMessageProtocol {
    /// 消息标识(唯一 key)
    static var messageKey: String { get }

    /// 解析字段,默认可指向 content 等节点
    static var parseKey: String? { get }
}

PHIMHandlerProtocol

public protocol PHIMHandlerProtocol: AnyObject {
    func handle(_ message: PHIMMessageContainer)
}

扩展能力

自定义 KeyProvider

你可以根据自己的 IM 协议,从原始字典中提取消息类型:

class CustomKeyProvider: PHIMMessageKeyProvider {
    func messageKey(from dict: [String: Any]) -> String? {
        return dict["type"] as? String
    }
}

也可以支持组合字段:

return "\(dict["cmd"])-\(dict["subType"])"

自定义 ModelFactory

ModelFactory 负责把解析后的字典转换为业务模型,可以按项目实际情况选择不同策略,例如:

  • Codable
  • ObjectMapper
  • 手动解析

https://github.com/Louis1239/PHIMMessageBus.git

 

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐