关于xmpp丢包的问题探讨聊天记录

【传说】深圳-Biggo(8420034) 14:30:21
又是丢包用回执,如果对方不在线,回执时间你想设置多长时间。
【话唠】北京+小宋(306794827) 14:31:05
120秒或是60秒
【传说】深圳-Biggo(8420034) 14:31:52
偶都不在线,120秒有毛用
【话唠】北京+小宋(306794827) 14:32:06
不在线的直接走离线
【话唠】北京+小宋(306794827) 14:32:19
这个是处理突然断网情况的。
【传说】深圳-Biggo(8420034) 14:32:50
问题是回执协议中没有对方在线离线的处理
【吐槽】深圳-小yaner(510923886) 14:33:04
一条消息不回 就直接端TCP了
【吐槽】深圳-小yaner(510923886) 14:33:27
下次服务器就不去 通过tcp发了自己存起来
【吐槽】深圳-小yaner(510923886) 14:33:51
用户再才登陆 才通过TCP发
【吐槽】深圳-小yaner(510923886) 14:34:00
用户再次登陆
【传说】深圳-Biggo(8420034) 14:34:18
消息回执收不到,不一定自己网络出问题
【话唠】北京+小宋(306794827) 14:34:42
你发送一条消息,先存起来,等收到该消息的回执,再把这条消息删掉。如果是离线直接走of的机制,不保存该消息,   用一个线程去扫存消息的map或者表,只要里边有消息,就往外发
【吐槽】深圳-小yaner(510923886) 14:35:01
是的
【吐槽】深圳-小yaner(510923886) 14:35:12
就是这样做的
【传说】深圳-Biggo(8420034) 14:35:23
人家不上线,你的回执打算存几天
【话唠】北京+小宋(306794827) 14:35:26
别起哄
【话唠】北京+小宋(306794827) 14:35:44
不在线走of的离线机制啊,
【传说】深圳-Biggo(8420034) 14:35:51
还有,你怎么准确的知道对方在不在线
【话唠】北京+小宋(306794827) 14:36:08
离线监听
【传说】杭州-男(123860756) 14:36:08
  你们还需要消息去重
【传说】杭州-男(123860756) 14:36:12
  去掉重复的消息
【话唠】北京+小宋(306794827) 14:36:26
OfflineMessageListener
【吐槽】 LazYoung(549948932) 14:36:37
@北京+小宋 那丢包的问题该如何处理呢?
【话唠】北京+小宋(306794827) 14:36:40
嗯嗯,
【传说】深圳-Biggo(8420034) 14:37:14
这个offlineMessagelistener是工作不可靠的,丢消息都是不可靠产生的
【话唠】北京+小宋(306794827) 14:37:17
丢的包就是没收到回执,继续保存在map里,等线程下次扫描map的时候再发
【话唠】北京+小宋(306794827) 14:38:25
@深圳-Biggo 说的对,好好想想。
【话唠】北京+小宋(306794827) 14:39:45
晕,需要该代码啦
【话唠】北京+小宋(306794827) 14:39:54
这点没想到。疏忽啦
【传说】深圳-Biggo(8420034) 14:39:54
xmpp中的标准回执协议,是解决不了丢包问题的。这是定论,要其他方法解决
【话唠】深圳-疯狂代码(842229775) 14:40:00
如果A用户给B用户发消息,B用户不在线,服务器收到消息后存入离线后再发送回执给A的时候,A突然也不在线了咋办?
【传说】深圳-Biggo(8420034) 14:42:18
丢包不是这样产生的,真正的丢包是A 给 B发消息,服务器收到后 判断B在线,就给B发消息,这个时候 B真实的情况是不在线,服务器发送给了空气,这才是真正的丢包,服务器判断B在线是不可靠的。
【吐槽】深圳-小yaner(510923886) 14:42:31
这个流程不是这样的
【话唠】北京+小宋(306794827) 14:43:00
嗯嗯。@深圳-Biggo 说的对。
【吐槽】深圳-小yaner(510923886) 14:43:02
对 是Biggo这么说的。
【话唠】深圳-疯狂代码(842229775) 14:43:05
A突然不在线的时候,我服务器又存到离线里面了
【话唠】深圳-疯狂代码(842229775) 14:43:07

