默认
发表评论 13
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
我把之前的回复也帖上来:
把设备的唯一id带上来呗,关闭的时候只要要关闭的是当前设备,那你就不用关,解决误关最新登陆的问题。
自已写线程模型,除非你有足够的经验和自信,不然还是换个成熟的实现或方案吧,死锁是个槛。
评论 13
我说的唯一ID不是登陆账号或者你系统里的ID,这个ID是跟设备有关的,可以唯标识这台手机或PC设备的。

iOS里可以轻易取到device id;
android由于各厂商ROOM不一样,固定取某项硬件序列号并不是万能药,但利用各种硬件序列号也可以组出唯一ID;
PC上可以通过读取MAC地址、硬盘序列号等通过摘要算法自已加工出唯一id。

理论上,准确判断一个“会话”的重复性,应该是唯一设备ID+用户登陆账号。
引用:sxb 发表于 2016-04-23 15:03
就是设备的唯一标示,我要记录这个设备的在线状态,如果混乱在线状态会不准确

你的问题里涉及两个问题:
1)你目前因为异步登陆问题,容易让重复登陆判断不够准确;
2)死锁问题。

第1)个问题,用唯一设备ID+登陆账号的问题显然是可以处理的,因为你说的最新登陆会话,就是你当前正在处理的会话本身,当然不能被错误地中断掉。而你之前就是会误中断当前会话的问题。
第2)个问题,死锁显然是你的代码实现问题,建议别把问题复杂化,先实现业务需求,再考虑性能,想一步到位的话,如果并发编程经验不是很多的话,会让你的思维混乱。
另外,我对你的需求有点好奇。你是想实现QQ早期的重复登陆逻辑,还是移动端+PC端混合平台的重复登陆判断逻辑。

- 1)QQ早期的重复登陆路逻辑简单粗暴,只要判定该账号已处于登陆状态,就无条件把之前的登陆给踢掉。
- 2)现在的QQ移动端+PC端混合平台的重复登陆判断逻辑比较复杂,它会判断,当QQ已登陆于手机端时,手机端是不踢的,除非你已经PC端登陆。这就需要增加一层设备类型的判断(我没有试过ios和android能否同时登陆,如果这个也不能重复,则逻辑就更复杂了)。
引用:sxb 发表于 2016-04-23 15:32
群主你把我问题想复杂了,
1、一个通道重复发送登陆协议这个可以判断,抛弃下就行
2、断网前端设备又重 ...

我懂你的意思了。

你可以这么干:客户端提交登请求的时候,把它本地时间戳带上来(如果你怕完整时间戳浪费几个字节流量的话,可以取天或小时的时间戳,这样就短了),在服务端异步判断重复时,已存在连接早于这个时间戳,肯定可以关,晚的,显然就是你描述的问题了,不关就行了。实际上包括微信在内,请求的时候,应该都会有时间戳这个东西在,只是进行了加密加工而已,在用到的时候道理是一样。
引用:sxb 发表于 2016-04-25 16:44
我明白你意思,这样改动比较大,我是这样考虑的,设备登陆成功 把设备唯一标示、fd存储哈希表中,把设备 ...

上面回复了那么多,你又回到问题的起点了。。。

你所谓生产者消费者模式实现,理论上的最大问题应是线程不同步导致数据不一致,仅此而已,既然你想省事,那你就随它去吧。而你现在发生了死锁,显然是你那块代码有问题,死锁是肯定可以解决的,我猜测你现在所纠结的,应该是你不知道怎么准确地找出死锁发生的地方吧。。
引用:sxb 发表于 2016-04-25 18:06
嗯,想不明白为啥

去下一个jProfile,如果死锁可以很轻松的找到问题代码。
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部