2 分布式服务
Last updated
Last updated
分布式服务是指多台地位相同的服务各自独立部署,用户访问哪台服务都可以获得无差别的业务响应。
最常见的是一些访问量很大网站服务,虽然每个人在浏览器地址栏输入的域名都相同,但真实响应Http请求的服务,却不一定是同一个。业务请求在经过网关时,被路由到不同的业务服务上,用户收到的响应数据完全相同,因此对后端的部署方式是无感知的。
本文,我们尝试设计一个分布式的聊天室服务架构。
最开始我们设计的聊天室服务,是一个单点服务。如果我们再部署一个ChatService,会有什么问题呢?
大家是否还记得4.7节中的RoomIDMgr类?
由于聊天室ID不能重复,两个服务之间如何分配ID,需要协商管理。此时,有必要将ID分配管理的功能,单独提取出一个服务,专门用于分配和回收。
每个聊天室服务,在创建一个新的聊天室时,都需要向RoomIDMgrService申请一个新的房间ID,ChatService中的RoomIDMgr类由本地分配改为从其他服务获取;当一个聊天室销毁时,需要通知ID管理服务,回收聊天时ID,用于下次分配。
ID分配的问题解决了,我们关注下一个问题。
用户创建房间的时候,可以在任意ChatService上,这对用户来说没有什么区别。但是,如果用户想要加入到一个已创建的房间,登陆错了ChatService,可就无法加入了。
为了解决准确加入聊天室所在服务的需求,我们需要新增一个查询服务,用于查找聊天室在哪个ChatService服务上。
ChatService创建一个聊天室后,需要通知RoomInfoService增加一个记录;销毁一个聊天室后,也需要通知RoomInfoService。房间信息服务里记录所有房间所在服务的信息,当用户需要加入某个聊天室时,可以先到信息服务查询,看房间在哪个ChatService上,得到结果后,再连接到具体的聊天室服务上。
不难想象,查询请求也会随着用户规模的增长不断增多,单台服务是无法负载全平台用户的,因此有必要优化架构,将查询服务设计成主从模式,主服务只负责更新房间信息,并将信息同步给各从服务;从服务从主服务同步信息,负责用户查询请求的响应。
用户从各个查询服务上获取的信息是相同的,访问任何一个从属服务都可以得到准确信息。从属服务地位相同,用户量扩大,动态增加服务数量即可。
目前看来ChatService还保留了两个主要功能,一是创建聊天室,二是处理聊天室内部消息。
考虑服务职责单一的原则,我们可以将创建功能独立出来。
创建房间,不是一个频繁的业务请求,一般一台服务处理即可,无需部署多台服务。
创建服务负责创建房间请求的处理,并通知某一个ChatService创建一个房间,选择ChatServcie的过程,可以做一些负载均衡的策略,在服务资源空余较多的服务上创建新的聊天室。
创建过程中,会查询用户是否已经创建过聊天室,前期的权限校验工作在这个服务中统一处理。权限校验完成后去ID管理服务申请一个ID,并通知ChatService服务创建管理具体的聊天室。
聊天室销毁后,ChatService仍需通知ID管理服务回收ID,以及通知RoomInfoService更新聊天室信息。
每个服务的职责都越发单一,但服务数量的增加,给客户端带来了负担,本来只需要记一个聊天室服务的IP,现在需要记很多组服务的IP。
如何简化客户端的处理逻辑?
使用代理服务,可以简化客户端逻辑。
现在,用户只需要访问一个代理服务(Agent)就可以了。其他的请求,由代理服务路由到相应的服务,查询房间转到从属RoomInfoService,创建房间转到RoomCreateService服务,聊天时将消息转到ChatService服务。客户端不再需要记录具体服务的IP地址,也不关心具体是哪个服务响应了请求,有效的做到了前后的解耦。
这里还有一个好处是,原本客户端需要维护多条TCP连接,如果某条连接出现问题,可能导致整体状态出错。而改为连接代理之后,只需要保持一条TCP连接,后端服务的连接由Agent代理转发,因为Agent和后端服务在一个大的组内,连接状态更稳定。
目前为止,存在瓶颈的服务,如查询服务、聊天服务、Agent服务,都可以通过动态增加服务节点的方式提升负载能力,只需要在后端做好相应的配置即可。新节点启动后,根据配置信息,加入到服务网络,为用户提供服务。
现在,所有用户在同一个大的网络中进行交互,无需切换分区,只需要自身满足条件,就可以加入到任意的聊天室中。
某一个节点出现问题,也不会影响全体用户。RoomInfoService某个节点异常,用户只需要刷新请求,就可以路由到正常的节点获取到准确信息,基本无感知。ChatService服务出现异常,也只会影响当前服务上的用户,如果做好恢复机制,会将影响降低到最小。
至于迭代维护,更新时的影响,我们留到下一章部署及发布时,再具体讲解。