【吐槽】深圳-小yaner(510923886) 14:43:16
不是疯狂代码那么理解的
【话唠】深圳-疯狂代码(842229775) 14:43:29
我那个说的不是丢包啊
【话唠】深圳-疯狂代码(842229775) 14:43:42
我是说我的那个回执咋办啊,现在有这个问题
【吐槽】深圳-小yaner(510923886) 14:43:56
你那条不是回执 是消息发送到服务器成功
【传说】深圳-Biggo(8420034) 14:44:12
所以回执,解决不了丢包的。
【话唠】深圳-疯狂代码(842229775) 14:44:23
但是我还要告诉A他的消息到达的服务器
【吐槽】深圳-小yaner(510923886) 14:44:39
QQ发送消息会提示 发送成功发送失败 就是根据这条 是否发送到服务器成功
【传说】杭州-男(123860756) 14:44:48
 丢包 就得去重
【话唠】深圳-疯狂代码(842229775) 14:44:59
那我咋告诉A呢?
【话唠】北京+小宋(306794827) 14:45:03
去重这个必须有
【活跃】深圳-虫虫(995948100) 14:45:07
为啥回执解决不了丢包?
【话唠】深圳-疯狂代码(842229775) 14:45:26
@深圳-Biggo 上面已经说了啊
【活跃】北京-小明弟弟(1016191364) 14:46:00
有涨姿势了
【传说】深圳-Biggo(8420034) 14:46:15
丢包,不是 A发的消息发不出去,而是A发消息出去了,以为B能收到,但实际B没有收到,这才是丢包。
【话唠】深圳-疯狂代码(842229775) 14:46:27
嗯嗯
【活跃】深圳-虫虫(995948100) 14:46:41
丢包是你说的这样。为啥回执不行?
【话唠】深圳-疯狂代码(842229775) 14:47:08
那刚才我的那个问题有没有什么好的方案啊?
14:47:22Reims加入本群
【活跃】深圳-虫虫(995948100) 14:47:22
哪个?
【吐槽】深圳-小yaner(510923886) 14:47:26
A发送消息到服务器 ,服务器收到消息后处理(不管服务器传到B,B是否收到) ,都返回A 发送消息到服务器成功 @深圳-疯狂代码
【话唠】深圳-疯狂代码(842229775) 14:47:44
就是A用户给B用户发消息,B用户不在线,服务器收到A的消息后存入离线之后,再发送回执给A的时候,A突然也不在线了咋办?
【吐槽】深圳-小yaner(510923886) 14:48:28
。。。你认为这个情况存在???
 LazYoung  15:11:24
