大数据量用户下可扩展设计请教
公司最近做了个偷菜copy 的产品,反正是copy 项目,产品本身的
实现的细节,相信大家应该都清楚,就不多说了。因为现在用户少,
所以架构能抗住,但是我感觉以后用户多了 有很多问题,比如开心菜园
是2000w 用户,量很大了。我自己在尝试设计的时候发现很多问题 解决起来比较困难
还是要请大牛来解答
逻辑架构
网关1 网关2 网关3 ........
逻辑服务器1 逻辑服务器2 逻辑服务器3 逻辑服务器4 ..............
DB 缓存1 DB缓存2
因为目前的数量很低,很多数据是预测的,可能有偏差。
各个服务器的 作用,
网关服务器 :接入web 客户端, 连接 逻辑服务器,简单的转发数据
逻辑服务器: 处理真正的逻辑业务,存储用户对象,包括好友列表。
DB缓存服务器: 从DB获取缓存, 或者直接以DB服务器代替。
同时每个用户都有自己唯1的数字ID
目前假设一个网关可以同时接入3w 连接, 而每台逻辑服务器可以完成1W 个用户的逻辑处理
并有 A 用户 ID 100
A 有一个好友B ID 90000
目前考虑的方案和它们的缺陷
方案1
每个用户以ID 被划分到固定的网关上, 比如 1-30000 就在网关1 30001-60000 在网关2
每个用户以ID 被划分在固定的逻辑服务器上 比如1-10000 就在逻辑1 10001-20000 在网关2
每个网关只负责固定数量的逻辑服务器, 网关1 只和 逻辑1 2 3服务器相连 网关2和逻辑 4 5 6服务器相连
如果 当用户A在网关2 登陆 那么将被拒绝。要求重新登陆网关1
当用户A 在逻辑服务器1 要求看自己的好友B 时候, 那么逻辑1 就需要和 逻辑9 交互,逻辑 9 去读取数据
处理后然后回给逻辑1。
优点是 固定用户, 压力固定,一旦某个网关坏掉或者逻辑服务器坏掉都不会影响其他服务器。
缺点
1 所有的逻辑服务器之间需要建立连接, 也就是有N 台服务器 就 N*(N-1) /2 条连接,
当服务器数量增加,这个连接管理会很麻烦。而且重连管理也会很麻烦。
2 当用户不在活跃以后,服务器的很多负载会很不均衡。 比如10000-20000 服务器的上的用户,大多数都不活跃了。
但是逻辑2 服务器还需要继续工作。
3 扩展困难, 当以后业务复杂了, 逻辑服务器单机只能负载5000 用户的时候,要升级会很麻烦。因为现在的很多算法是
定死了的。
方案2
1 客户可以登陆任何一个网关,
2 每个网关只负责固定数量的逻辑服务器, 网关1 只和 逻辑1 2 3服务器相连 网关2和逻辑 4 5 6服务器相连 同方案1
3 逻辑服务器可以产生所有的用户的实例
比如 A 登陆一个网关,那么网关就直接 找一个逻辑服务器,然后逻辑服务器生成所有需要的数据返回给A
问题,
B 登陆了 逻辑服务器1 而 好友A同时登陆了逻辑服务器2,此时, 可能出现脏数据的问题。
具体的 好友B 先获取自己的资料发现有100棵菜, 这时候A 上线,获取B的资料,发现也是100棵菜。此时100 这个数值
在2台逻辑服务器内。 A偷菜, B收菜。
数据同时回写到 DB, ..... 杯具!!!
多次登录的问题
A 用户登陆网关1 同时登陆网关2 网关3
那么此时他可能同时 在逻辑1 逻辑6 逻辑9 服务器上面有1个1样的实例。
同时收菜,逻辑1、 6 、9 完成操作, 回写DB .....又是杯具!!
优点 性能好,容易扩展。
缺点 脏数据。用户数据互斥问题无法解决。反馈消息无法返回。