gateway-worker 加入群组聊天思路问题

halay

1.在什么时候或者在哪个函数使用joinGroup

建了一个群group表,主键为group;建了一个群成员表group_membser,关联group_id和用户uid
我要邀请一个用户进群,前端请求http接口,把group_id和uid写入group_member表,那什么时候用joinGroup方法,把这个uid加入到群组呢?
我的思路:在Event.php中onWebSocketConnect方法里去执行,查询group_membser表中,当前用户所有的分组信息,然后循环调用joinGroup方法,把当前用户加进去,但总感觉怪怪的,想问下大家是怎么做的?

2.当前用户登录时,以前的私聊或者群聊信息是怎么接收到的?

未在线时收到的消息怎么在刚上线的时候发送?

969 1 2
1个回答

admin

对于1:

你的做法是常规的一种,依靠数据库做关联,用户登录的时候,绑定在gatewayworker的内存里,然后gatewayClient的sendGroup,内部群发。 基本应该是这样的

对于2:
应该在登录时候,http拉取历史未读的私聊消息。

特别的对于群聊,我觉得群聊消息应该是一张公共表,不需要记录到群里的每个用户的未读消息。群成员登录的时候http请求一次性拉取最近几天的消息(qq就是这样做的,想要拉取更多历史消息,请求http拉取,并且携带群聊消息最老的id和limit)

  • halay 2023-11-06

    对于1:
    public static function onWebSocketConnect($client_id, $data)
    {
    $token=isset($data['get']['token'])?$data['get']['token']:'';
    if (empty($token)) {
    Gateway::closeClient($client_id);
    }else{
    try {
    $jwtData= JwtToken::verify(1,$token);
    if(isset($jwtData['extend']['id'])){
    $uid=$jwtData['extend']['id'];
    Gateway::bindUid($client_id,$uid);
    $_SESSION['uid']=$uid;
    $groupData=GroupMember::getGroupIdByUid($uid);
    if(!empty($groupData)){
    foreach ($groupData as $group){
    Gateway::joinGroup($client_id,$group['group_id']);
    }
    }
    }else{
    Gateway::closeClient($client_id);
    }
    }catch (\Exception $e){
    Gateway::closeClient($client_id);
    }
    }
    }
    不知道这种发放耗不耗性能
    对于2:
    我也是用http去拉取的

  • forever 2023-11-08

    刚好最近做了跟你类似的项目,
    对于1:我也是跟你一样的做法,当我不是写在event 里面的,我是等用户通过鉴权成功之后,调用http接口,在接口里面做的for循环绑定,
    对于2:这个其实要看你的需求了,其实对于群消息处理起来贼头大,因为我们是app上有聊天功能,所以我们的需求是没网也要能看消息.所以消息都是缓存到本地,服务端用的扩撒写机制,好处就是对群消息的离线处理机制很简单,坏处就是存的时候很麻烦,哈哈哈,如果用扩散读,那就是好处就是存消息的时候很简单,查询的时候就很麻烦. 我是这样设计的有个消息总表,然后有个离线消息表,每次群里有人发言,都要给每个用户写一条数据到离线表里面,不管用户在不在线,然后等前端处理完成之后,通知我,在从表里面删除对应数据.这样就能防止漏发,同时前端也要处理消息去重,

  • halay 2023-11-08

    嗯,我以为会有什么封装好的更简单的方法,原来大家都有这方面的困扰,那我就放心了

  • forever 2023-11-08

    有个网站,http://www.52im.net/ 这里面都是IM 相关的帖子,啥的,你可以看看,我当时也是借鉴他们的思路,然后用户重新断线重连之后,只需要返回每个聊天的最后一条消息和未读消息条数,用户进入某个聊天再去拉取离线消息库里面的消息,成功返回ack ,离线消息库拉取完之后,后面的数据就走本地缓存了,

  • halay 2023-11-10

    好的,感谢

年代过于久远,无法发表回答
×
🔝