【传说】深圳-Biggo
2014/8/29 14:48:39
@深圳-小yaner 服务这样发回执,并不能保证B能收到消息,实际还是丢包了。
【话唠】深圳-疯狂代码
2014/8/29 14:48:41
嗯存在啊
【话唠】深圳-疯狂代码
2014/8/29 14:48:46
@深圳-小yaner
【话唠】深圳-疯狂代码
2014/8/29 14:48:54
比如变态的IOS
【传说】深圳-Biggo
2014/8/29 14:49:04
服务器代发回执没有用
【话唠】深圳-疯狂代码
2014/8/29 14:49:10
IOS发送了一条消息之后立马按了home键
【话唠】深圳-疯狂代码
2014/8/29 14:49:41
服务器端还在存储IOS发送的消息时候,IOS端按HOME键下线了
【潜水】北京—reims
2014/8/29 14:49:51
这个能马上下线吗?
【话唠】深圳-疯狂代码
2014/8/29 14:49:56
能啊
【传说】深圳-Biggo
2014/8/29 14:50:06
服务器代发回执,只能解决,服务器告诉A,我收到了你的消息,至于这个消息是否B能收到,不能判断。
【潜水】北京—reims
2014/8/29 14:50:10
我怎么觉得  都有延迟啊
【吐槽】深圳-小yaner
2014/8/29 14:50:13
正常情况下是零点几秒的时间差。然后就算你在这零点几秒的时间类突然下线哪有怎么样 你消已经发出去了,服务器确实收到了@深圳-疯狂代码
【活跃】深圳-虫虫
2014/8/29 14:50:19
这个回执。是在服务器去监控。你这个说的怎么是客户端去监控了
【吐槽】深圳-小yaner
2014/8/29 14:51:22
顶多是你客户端提示消息发送失败,但是这条消息实际上已经发送成功,这又有什么关系@深圳-疯狂代码
【话唠】北京+小宋
2014/8/29 14:51:22
@深圳-Biggo b收到消息给服务器发送一个回执,确定消息发送成啦,我们还有个心跳设置,超过这个心跳设置时间,还没有发送出去会存离线的。
【话唠】深圳-疯狂代码
2014/8/29 14:51:26
就是服务器发送给IOS(已经按HOME键了)的回执的时候,服务器会发不出去
【话唠】深圳-疯狂代码
2014/8/29 14:51:44
服务器发不出去的时候,又被存储到离线数据库中了
【活跃】深圳-虫虫
2014/8/29 14:51:57
@深圳-疯狂代码 ,A客户端只要发了回执的请求,我服务器的就只需要等待B的回执回复。不管A是否断线,我都不用去理。我服务监控有没有这个请求的回执,如果没有我就存离线了。
【话唠】深圳-疯狂代码
2014/8/29 14:52:38
现在是有回执请求的
【传说】深圳-Biggo
2014/8/29 14:53:04
虫虫,问题是B收到了消息,这个时候断网,回执回不了服务器怎么办。
【活跃】深圳-虫虫
2014/8/29 14:53:21
是啊。有回执请求了。我只需要用回执的应答。如果有的就说明接受了,没有的就存离线
【吐槽】深圳-小yaner
2014/8/29 14:53:37
存离线 很明显 断网了 还不是离线?
【活跃】深圳-虫虫
2014/8/29 14:53:44
我有个线程在服务器端跑嘛
【话唠】北京+小宋
2014/8/29 14:53:55
@深圳-疯狂代码    你的网络有那么不稳定吗?既然你能发的出去,收不到回执的情况极小,of发送一条消息基本上转眼间就过了
【话唠】深圳-疯狂代码
2014/8/29 14:53:57
A发送消息给B,B不在线,OF存储A的消息后还要发一个回执告诉A,关键是OF发送这条回执的时候A已经不在线了
【活跃】深圳-虫虫
2014/8/29 14:54:03
可以自己设置个时间。B没有回复。我直接存离线了
【话唠】北京+小宋
2014/8/29 14:54:11

【话唠】深圳-疯狂代码
2014/8/29 14:54:16
收不到回执的情况极小,不代表没有啊
【话唠】北京+小宋
2014/8/29 14:54:32
这个你可以在消息里加一个时间,超过心跳时间就删掉这条消息
【活跃】深圳-虫虫
2014/8/29 14:54:49
。我们每个消息都有个ID。
【活跃】深圳-虫虫
2014/8/29 14:54:55
客户端需要做处理。
【活跃】深圳-虫虫
2014/8/29 14:55:08
有了消息回执。消息只会多。不会少。
【话唠】北京+小宋
2014/8/29 14:55:12
of发送一条消息用2毫秒,你点击home键有这么快吗@深圳-疯狂代码
【活跃】深圳-虫虫
2014/8/29 14:55:22
客户端是有可能接收到重复的消息。需要做去重
【话唠】深圳-疯狂代码
2014/8/29 14:55:24
测试部,变态
【活跃】深圳-虫虫
2014/8/29 14:55:27
更加每个消息的ID来
【传说】深圳-Biggo
2014/8/29 14:55:47
还有,服务器把持聊天,等待用户回执这个功能,代码上完成不成问题,但效率上可能无法接受,特别是大规模用户的服务器。
【话唠】北京+小宋
2014/8/29 14:56:18
@深圳-疯狂代码 你问测试部的,一条消息发出去用2毫秒,问问他们点击home键有没有这么快?
【吐槽】深圳-小yaner
2014/8/29 14:56:59
大规模用户就是需要 分布式集群 要解决服务器与服务器间通信 就不一样了
【吐槽】深圳-小yaner
2014/8/29 14:57:14
不再是单服务
【话唠】北京+小宋
2014/8/29 14:57:15
效率确实是个问题,如果用户不多,可以采用,用户多的,在想办法吧。
【吐槽】深圳-小yaner
2014/8/29 14:57:46
用UDP可能会好点,反正都是不可靠的。用回执来判断
【吐槽】深圳-小yaner
2014/8/29 14:57:57
UDP性能消耗小点
【传说】深圳-Biggo
2014/8/29 14:58:02
如果服务器每秒产生数千条聊天,预计就可能大大拖累服务器的消息收发了。
【吐槽】深圳-小yaner
2014/8/29 14:58:04
QQ听说是UDP
【活跃】深圳-虫虫
2014/8/29 14:58:20
等待回执这个问题。分配新的线程去处理。里面的保存等待需要处理的逻辑都放内存中。分配的线程专门去处理缓存中的这些逻辑。这个量是不会有多大的。如果考虑的并发问题。可以使用队列的形式来处理。
【话唠】深圳-Fantasy
2014/8/29 14:58:21
貌似短信也是UDP
【活跃】长沙+苦行僧
2014/8/29 14:58:56

