如何解决在不同服务器上的用户交互问题

假设有A、B两个用户,分布在不同的game服务器上,如果A想加B为好友,那么处理过程应该是怎样的?其中B需要处理在线或者不在线的情况。

看了下例子,基本上没有涉及到太多用户交互的。

自己想的解决方案:
1、增加一个用于交互的friend服务器,所有的用户交互基本上通过rpc调用由这个服务器来进行处理。这种方式应该是pomelo推荐的。
优点:统一处理,简单明晰。
缺点:增加了架构的复杂度,而且这个服务器在用户数据量大的情况下容易成为瓶颈。

2、逻辑服务器处理A的请求,直接读取数据库数据进行逻辑判断,然后更新数据库,最后再尝试通知到B去Load数据库。
优点:现有架构不需要引入新的复杂度,不会出现单点瓶颈。
缺点:有概率会造成数据错误。

还有什么推荐方案吗?

标签:无
million 在 2014-3-21 17:12发布 分享到 weibo
2 回复
#1 {2} roytan 2014-3-21 22:19 回复

第一,我认为你的第一种方式不是pomelo建议的方式,pomelo的进程更多的是用来处理逻辑而不是数据存储。

第二,除非你的用户数据都是临时的,不然用户信息和用户关系必然是应该存储在数据库中的。

第三,其实加好友这种逻辑一点都不复杂:
1,后端将A加B这个请求写入数据库(B的未读消息通知中)
2,后端查找B是否在线
3,如果B在线,则通过B所在的前端connector服务器push通知消息到B客户端;如果B不在线,则B上线的时候自己会取自己的未读消息通知。

million 2014-3-22 00:05 回复

谢谢,那基本上就是方案2,在考虑方案2的时候钻了点牛角尖,所以有点想岔了。

以前比较常用的是单进程多线程的服务器模型,单线程多进程的模型比较陌生。继续学习ing。

million 2014-3-23 20:35 回复

写了一些代码,还是觉得相当不适应。以前写这方面的用户交互代码,一般都会有一个统一的用户关系管理服务器来处理,为了保证低负载,会将很多信息用redis或者memcached缓存起来,管理器只负责处理会对数据库进行修改的操作。

而现在则感觉进程间交互各种不适,难道只有我有这种感觉吗?

#2 {2} jiangjkd 2016-1-14 07:49 回复

请问要如何知道B有没有在线?

CimJS 2016-1-15 10:53 回复

读memcached可以判断

million 2016-1-22 13:13 回复

在外部缓存保存一个用户的在线状态,用户登录和登出时更新这个状态。

回到顶部