我尝试解决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 能帮忙看看么
推荐文章: