思考(五十八):基于 go-micro 实现聊天服的思路

基于 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)
发布了129 篇原创文章 · 获赞 73 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/u013272009/article/details/94444800