1.首先DB方面及早引入Proxy层(amoeba),用户基础数据与业务数据(GPS位置,好友关系等)分库,业务数据可根据数量是否分表,业务数据实现读写分离。访问规则hash(id)。// 实例启动记得先预热数据
2.独立开辟一组业务数据缓存服务器,LRUMap实现。根据用户请求将相关业务数据逐步从DB加载到内存中(比如用户请求GPS历史位置,即加载DB所有GPS历史位置,请求好友关系,即加载DB全部好友关系)。一切数据读写以缓存为主,写数据放入队列使用线程异步回写DB。这样做的目的主要是只有冷数据才从DB加载,大大地保证了DB的读写负载,缺点是你要容忍宕机再来的数据丢失,所以要做好日志以便恢复(当然重要数据一定要实时回写)。单台15G内存机器双实例一般够支撑10w用户的热数据了。实例可以水平扩展,访问规则hash(uid)。
3.一组应用逻辑服务器专门处理网关丢过来的任务,计算完成后通知网关返回结果。比如接收到网关发过来的需要更新用户GPS位置信息指令,根据hash(uid)到对应的业务数据缓存服务器更新缓存中的GPS最新位置并返回好友关系,然后就可以根据相应的好友UID到在线缓存中查询到好友所在网关并分发通知更新的数据了。// 保持一组连接至数据缓存服务器(UDP)
4.一组网关服务器负载保持所有客户端(TCP/UDP)的连接和内部服务器(UDP)的连接
注:每组服务器均可以水平扩展,除了数据缓存服务器必须指定用户hash(UID)外,网关逻辑服务器均可用hash规则或视负载而定进行用户分配,具体支撑多少用户根据你们实际情况来定吧。
client loginserver
|
gateway1...gatewayN
|req logic & response data
|
logicserver1..Ndataserver1..N amoebadb1...dbN
架构差不多就是这样,不喜勿喷。码字真的好辛苦~