默认

求助用MobileIMSDK-Web写的IM和APP IM连通却疑似丢包的疑问

查看数: 35694 | 评论数: 13 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2018-05-31 09:23

正文摘要:

web-im服务器和app-im的服务器都在本地,通过部署在阿里云服务器的rabbitmq连通。web-im使用webim的mq用户,app-im使用im的mq用户。当web-im向app-im发送消息时,出现大概率丢消息的现象。通过监控mq的消息发现,所 ...

评论

350933415 发表于 6 年前
引用:JackJiang 发表于 2018-05-31 17:05
好了,既然服务端没有丢,那是在哪个环节丢的,该看接收端的Log了。你按我的思路就这么排查,一定能找出 ...

好吧,我再好好查查。感谢你的耐心指导,有问题再麻烦您。
JackJiang 发表于 6 年前
引用:350933415 发表于 2018-05-31 16:30
好的,受教了!
消息过来之后,如果app在线是收到消息,没有丢。

好了,既然服务端没有丢,那是在哪个环节丢的,该看接收端的Log了。你按我的思路就这么排查,一定能找出个合理的解释。不管哪种网络系统,消息都不会凭空丢失,一定是在哪个环节出了状况,找出这个状况就能解决问题。需要的是耐心,不要慌,也不要急噪,欲速则不达
350933415 发表于 6 年前
引用:JackJiang 发表于 2018-05-31 16:17
你还是没有理解我回复这么多的目的,我要让你理解的是,消息到底去哪里了,需要一个环节一个环节来核对, ...

好的,受教了!
消息过来之后,如果app在线是收到消息,没有丢。
JackJiang 发表于 6 年前
引用:350933415 发表于 2018-05-31 16:02
当时app是在线的,我一直没动app,只是保持手机一直点亮防止进入后台导致离线。连续发送的消息,一直都是 ...

你还是没有理解我回复这么多的目的,我要让你理解的是,消息到底去哪里了,需要一个环节一个环节来核对,就像你这里的描述一样,你仍然没弄明白消息去哪了,这也是你没掌握排错方法的原因。

我要告诉你的排错方法,就是一个环节一节环节的排查,搞网络通信系统就是这样,因为环节太多。所以你先不管你app手机端的表现,现在你只要告诉我,一条消息过来,当app在线的时候,APP 服务端这边这条消息去哪里了?你只需要回答我:丢了?还是没有丢? 先解决我的疑问!(不需要管收机端有没有收到,只要保证能到app server这端就可以,下一个环节是下一个环节要排查的内容,先不用纠结)
350933415 发表于 6 年前
引用:JackJiang 发表于 2018-05-31 15:52
好了,我们来理一下思路,代码走到这里了,是不是意味着消息没有丢,已经被你app server的代码接管对不? ...

当时app是在线的,我一直没动app,只是保持手机一直点亮防止进入后台导致离线。连续发送的消息,一直都是收到1条,接下来2条收不到,循环反复。这个时候如果app离线,那也不应该之后会收到消息啊。总不会收到1条后自己离线然后再2条再次自己上线吧。。。。而且,还发生了我从app发送一条消息,web同时收到3条一样的消息,fp一样的,消息体也是一模一样。重复消息没一直重现,昨天出现的,后来又好了。
JackJiang 发表于 6 年前
引用:350933415 发表于 2018-05-31 15:42
那个空指针就是因为对方用户不在app server登录造成的,那只是catch到的exception,这个只会造成发送离线 ...

好了,我们来理一下思路,代码走到这里了,是不是意味着消息没有丢,已经被你app server的代码接管对不?

好,上面对web 到app的离线消息没有异议,也没有丢。那就接做在线的情况,把app server和你的app都打开。照着上面的样子,在app这边看一条消息到哪里了,能理解我上面引导你做这些的原因吗。。。
JackJiang 发表于 6 年前
引用:350933415 发表于 2018-05-31 15:13
日志看到了发过来的消息,但是丢失的消息都提示离线,可是明明不是离线的
同时,我还发现mq上app server ...

3个连接那个你不用管,对于RabhitMQ的客户端lib或RabbitMQ服务端来说,应该是存在一个复用的连接池的概念。

你的Log里,没看到明显的空指针异常吗,丢消息基本上就是这个原因了,去看看197行的代码,为什么空指针!
JackJiang 发表于 6 年前
引用:350933415 发表于 2018-05-31 10:57
根据您2楼说的  一步步都走了  每条消息都到了MQ

好,这至少证明web server -> MQ 这个方向,消息是肯定没有丢的,对吧。

那就接着下一步,先把Web Server关掉,再把APP Server打开,看看这几条消息有没有到APP Server这边(一条一条对APP Server这边的MQ消费者打出来的log!)。
JackJiang 发表于 6 年前
我看你在qq上跟我聊的,思路比较混乱,追踪问题不够严谨,所以,请照我2楼的回复:先确保你每一条消都已经进入了MQ!然后再说下一步的事,不要跳着玩,否则永远也找不出问题的
JackJiang 发表于 6 年前
我觉得你把问题搞复杂了,实际的使用没你这么复杂,你截图上的东西没碰到过,其它客户也一样。

我认为你有必要根据手册,把MQ的配置,以及代码中连接MQ的URL都对着手册再对一遍,注意细节。

我给你看一个商业项目中的配置情况,以web服务端为例(比如这个项目中新建了一个名为js的管理员账号):
这个账号是不是能管理,以能不能登陆进RabbitMQ的后台管理页面为准(不是管理员肯定登不进去)
求助用MobileIMSDK-Web写的IM和APP IM连通却疑似丢包的疑问_11.png
求助用MobileIMSDK-Web写的IM和APP IM连通却疑似丢包的疑问_22.png

下一步,就是配置你的Web server中连接MQ的URL(使用刚才这个账号):
1、2、3分别是你这台MQ的连接用户名、密码、ip地址
求助用MobileIMSDK-Web写的IM和APP IM连通却疑似丢包的疑问_33.png

上一步完成,Web Server中的MQ连接就配好了,不需要任何其它额外的配置,MQ中除了建一个管理员账号外也不需要任何额外配置,就这么简单。


好了,那么我如何跟踪消息到哪了呢?我们继续往下说。。。。。。。

按照我说的步骤来:

第一步:先把APP server关掉;

第二步:在web这边发一条消息,看看消息是否已经进入MQ,MQ中如何查看这条消息是否已存在,如下图所示:
很简单,进入这个队列,点击“get messages”即可看到队列中的消息,注意get的消息数量(默认是1,即只get最新1条消息,你可以改多一点)
求助用MobileIMSDK-Web写的IM和APP IM连通却疑似丢包的疑问_44.png
求助用MobileIMSDK-Web写的IM和APP IM连通却疑似丢包的疑问_55.png
求助用MobileIMSDK-Web写的IM和APP IM连通却疑似丢包的疑问_66.png

综上:我给你的建议是,先对着我的截图,代码中配置好你连接的mq url,然后再看看你发的每一条消息是否已进入MQ!注意:现在还不需要管APP那边,先把APP server给关掉!

返回顶部