群聊与超大群
四步验证三人群聊,成员协调、十万成员与容量检查按需展开。
目标:Alice 向 team-42 发消息,Bob、Carol 分别接收,再核对离群后的权限与投递。
1. 准备三人测试群
Alice、Bob、Carol 使用业务后端提供的凭据,在独立客户端连接。后端创建稳定群 ID team-42,将三人加入普通订阅者列表。
业务系统负责群资料、角色、审批、禁言和成员数据库。成员变更与发送 HTTP 接口只给受信后端: 客户端调用业务 API,由后端验证角色后再修改 WuKongIM。
核对: 通过已鉴权、分页的 Manager 成员查询,确认正好三人。
Reset 会替换成员,请求可能部分完成
reset=1 替换旧成员列表,仅用于新建测试群或已确认的期望快照。元数据写入、移除、加入和 large 刷新不是一个事务;失败后保留已成功进度,再根据业务快照协调。
创建群:完整后端请求
选择稳定且不可复用的业务群 ID,例如 team-42。在受信服务网络中创建 Channel,并用一个小的初始成员集完成验证:
curl -sS http://127.0.0.1:5001/channel \
-H 'Content-Type: application/json' \
-d '{
"channel_id":"team-42",
"channel_type":2,
"reset":1,
"subscribers":["alice","bob","carol"]
}'成功兼容响应是 {"status":200}。channel_type=2 表示群组 Channel。不要用这个成员列表替代业务群数据库;服务端使用它检查发送权限、同步消息并确定接收人。
2. 向群 ID 发送
Alice 使用 channel_id=team-42、channel_type=2、稳定的 client_msg_no 与 SDK 文本格式。发送者需满足当前成员与发送权限。
核对: 默认持久消息检查 SENDACK 或 HTTP reason=1,确认已持久提交。成功不代表所有成员收到,也不代表会话同步完成。
后端发送与历史查询
发送者必须满足当前群权限与成员策略。客户端 SDK 使用 channel_id=team-42、channel_type=2;受信服务端示例:
本例使用 SDK 内置文本格式,与 Web 示例一致。编码前的 JSON 是:
{"type":1,"content":"hello team"}下方 payload 是该 JSON 的 UTF-8 Base64。自定义字段和类型需要配套客户端消息解码器,见自定义消息。
curl -sS http://127.0.0.1:5001/message/send \
-H 'Content-Type: application/json' \
-d '{
"from_uid":"alice",
"channel_id":"team-42",
"channel_type":2,
"client_msg_no":"team-42-0001",
"payload":"eyJ0eXBlIjoxLCJjb250ZW50IjoiaGVsbG8gdGVhbSJ9"
}'reason=1 表示这个 Channel 的消息已完成持久提交。它不表示所有成员都在线、所有在线 Session 都写入成功,或者每位用户都已完成 会话目录同步。
Bob 可以同步群日志:
curl -sS http://127.0.0.1:5001/channel/messagesync \
-H 'Content-Type: application/json' \
-d '{
"login_uid":"bob",
"channel_id":"team-42",
"channel_type":2,
"start_message_seq":0,
"limit":20,
"pull_mode":1
}'群内 message_seq 定义唯一顺序。成员的在线投递、RECVACK、未读数和重连恢复仍是不同观测。
3. 分别检查两个接收端
| 客户端 | 预期结果 |
|---|---|
| Bob | 收到 hello team,只显示一次 |
| Carol | 独立收到同一原文,只显示一次 |
| 重连的接收端 | 通过完整版 SDK 同步或业务历史能力,恢复缺失持久消息 |
message_seq 只定义本群顺序。在线投递、RECVACK、未读与恢复分别检查;EasySDK 不自动提供离线历史与会话恢复。
4. 验证移除成员
先提交业务成员决定,再通过受信订阅者接口移除 Carol。保留操作结果并协调部分失败;变更收敛后,按产品策略验证 Carol 后续发送权限与投递行为。
核对: 移除不会删除已提交历史或客户端缓存。明确离群用户可见的历史范围,以及再次入群从哪里同步。
移除 Carol:完整后端请求
curl -sS http://127.0.0.1:5001/channel/subscriber_remove \
-H 'Content-Type: application/json' \
-d '{"channel_id":"team-42","channel_type":2,"subscribers":["carol"]}'添加成员与核对期望名单
新增成员:
curl -sS http://127.0.0.1:5001/channel/subscriber_add \
-H 'Content-Type: application/json' \
-d '{"channel_id":"team-42","channel_type":2,"subscribers":["dave","erin"]}'移除成员使用 /channel/subscriber_remove 和相同请求结构。成员变更会去重,并更新每个用户的频道关系。业务服务仍需保存期望成员列表、版本和操作记录,失败后根据已成功的进度继续核对与补偿。
WuKongIM HTTP API 没有普通订阅者、拒绝列表和临时订阅者的对称读接口。需要严格核对时,使用已鉴权的 Manager GET /manager/channels/:channel_type/:channel_id/subscribers 有界分页查询;允许列表虽可由 WuKongIM HTTP API 读取,但旧接口会一次返回完整列表,不适合大群巡检。
离群与再次入群策略
业务系统先提交自己的成员状态,再通过受信调用移除订阅者,并记录可重试任务。成员移除决定之后的发送权限和投递计划,但不会删除既有 Channel 日志,也不会自动清理业务数据库、客户端缓存或历史会话展示策略。
明确产品策略:离群用户能看到哪个历史 sequence、是否删除本地记录、再次入群从哪里同步。这些产品规则不能从“成员行已经删除”自动推导。
进阶:十万成员的有界批次协调
不要把十万 UID 放入一次 /channel 或 subscriber_add JSON 请求。推荐使用业务侧协调器:
- 使用几百到约一千 UID 的有界应用批次,并按实际请求大小、延迟和错误率调节;不要把内部 chunk 默认值当作永久 API 上限。
- 每个请求内部仍会分块和去重,但请求内部各阶段以及跨多个 HTTP 请求都不是一个全局事务。失败时保留已成功进度,再通过期望/实际差异修复。
channel.large_group_subscriber_threshold默认是500;普通成员变更后,成员数大于阈值会刷新 large-group 标记。改变阈值后,要通过受控成员协调和验证确认现有 Channel 状态。- 大群消息提交后,服务端分批读取成员并查询在线设备,再按目标节点投递;频道消息历史仍只保留一条消息,不会为十万成员各写一份独立日志。
- SENDACK 确认消息已持久提交,不等待所有接收设备完成投递。需要业务“全部处理”语义时,另建业务回执与聚合流程。
进阶:容量验证
上线前至少分别测量:
- 热点群的发送速率、持久提交耗时与 P99;
- 分批查询成员、查找在线设备的耗时,以及提交后投递队列的积压;
- 各节点向客户端写入的耗时、断线比例与重连恢复;
- 成员变更吞吐、部分失败后的进度保存与恢复;
- CPU、内存、磁盘、网络、队列深度、拒绝和端到端尾延迟。
不要只用平均 QPS 推导十万成员容量。继续阅读Channel 核心概念、集群配置和性能测试工具。
下一步:Channel 核心概念与上线检查。实际目标负载使用性能测试工具测量。