【活跃】长沙+苦行僧
2014/8/29 14:58:58
有人碰到过没
【活跃】深圳-虫虫
2014/8/29 14:59:18
处理回执的问题。只是考虑是不是保存离线。还有这个判断的问题。
15:01:45
【吐槽】深圳-webck
2014/8/29 15:01:45
想问下ios 里的MagicalRecord  与xmpp 的使用要注意什么
15:03:50
【传说】深圳-Biggo
2014/8/29 15:03:50
放内存没有用,如果每秒产生5000个聊天,那么你的线程就需要没秒5000个加锁判断的写操作,这个线程忙不过来的
【话唠】北京+小宋
2014/8/29 15:04:42
ConcurrentHashMapUtil
【活跃】深圳-虫虫
2014/8/29 15:04:56
干嘛要加锁呢。我都放redis队列里面了。
【吐槽】深圳-小yaner
2014/8/29 15:05:04

【吐槽】深圳-小yaner
2014/8/29 15:05:10

【话唠】北京+小宋
2014/8/29 15:05:21
ConcurrentHashMap  看看这个方法
【话唠】北京+小宋
2014/8/29 15:05:36
队列慢吧?
【传说】深圳-Biggo
2014/8/29 15:06:26
哈希表只是个大量不变的数据,提高搜索速度,而的的数据每秒有数千个新值产生,所以哈希表没有用
【活跃】深圳-虫虫
2014/8/29 15:06:28
难道全部数据都是这样的频繁断线?
【吐槽】深圳-小yaner
2014/8/29 15:08:15
哈希表数据不变?Redis就是内存数据库,基于哈希表,就是为了存储动态变化的数据的 我汗@深圳-Biggo
【话唠】北京+小宋
2014/8/29 15:08:24
@深圳-虫虫   突然断线你怎么存?   每条消息都要存的
【话唠】北京+小宋
2014/8/29 15:09:04
你不知道哪条会失败,等你知道会失败的时候,消息已经丢了,你找不到的,所以每条都要先存
【吐槽】深圳-小yaner
2014/8/29 15:09:50
这个村内存 速度可以忽略
【潜水】桃核
2014/8/29 15:10:04
我们公司招openfire开发人员,在北京,有没有有兴趣的朋友啊
【活跃】深圳-虫虫
2014/8/29 15:10:23
存redis中。线程监控有回执的。删除。没有回执的存离线。
【活跃】北京+浮生未歇
2014/8/29 15:10:28
你这个openfire开发,是后台开发?
【话唠】北京+小宋
2014/8/29 15:10:32

【活跃】北京+浮生未歇
2014/8/29 15:10:39
还是包括客户端
【潜水】桃核
2014/8/29 15:10:55
主要是后端
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值