android-chat icon indicating copy to clipboard operation
android-chat copied to clipboard

getConversationList导致的OOM

Open FrancisTX opened this issue 5 months ago • 12 comments

Image

Image

账号是一个有千级好友的账户,conversation list大概也是千级。 现在的情况(如上图)应该是 getConversationList 的时候,后端服务报了OOM的错误。我这边加大了一下运行im-server的jvm的memory:-Xms512m -Xmx2048m。然后现在android端可以get成功,但是ios端还是不行 (我们用的flutter plugin)。

想问下野火有支持分页拿conversation list吗,或者这种问题如果解决比较好?

FrancisTX avatar Jul 21 '25 22:07 FrancisTX

这个问题和 im-server 没有关系。

  1. 最新代码,默认已经改成单进程了,应当不会出现这个错误了,你们可以升级到最新代码测试
  2. 可以使用getConversationListAsync方法异步获取

imndx avatar Jul 22 '25 03:07 imndx

这个问题和 im-server 没有关系。

  1. 最新代码,默认已经改成单进程了,应当不会出现这个错误了,你们可以升级到最新代码测试
  2. 可以使用getConversationListAsync方法异步获取

如果不升级的情况下,可以用getConversationListAsync吗,我们可能暂时不考虑升级。 我们使用的是flutter plugin, 只有getConversationInfo这一个方法,没看到哪里可以call getConversationListAsync

FrancisTX avatar Jul 22 '25 03:07 FrancisTX

flutter 的话,你更新下 imclient module

imndx avatar Jul 22 '25 08:07 imndx

好的,我试一下。但是我看了wfc_flutter_plugin插件中的imclient/lib/imclient.dart 里面也只有getConversationInfos这个方法

FrancisTX avatar Jul 22 '25 13:07 FrancisTX

好的,我试一下。但是我看了wfc_flutter_plugin插件中的imclient/lib/imclient.dart 里面也只有getConversationInfos这个方法

升级 imclient module 之后,使用getConversationInfos应当也没问题了

imndx avatar Jul 23 '25 02:07 imndx

好的,我试一下。但是我看了wfc_flutter_plugin插件中的imclient/lib/imclient.dart 里面也只有getConversationInfos这个方法

升级 imclient module 之后,使用getConversationInfos应当也没问题了

imclient 升级好了,现在安卓不稳定,有时候可以加载出来有时候还是加载不出来;ios这边还是不行。

我先再排查下问题吧,但是这种情况是推荐升级im-server吗?您已开始说的 “升级到最新代码测试” 是指升级 im-server吗?

FrancisTX avatar Jul 23 '25 04:07 FrancisTX

是升级客户端,用我们最新的客户端 demo 连上你们的服务去测试

imndx avatar Jul 23 '25 08:07 imndx

用最新的客户端连接我们的服务后,getConversationInfos的表现和我们自己的客户端是一样:卡顿,加载不出来完整的消息列表。

具体操作:

  1. 修改了 example/lib/config.dart 中 IM_Host 和 APP_Server_Address为我们自己的im server host和后端服务地址
  2. example/lib/login_screen.dart中加入了用户名密码登录的功能(原demo中仅支持sms)
  3. 测试账号密码登录:好友较少的账号没有问题,成功登录。但是上面提到的账户(千级好友的账户,conversation list大概也是千级),登录和我们自己客户端一样,都表现为一直在加载,然后加载不出来或者只加载出来部分消息列表。

加载聊天列表的日志: Image 一直在重复这一部分。

现在怀疑是我们之前测试了群发功能,给3000+好友群发了一张图片,会不会因为lastMessage是图片,导致加载时耗费资源过多所引发的问题?因为好像获取消息列表时就会加载lastMessage?

FrancisTX avatar Jul 29 '25 19:07 FrancisTX

你猜测的是对的。原因是你们发送的图片消息太大了,从上面日志看到MP命令(收取消息)收到数据包大小355740,大小为2条。如果2条都是图片,平均大小为180KB,如果一条图片那就是300多KB。建议图片大小不超过10KB,需要你们发送图片时做一下裁剪和压缩,确保不大于10KB

heavyrain2012 avatar Aug 02 '25 01:08 heavyrain2012

图上一直重复的就是再收取消息,每次收取消息大小不超过500KB,如果180KB一条,那么每次只能收2条。如果有几千条这种图片,那么好收上千次循环才行。还是那个问题,图片消息要裁剪和压缩才行

heavyrain2012 avatar Aug 02 '25 01:08 heavyrain2012

好,听起来是合理的。但是现在的问题是:我们的图片存在aws s3上,我其实已经从s3里面把这张图片删除了,就是不想让这张图片加载了,这是我删除图片后的日志,但是感觉这个收取消息的服务还是在读取这个图片。有什么建议吗这种情况?或者说应该把那一条聊天记录都删除?这个可以做到吗

FrancisTX avatar Aug 04 '25 17:08 FrancisTX

问题出在图片的缩略图上,一条图片消息包含一个链接(就是放到s3上图片地址)和一个缩略图(图片的二进制数据)。正常情况下,缩略图会裁剪和压缩,确保在10KB以下。而现在消息大小在180KB,或者更大。当删除s3上文件,对缩略图没有影响,消息还是这么大。当下的解决办法是再重新发个其他消息,比如文本,确保会话的lastMessage变小,另外就是server api发送消息时要控制大小,确保缩略图在10KB以下

heavyrain2012 avatar Aug 05 '25 03:08 heavyrain2012