我尝试解决RPC数据系统间数据不全,同步后再获取,依然不行

1. 开发环境:

1). LaravelS | 3.5.14, laravel: 5.8.35

2). php 7.2

3). 当前系统: ubuntu 18.4

4). 业务环境: 开发环境

5). 相关软件版本 mysql: Ver 14.14 Distrib 5.7.34, for Linux (x86_64) using EditLine wrapper

6). 相关软件版本 IM的聊天 swoole : 4.6.7

+—————————+—————————————+
| Component | Version |
+—————————+—————————————+
| PHP | 7.3.28-1+ubuntu18.04.1+deb.sury.org+1 |
| Swoole | 4.6.7 |
| LaravelS | 3.5.14 |
| Laravel Framework [local] | 5.8.35 |
+—————————+—————————————+

Protocols
+—————-+——–+——————————-+—————-+
| Protocol | Status | Handler | Listen At |
+—————-+——–+——————————-+—————-+
| Main HTTP | On | Laravel Framework | 127.0.0.1:5200 |
| Main WebSocket | On | App\Handlers\WebSocketHandler | 127.0.0.1:5200 |
+—————-+——–+——————————-+—————-+

2. 问题描述?

如题,我在做rpc的系统间的数据同步。尝试在im聊天系统里面拉起聊天,但是缺少用户系统的用户数据。
1、先尝试获取IM系统的数据,但是发现没有,
2、去用户系统同步数据到IM系统
3、IM系统从数据库拿数据
4、我发现拿不到以为是缓存或者有延迟,添加休眠2秒,还是拿不到

以下是在IM聊天系统里面想获取用户数据时获取不到,从用户系统去同步然后再获取用户信息的代码:

    /**
    * rpc im聊天系统缺少用户信息,从用户系统拿信息
     */
    public function getUserInfoByRPCUId($uid, $jwtIMToken)
    {
        $userExist = User::where('uid', $uid)->exists();
        if (!$userExist) {
            $synRes = $this->synUserInfo($uid, $jwtIMToken);//从用户系统同步用户消息到im聊天系统已成功
            if ($synRes && $synRes['status_code'] == 0) {
                throw new ApiException("触发同步用户消息失败".$synRes['message']);
            }
            Log::info('getUserInfoByRPCUId完成:',$synRes);//这里打印出来已经同步成功
        }

        $i = 0;
        do {
            if (!$userExist && !$i) {
                sleep(1);
            }
            $userInfo = User::where('uid', $uid)->first();//仍然拿不到消息,但是这时我直接通过navicat是能获取到同步过来的数据的
            $userInfoBySql = \DB::select("select * from users where uid = :id", ['id'=>$uid]);//仍然拿不到消息,但是这时我直接通过navicat是能获取到同步过来的数据的
            if (empty($userInfo)) {
                $i++;
                usleep(10000);//休眠10毫秒
            }
            Log::info('getUserInfoByRPCUId i:'.$i);
        } while (empty($userInfo) && $i < 200);//最多执行2秒,这里我尝试改成20秒的循环,在期间去navicat直接获取数据库,能看到已同步成功,但是这个循环始终无法跳出,获取不到用户信息$userInfo
        if (empty($userInfo)) {
            throw new ApiException("没有找到uid:{$uid}的信息");//最后这里还是弹窗提示没获取到用户信息
        }

        return $userInfo;
    }

    private function synUserInfo($uid, $jwtIMToken)
    {
        //用http的方式访问tsd的api接口, 通过传入的IM的token去推送
        return getOrPostCurlByUrl(//getOrPostCurlByUrl 就是一个全局的发curl的请求
            '这里是请求到用户系统的url链接',
            ['jwtIMToken' => $jwtIMToken, 'uid' => $uid]
       );
    }

3. 您期望得到的结果?

1、有没有办法能在同步完之后马上通过数据库拿到信息

4. 您实际得到的结果?

在同步完数据之后,通过数据库查找始终获取不到同步过来的信息。弹窗提示:没有找到uid:1111的信息,
但是接口日志已经返回成功。直接通过navicat也能看到消息

@Summer 能帮忙看看么

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 13
Bear_zheng

业务问题可以使用xdebug断点调试,看看上线文环境是不是有异常

2年前 评论
rain2018 (楼主) 2年前
Bear_zheng (作者) 2年前
rain2018 (楼主) 2年前
Bear_zheng (作者) 2年前

synUserInfo 的代码贴出来看看

2年前 评论
rain2018 (楼主) 2年前
rain2018 (楼主) 2年前
minororange (作者) 2年前

可以远程xdebug调试服务器代码

2年前 评论
rain2018 (楼主) 2年前
Bear_zheng 2年前

@5201314 不一样,可以断点看程序运行情况

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!