基于 go-micro 实现聊天服
github 上有个 goim ,主要是为弹幕服做的,改成聊天服也有些工作量
将 goim 实现弹幕的思路,与 go-micro 结合,应该能达成快速开发聊天服,且足够应对主业务不是聊天为主的应用
细节如下:
1. 账号登录聊天服
+----------------+ +----------------+ +----------------+ +------------------+
| | 1. login msg | | 2. send msg | | 3. save route info (ttl 1 week) | |
| +-------------->+ +---------------------->+ +---------------------------------->+ |
| Client | | Comet | | Job | | Redis |
| | 6. ack msg | | 5. ack msg | | 4. save result | |
| +<--------------+ +<----------------------+ +<----------------------------------+ |
+----------------+ +----------------+ +----------------+ +------------------+
- route info 主要是 roleid - comet id
- ttl 1 week ,主要简化账号登录,如果 redis 存在因为 ttl 造成 cpu 压力过大(理论上应该不存在这个问题),则后续增加:
- comet 感知 client 断开连接, 通知 job 操作 redis 删除 roleid - cometid
- client 登录后, comet 15 秒,分 3 次,通知 job 操作 redis , 重置账号的 ttl
- 这样 redis 上 ttl 堆会很小
2. 房间聊天(频道聊天、世界聊天)
+----------------+ +----------------+ +----------------+ +------------------+
| | 1. room msg | | 2. send msg (one job) | | 3. publish | |
| +-------------->+ +---------------------->+ +----------------------->+ Broker |
| Client(s) | | Comet(s) | | Job(s) | | (kafka or mock) |
| | 6. room msg(s)| | 5. send msg(all comet)| | 4. subscribe (one job) | |
| +<--------------+ +<----------------------+ +<-----------------------+ |
+----------------+ +----------------+ +----------------+ +------------------+
- 房间信息 comet 上自己知道本进程内账号的房间信息即可
- 进入房间、离开房间, comet 上维护下即可
- 如果有需求需要知道房间成员列表,则 Job 还要把信息保存到 redis
3. 私聊
+----------------+ +----------------+ +----------------+ +------------------+
| | 1. chat msg | | 2. send msg (one job) | | 3. publish | |
| +----------------------------->+ +----------------------------->+ +----------------------->+ Broker |
| Client(s) | | Comet(s) | | Job(s) | | (kafka or mock) |
| | 8. chat msg(specific client) | | 7. send msg (specific comet) | | 4. subscribe (one job) | |
| +<-----------------------------+ +<-----------------------------+ +<-----------------------+ |
+----------------+ +----------------+ +----+-----+-----+ +------------------+
^ |
| |
| | +------------------+
| | 5. get route info | |
| +----------------------------->+ |
| | Redis |
| 6. get result | |
+------------------------------------+ |
+------------------+
4. 系统公告
+----------------+
| |
| | 1. room msg (one job)
| Game Server +------------------------------+
| | |
| | |
+----------------+ |
|
|
v
+----------------+ +----------------+ +------+---------+ +------------------+
| | | | | | 2. publish | |
| | | | | +----------------------->+ Broker |
| Client(s) | | Comet(s) | | Job(s) | | (kafka or mock) |
| | 5. room msg(s)| | 4. send msg(all comet)| | 3. subscribe (one job) | |
| +<--------------+ +<----------------------+ +<-----------------------+ |
+----------------+ +----------------+ +----------------+ +------------------+
5. 其他说明
- Broker 消息队列
- 消息不是很多,则可以不用架消息队列,直接使用 go-micro mock 方式,走 Job 进程内模拟消息队列(broker memory plugin)