借用数据库实现客户端的消息推送 散分求教

Damn_boy 2012-08-01 02:04:54

需要实现一个简单的消息推送功能 本来是想借用一个im服务器 然后在每个客户端添加上im的功能
现在只想把模型简化 借用数据库的一张表来实现 表里包含了客户端的ip,端口,以及一些额外的客户端信息

大体流程如下当客户端上线的时候将其客户端的信息注册到服务器的那张表上
当客户端离线的时候 从表里面删除自己的信息

当服务端从其他渠道得到某些消息的时候
通过 查询这张表 将消息推到每个客户端

但是现在有这么几个问题
1. 当客户端异常退出的时候 表里面将会存在一些垃圾信息 有没有什么好的策略来删除这些信息?
2. 因为客户端对登录用户没有做限制 一个用户可能在不同电脑上登录多个客户端 这样信息会有冗余 怎么处理?

消息的发送部分用winsock来做 实现细节不多说了 现在就像解决这两个问题 自己有考虑一些 但是可能不周全
或者说 除了这两个问题 还有其他别的问题
来请教请教 先开100分的 有帮助的话我在追加
...全文
197 点赞 收藏 14
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
勿勿 2012-08-03
这是一个异步通信问题了,用SQL解决问题是可以 ,如果用户一旦多起来几十个上百个的话服务器的压力就会很明显。你可以尝试用WCF处理。至于协议你根据自己的需要选择。
回复
筱筱澄 2012-08-02
你说的sql 有这个功能啊

service brocker
回复
这种异常情况的处理一直都是比较难处理的,但也只能通过一些相对方法进行处理
对于客户端异常退出的
1、尽量看看能否捕获客户端异常操作的时候,提交状态到服务端
2、还有一些无法捕获到的,定义一个规则,比如多久没有状态更新的,进行系统自动注销处理,这其中有两种方式:
一种是比如在表中搜索这些记录若超过多久时间没有注销,自动注销(但这种不可靠,因为很难定义这个时间长度)
一种是添加一个状态字段:用户若正常在线、除了正常注销直接删除外,还添加一个当前最新一次与服务器交互的时间字段,规定若用户在线有跟服务器交互、则每隔一段时间(自定义时间长度)更新该记录的最新在线状态时间。服务定时搜索未注销的用户当前最新状态时间与服务器时间是否相差两个时长的,就可以自动删除该用户在线记录

对于客户端多处登陆问题
强制限制一个用户在未注销的情况下,不允许第二次登陆,限制一个账户只能登陆一次。在用户登陆的时候应该先判断该账户是否已处于登陆状态,若已登录状态,不允许登陆,提示先退出、或强制注销该账户先前已经登陆的记录,然后再进行登陆



回复
筱筱澄 2012-08-02
[Quote=引用 6 楼 的回复:]

引用 4 楼 的回复:

你说的sql 有这个功能啊

service brocker


公司用的是 oracle 而且是想实现是个与数据库无关的功能 可以供外部调用的
如 webservices等
[/Quote]
那帮顶了。
回复
haitao 2012-08-02
真正的推,只有tcp连接。。。。。降了服务器响应压力,但是增加了连接压力

最好,服务器把需要给每个客户端的信息,存到一个个文件
客户端自己通过http定时取,响应压力大也是web server的累
回复
Damn_boy 2012-08-02
[Quote=引用 9 楼 的回复:]

非连接模式下,服务端的推,就是客户端不断的尝试拉
[/Quote]

之前做的就是客户端主动去服务器上拉数据
然后出现的问题就是 客户端数量大了 服务器扛不住了
所以想改成现在这种推的模式
回复
Damn_boy 2012-08-02
[Quote=引用 2 楼 的回复:]

针对你提的两个问题,我个人的建议如下:
1. 当客户端异常退出的时候 表里面将会存在一些垃圾信息 有没有什么好的策略来删除这些信息?
[我]:可否在表中设置一字段作为是否在线的标志位,再添加一字段记录在线时间。若正常登陆,则标志位更新为1;正常退出,则标志位更新为0;若客户端异常退出,因为无法更新标志位,所以标志位一直为1。此时应该设置一个sql job,可设置每天可每几个小时跑一次,去……
[/Quote]
如果只是更新了ip 那当用户在第二个登录的客户端下线之后
原来还在线的那客户端 信息不是被第二个登录的给覆盖了并且删除了 再也收不到来自服务端的消息了么?
回复
haitao 2012-08-02
非连接模式下,服务端的推,就是客户端不断的尝试拉
回复
Damn_boy 2012-08-02
[Quote=引用 4 楼 的回复:]

你说的sql 有这个功能啊

service brocker
[/Quote]
还有那玩意儿貌似只支持数据库实例之间的通信把?
现在要做的消息推送 客户端部分并没有数据库实例
回复
Damn_boy 2012-08-02
[Quote=引用 3 楼 的回复:]

这种异常情况的处理一直都是比较难处理的,但也只能通过一些相对方法进行处理
对于客户端异常退出的
1、尽量看看能否捕获客户端异常操作的时候,提交状态到服务端
2、还有一些无法捕获到的,定义一个规则,比如多久没有状态更新的,进行系统自动注销处理,这其中有两种方式:
一种是比如在表中搜索这些记录若超过多久时间没有注销,自动注销(但这种不可靠,因为很难定义这个时间长度)
一种是添加……
[/Quote]
强制登录可能没有办法做到如此
现有的消息推送只是一个附加功能 没有涉及到太多的客户端改造
而且强制只使用一个客户端 让另一边的客户端下线
可能会导致被强制下线的客户端做到一半的工作没完成 就退出了
这个还要对客户端做大量改造
回复
Damn_boy 2012-08-02
[Quote=引用 4 楼 的回复:]

你说的sql 有这个功能啊

service brocker
[/Quote]

公司用的是 oracle 而且是想实现是个与数据库无关的功能 可以供外部调用的
如 webservices等
回复
针对你提的两个问题,我个人的建议如下:
1. 当客户端异常退出的时候 表里面将会存在一些垃圾信息 有没有什么好的策略来删除这些信息?
 [我]:可否在表中设置一字段作为是否在线的标志位,再添加一字段记录在线时间。若正常登陆,则标志位更新为1;正常退出,则标志位更新为0;若客户端异常退出,因为无法更新标志位,所以标志位一直为1。此时应该设置一个sql job,可设置每天可每几个小时跑一次,去监视标志位和在线时间,如果标志位为1,且在线时间超过设定值,则可删除这些客户信息。
2. 因为客户端对登录用户没有做限制 一个用户可能在不同电脑上登录多个客户端 这样信息会有冗余 怎么处理?
 [我]:如果你记录了客户的信息,不管他在多少台电脑上登陆,判断客户的信息是否一致不就行了么,如果客户的信息是一样的,而IP不一样,那就更新IP就行了
回复
这两个问题说明你原来的设计有问题
研究下service brocker,你的问题应该很好解决
回复
相关推荐
发帖
应用实例
创建于2007-09-28

2.7w+

社区成员

MS-SQL Server 应用实例
申请成为版主
帖子事件
创建了帖子
2012-08-01 02:04
社区公告
暂无公告