-
Notifications
You must be signed in to change notification settings - Fork 26
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
关于V2版本内部LightCacheInside存储数据使用数组方式存在数据不同步的问题 #277
Comments
这里看确实可以直接用api id做key,但是上下应该是设置了自旋锁的,不应该出现抢占情况。你在实际运行时可以找到它是哪个地方返回的 false 吗? |
我已在上游函数添加多处日志捕获,如果再次出现,我会在此处进行回复。 |
|
从日志来看 确实是数据不同步的问题 gocq已经返回调用信息 但未被接收 从而导致调用在30秒后超时 |
$all = OneBotV11::getAllRobot();
foreach ($all as $bot) {
$list = $bot->getGroupList();
if ($list === false) {
Console::error('群列表获取失败');
}
foreach ($list['data'] ?? [] as $group) {
$rt = $bot->setPrefix(OneBotV11::API_ASYNC)->sendGroupMsg($group['group_id'],'test');
}
} 请问这段代码,我的理解是遍历所有接入的机器人并群发机器人加入的所有群,异步发送消息。一般来说框架只会连接个位数的机器人,这里是在 GetGroupList 上接收不到还是 sendGroupMsg 接收不到呢? |
是获取群列表失败 从日志来看调用群列表 gocqhttp是已经返回了调用结果的 但是由于数据不同步 并没有被存储返回导致 GetGroupList 在30秒后超时了 |
该问题属于偶尔(例如使用go()协程时)出现 正常情况应该不会触发 在不修改当前代码的情况下 |
swoole.log
|
|
受影响版本
2.8.6
描述
参考内部代码
CoMessage.php fun>>>yieldByWS
由于内部采用 $wait[$api_id] 方式进行存取值 在协程高频情况下 可能会存在丢失部分消息回执的情况(例如go()多机器人调用api,或多机器人群发消息等情况。参见复现方式)
该缓存类使用的是swoole的Table方式 参见官方文档 也警告不要使用数组方式存取数据
该内部类方法在多处均有使用 可能需要修改多处代码 TODO
复现步骤
封装该群发消息,在多处使用,高频情况下获取群列表可能出现返回false
解决方案
内部缓存使用swoole的Table应避免使用数组方式读写数据,修改局部应用代码为独立Table表 并使用$api_id(参考)为key。
附加信息
No response
The text was updated successfully, but these errors were encountered: