14 KiB
会话实体设计
**本文档引用的文件** - [ChatMessage.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/ChatMessage.cs) - [UserChatCard.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/UserChatCard.cs) - [MessageStore.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/MessageStore.cs) - [UserChatFriend.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/UserChatFriend.cs) - [MessageType.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageType.cs) - [MessageSourceType.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageSourceType.cs) - [UserOnlineState.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.IM/LINGYUN/Abp/IM/UserOnlineState.cs) - [UserFriendStatus.cs](file://aspnet-core/modules/realtime-message/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Contract/UserFriendStatus.cs)目录
简介
本文档详细说明了实时消息模块中会话实体的设计与实现。系统通过ChatMessage实体表示消息会话,支持单聊、群聊等多种会话类型,并提供了完整的会话生命周期管理机制。会话实体与用户卡片、好友关系等元数据紧密关联,形成了完整的实时通信解决方案。
文档来源
- ChatMessage.cs
- UserChatCard.cs
会话实体字段定义
会话实体主要由ChatMessage类定义,包含以下核心字段:
| 字段名称 | 数据类型 | 约束条件 | 业务规则 |
|---|---|---|---|
| TenantId | Guid? | 可为空 | 租户标识,支持多租户架构 |
| GroupId | string | 可为空 | 群组标识,为空表示单聊会话 |
| MessageId | string | 必填 | 消息唯一标识,由系统自动生成 |
| FormUserId | Guid | 必填 | 发送者用户标识 |
| FormUserName | string | 必填 | 发送者用户名 |
| ToUserId | Guid? | 可为空 | 接收用户标识,群聊时可为空 |
| Content | string | 必填 | 消息内容,不进行审计记录 |
| SendTime | DateTime | 必填 | 消息发送时间,使用系统时钟 |
| IsAnonymous | bool | 必填 | 是否匿名发送,存储在扩展字段中 |
| MessageType | MessageType | 必填 | 消息类型,默认为文本消息 |
| Source | MessageSourceType | 必填 | 消息来源,默认为用户发送 |
会话实体字段定义来源
- ChatMessage.cs
会话类型设计
系统支持多种会话类型,通过MessageType和MessageSourceType枚举进行区分:
classDiagram
class MessageType {
+Text = 0
+Image = 10
+Link = 20
+Video = 30
+Voice = 40
+File = 50
+Notifier = 100
}
class MessageSourceType {
+User = 0
+System = 10
}
class ChatMessage {
+MessageType MessageType
+MessageSourceType Source
+string GroupId
}
ChatMessage --> MessageType : "has"
ChatMessage --> MessageSourceType : "has"
会话类型设计来源
- MessageType.cs
- MessageSourceType.cs
- ChatMessage.cs
会话生命周期管理
会话的创建、更新和关闭通过MessageStore服务进行管理,完整的生命周期流程如下:
sequenceDiagram
participant Client as "客户端"
participant MessageSender as "MessageSender"
participant EventBus as "分布式事件总线"
participant MessageStore as "MessageStore"
participant Repository as "消息存储库"
Client->>MessageSender : SendMessageAsync(chatMessage)
MessageSender->>MessageSender : 生成MessageId
MessageSender->>EventBus : PublishAsync(RealTimeEto<ChatMessage>)
EventBus->>MessageStore : HandleEventAsync(eventData)
MessageStore->>MessageStore : 消息拦截处理
MessageStore->>Repository : StoreMessageAsync(message)
Repository->>Repository : 根据GroupId判断单聊/群聊
Repository->>Repository : 保存消息到数据库
Repository-->>MessageStore : 保存成功
MessageStore-->>EventBus : 处理完成
EventBus-->>MessageSender : 事件处理完成
MessageSender-->>Client : 返回MessageId
会话生命周期管理来源
- MessageSender.cs
- ChatMessageEventHandler.cs
- MessageStore.cs
会话与消息关联关系
会话实体与消息存储之间存在紧密的关联关系,通过MessageStore服务实现消息的持久化和查询:
erDiagram
CHAT_MESSAGE {
string MessageId PK
guid FormUserId FK
guid? ToUserId FK
string? GroupId FK
string Content
datetime SendTime
int MessageType
int Source
guid? TenantId
}
USER_CHAT_CARD {
long Id PK
guid UserId UK
string UserName
int Sex
string NickName
string AvatarUrl
datetime? Birthday
int Age
guid? TenantId
}
USER_CHAT_FRIEND {
long Id PK
guid UserId FK
guid FrientId FK
bool Black
bool DontDisturb
bool SpecialFocus
string RemarkName
byte Status
guid? TenantId
}
CHAT_MESSAGE ||--o{ USER_CHAT_CARD : "发送者"
CHAT_MESSAGE }o--|| USER_CHAT_CARD : "接收者"
CHAT_MESSAGE }o--|| USER_CHAT_GROUP : "群组"
USER_CHAT_CARD ||--o{ USER_CHAT_FRIEND : "好友关系"
会话与消息关联关系来源
- ChatMessage.cs
- UserChatCard.cs
- UserChatFriend.cs
会话成员管理
会话成员管理通过UserChatCard和UserChatFriend实体实现,包含用户基本信息和好友关系管理:
classDiagram
class UserChatCard {
+Guid? TenantId
+Guid UserId
+string UserName
+Sex Sex
+string NickName
+string AvatarUrl
+DateTime? Birthday
+int Age
+DateTime? LastOnlineTime
+UserOnlineState State
+SetBirthday(birthday, clock)
+SetAvatarUrl(url)
+ChangeState(clock, state)
+ToUserCard()
}
class UserChatFriend {
+Guid? TenantId
+Guid UserId
+Guid FrientId
+bool IsStatic
+bool Black
+bool DontDisturb
+bool SpecialFocus
+string RemarkName
+string Description
+UserFriendStatus Status
+SetStatus(status)
}
class UserOnlineState {
+Online
+Offline
+Busy
+Stealth
}
class UserFriendStatus {
+NeedValidation
+Added
+Blocked
}
UserChatCard --> UserOnlineState : "has"
UserChatFriend --> UserFriendStatus : "has"
UserChatCard --> UserChatFriend : "has many"
会话成员管理来源
- UserChatCard.cs
- UserChatFriend.cs
- UserOnlineState.cs
- UserFriendStatus.cs
会话元数据存储
会话元数据存储设计包含用户卡片、好友关系和群组信息,确保会话上下文的完整性:
用户卡片表 (AppUserChatCards)
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
| Id | bigint | PK, AI | 主键 |
| TenantId | uniqueidentifier | NULL | 租户标识 |
| UserId | uniqueidentifier | NOT NULL | 用户标识 |
| UserName | nvarchar(256) | NOT NULL | 用户名 |
| Sex | int | NOT NULL | 性别 |
| NickName | nvarchar(256) | NULL | 昵称 |
| Sign | nvarchar(30) | NULL | 签名 |
| AvatarUrl | nvarchar(max) | NULL | 头像地址 |
| Birthday | datetime2 | NULL | 生日 |
| Age | int | NOT NULL | 年龄 |
| LastOnlineTime | datetime2 | NULL | 最后在线时间 |
| State | int | NOT NULL | 在线状态 |
好友关系表 (AppUserChatFriends)
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
| Id | bigint | PK, AI | 主键 |
| TenantId | uniqueidentifier | NULL | 租户标识 |
| UserId | uniqueidentifier | NOT NULL | 用户标识 |
| FrientId | uniqueidentifier | NOT NULL | 好友标识 |
| IsStatic | bit | NOT NULL | 是否系统预置 |
| Black | bit | NOT NULL | 是否黑名单 |
| DontDisturb | bit | NOT NULL | 是否免打扰 |
| SpecialFocus | bit | NOT NULL | 是否特别关注 |
| RemarkName | nvarchar(256) | NULL | 备注名称 |
| Description | nvarchar(50) | NULL | 附加说明 |
| Status | smallint | NOT NULL | 好友状态 |
会话元数据存储来源
- UserChatCard.cs
- UserChatFriend.cs
- 20250409030245_Initial-Single-Project-MSSQL.cs
性能优化策略
系统采用多种性能优化策略来提升会话处理效率:
会话缓存机制
flowchart TD
A[消息发送请求] --> B{是否需要缓存?}
B --> |是| C[检查缓存中是否存在会话]
C --> D{缓存命中?}
D --> |是| E[从缓存获取会话信息]
D --> |否| F[从数据库加载会话信息]
F --> G[存入缓存]
G --> H[处理消息]
B --> |否| H
H --> I[持久化消息]
I --> J[发布消息事件]
J --> K[通知在线用户]
批量处理优化
- 消息批量存储:通过
StoreMessageAsync方法实现消息的批量存储 - 事务管理:使用
IUnitOfWorkManager确保数据一致性 - 异步处理:所有消息处理操作均采用异步模式
分布式事件驱动
系统采用分布式事件总线实现消息的异步处理,解耦消息发送与持久化逻辑,提高系统吞吐量。
性能优化策略来源
- MessageStore.cs
- ChatMessageEventHandler.cs
- MessageSender.cs
会话功能扩展指导
为开发人员提供会话功能扩展的指导建议:
支持临时会话
// 创建临时会话的工厂方法
public static ChatMessage Temporary(
Guid formUserId,
string formUserName,
Guid toUserId,
string content,
IClock clock,
Guid? tenantId = null)
{
return new ChatMessage
{
FormUserId = formUserId,
FormUserName = formUserName,
ToUserId = toUserId,
Content = content,
SendTime = clock.Now,
IsAnonymous = false,
MessageType = MessageType.Text,
TenantId = tenantId,
Source = MessageSourceType.User,
}.SetProperty("Temporary", true);
}
支持系统通知会话
// 系统通知会话的工厂方法
public static ChatMessage SystemNotification(
Guid formUserId,
Guid toUserId,
string content,
IClock clock,
Guid? tenantId = null)
{
return new ChatMessage
{
FormUserId = formUserId,
FormUserName = "system",
ToUserId = toUserId,
Content = content,
SendTime = clock.Now,
IsAnonymous = false,
MessageType = MessageType.Notifier,
TenantId = tenantId,
Source = MessageSourceType.System,
}.SetProperty("Priority", "High");
}
扩展建议
- 敏感词过滤:在
MessageBlocker.InterceptAsync方法中扩展敏感词过滤逻辑 - 消息加密:在
ExtraProperties中添加消息加密标识和密钥信息 - 消息撤回:添加消息撤回状态和时间戳到
ExtraProperties - 消息已读:通过
ExtraProperties跟踪消息已读状态
会话功能扩展指导来源
- ChatMessage.cs
- MessageStore.cs
结论
本文档详细介绍了实时消息模块中会话实体的设计与实现。系统通过ChatMessage实体统一管理单聊和群聊会话,结合UserChatCard和UserChatFriend实体实现完整的会话成员管理。采用分布式事件驱动架构,确保消息处理的高效性和可靠性。通过合理的元数据存储设计和性能优化策略,为实时通信功能提供了坚实的基础。开发人员可以根据业务需求,通过扩展ExtraProperties和添加新的工厂方法来支持临时会话和系统通知会话等高级功能。