一种高扩展性九游会-官方体育与电竞娱乐平台实时赛事直播与竞猜单点登录系统的设计与实现
栏目:九游会注册 发布时间:2025-12-11
  九游会,九游会官网,九游会登录,九游会注册,九游会app下载,在线体育投注,电竞投注平台,真人游戏平台,九游体育,九游娱乐当前大型的互联网公司,往往提供多个服务。为了使得用户在一个服务器上登录之后,可以享受到其他服务,业界发展出了单点登录系统,达到“一点登录,全网漫游”的效果。而随着互联网规模的扩大,用户数目激增。同时,互联网公司提供的服务越来越多,单点登录系统面临的并发请求数目急剧增

  九游会,九游会官网,九游会登录,九游会注册,九游会app下载,在线体育投注,电竞投注平台,真人游戏平台,九游体育,九游娱乐当前大型的互联网公司,往往提供多个服务。为了使得用户在一个服务器上登录之后,可以享受到其他服务,业界发展出了单点登录系统,达到“一点登录,全网漫游”的效果。而随着互联网规模的扩大,用户数目激增。同时,互联网公司提供的服务越来越多,单点登录系统面临的并发请求数目急剧增加。因此,传统的单机已经无法适应新的需求。

  本文提供了一种新的高扩展性的分布式单点登录(single sign-on, sso)系统。在该系统中,用户数据部署到不同的服务器上,进而提高整个系统的容量和吞吐率。在该系统中我们采用了一种分层无中心的构架,进而提高了系统的可扩展性;同时通过添加缓存等形式,大大提高了系统的性能。

  现有的大型互联网公司往往拥有很多个子服务,每个子服务部署在不同的服务器上。用户希望在一个服务上登录之后,就可以在其他节点上免登录。单点登录就是在身份验证这个功能应用层面的一个整合,达到一次登录,全场漫游。它的本质就是用户的验证信息,被多个应用的系统所共享。

  用户的登录验证操作都需要被应用服务器转发到单点登录系统上,一个成功的登录之后,用户的验证信息会被保留在单点登录系统上。而当用户访问其他的应用服务器,该应用服务器向单点登录服务器验证该用户的信息;如果验证成功,该用户就可以自动被该应用服务器识别为已登录,而不需要提交用户名和密码,进而提高用户体验。

  然而随着互联网规模的扩大,用户和服务的数目激增,传统的单点系统容易受到容量和计算能力的限制,并有着单点故障等缺点,已经无法满足新的需求。因此,需要引入分布式系统,通过多个机器的协同工作,完成高数据量、高计算要求的任务。

  现有的工作[1],对单点登录系统已经有了比较深入的研究。一个单点登录系统,需要满足以下条件:

  2. 一致性,用户在不同服务中进行登录、修改密码等操作,其他服务能够获取对应信息。

  3. 可扩展性,能够根据新的需求,进行适当的调整。调整的代价尽可能较低。

  在[2,3] 等系统中,都使用了以cookie 为基础的单点登录系统设计。基于http 协议的网站服务器都是无状态服务器,建立一次连接之后就丢失所有信息。因此很难区分不同的用户。而cookie 就是用来解决这一问题。Cookie 是存储在客户端本地的一个文件,里面存有一系列key-value 对,在访问服务器的时候会带上这些信息。而服务器也可以更改cookie 值然后再返回给客户端。因此,服务器可以通过读取自己预设在cookie 里的值,获取用户名等信息,从而提高更好地服务。

  现有的单点登录系统中,普遍采用一种cookie 的形式保存信息。用户首次登录之后,会产生一个token 值,和用户名一起存储在cookie 中。然后通过验证token 值和用户名是否匹配,判断该用户是否已经登录。

  但是以上学术界的研究中,单点登录系统都集中于一台机器,无法满足可扩展性的要求,同时容易出现单点故障等问题。

  基于以上分析,本文提出了一个新的高可扩展性的单点登录系统的设计方案。从上到下分为三层。

  1. 第一层为SSO 服务器。每一个单独的SSO 服务器上,连接一个数据库服务器,同时在内存中缓存一部分数据。对外提供login/add_user/update_user/verify 四个接口,分别实现登录、添加用户、更新密码和验证登录信息四个功能。

  2. 第二层为转发服务器,每个服务器对外提供缓存服务器相同的接口,然后根据请求中的key 参数,进行哈希,将其映射到相应的缓存服务器上,然后直接连接对应的服务器,转发相应的请求,最后把返回结果返回给调用者。

  3. 第三层为web 应用服务器,这些服务器都为SSO 服务的使用者,直接面向用户。通过调用转发服务器的接口,判断用户的登录信息。在web 应用服务器和转发服务器中间有负载均衡服务器,外部的请求直接发送到负载均衡服务器,该服务器根据目前的转发服务器的负载量,来决定转发到哪一台转发服务器上。

  SSO 服务器中,所有永久性数据都是存在mysql 中。数据表中只存储用户名、加密后的密码。为了提高系统的性能,在数据库层上加了双缓存机制。如图2所示,缓存分为两个部分:用户名密码缓存,和token 缓存。为了保证系统的永久性,即出现宕机等情况的时候,重启时保证重要信息不丢失,对于不同api 被调用时,进行如下操作:

  1. 用户调用login 接口的时候,调用用户名和密码缓存,校验成功后,会返回给客户端一个token 值;

  2. 用户调用verfiy 接口的时候,调用token 缓存,如果该token 在token 缓存中,说明匹配成功,返回True;否则返回False。

  3. 用户调用update_user 接口的时候,首先将数据库更新,然后更新用户名和密码缓存。

  4. 用户调用add_user 接口的时候,首先将数据库更新,然后更新用户名和密码缓存。

  这里token 不需要永久化,只是作为临时变量。当系统重启后,用户重新登陆一次即可。

  为了提高SSO 服务器的性能,本系统中采用c++ 开发SSO 服务器。对外提供restful 接口,所有的api 都是通过http 请求调用。这里使用了github 上一个开源的C++ http 服务器框架[4],该服务器最高可以每秒处理300,000 个请求,完全可以满足本系统的需要。

  每一个SSO 服务器,彼此之间存储的数据并不相同。因此,需要对数据进行一个划分。这里采用[5] 中一致性哈希的算法。首先,在一个0 到232 ?1 的值域上,每个数字依次排列组成一个环。然后对于每个物理节点,随机取1000 个不同32 位数,作为该节点的虚拟节点。每个请求中都会有用户名,对该字符串做一个哈希,获取一个32 位的哈希值。然后顺着哈希环,找到该值对应的下一个虚拟节点。说明该数据就存储在该虚拟节点对应的物理节点上。

  采用一致性哈希的好处在于,当系统中SSO 服务器的数目增多时,只需要迁移一部分数据即可。实际迁移的数据量等于新加的机器分配的数据量。而传统的固定哈希的算法,几乎需要迁移所有的数据,这样大大提高了系统的可扩展性。

  为了提高系统的容错性,对每一个用户信息,需要做备份。具体做法是:在对用户名做哈希之后,顺着哈希环,找到n 个不同物理节点的虚拟节点。n 表示备份数。该用户的信息会分别存在n 台不同的机器上。当某一台机器宕掉之后,其他的机器依旧可以提供相应的服务。

  通过以上分析,我们可以得出,本系统具有极强的可扩展性。无论是SSO 服务器还是转发服务器,都可以任意进行添加和删除;一致性哈希的使用,使得系统配置更改的时候数据的迁移量大大减少。

  作为一个分布式的单点登录系统,同一层的服务器之间没有任何通讯,系统的性能几乎等同于所有单机性能的总和。因此整个系统拥有非常好的性能,而且性能会随着系统规模的扩大进一步扩大。

  在进行一致性哈希的同时,做了数据的备份,因此系统的容错性非常好。加上去中心化的设计,任何一台服务器宕机之后,都不会对整体系统造成致命的打击,系统依旧可以对外界提供服务。没有单点故障。

  系统的结构为松耦合设计,层次分明,层级之间使用restful 接口,彼此互相独立。将一个复杂的系统拆分成若干子系统,降低了系统实现的难度,提高了实现的灵活性。不同层级可以用不同的方式进行实现,可以自由选择。

  在本次试验中,我们使用了13 台服务器,Intel(R) Xeon(R) CPU E5-2609 v2 的CPU,每台机器16 核,96G 内存,为ubuntu14.04 的操作系统。所有机器在一个内网,通过万兆交换机连接。每台机器都是千兆以太网卡。

  配置中,其中三台机器作为SSO 服务器,同时配有一个mysql 数据库。5 台作为转发服务器。5 台作为应用服务器,发出不同请求,相当于该系统的客户端。网络拓扑图如4所示。

  5 台应用服务器,我们使用wrk [6] 作为benchmark 的测试工具。每个客户端开16个线 测试结果

  首先,我们部署了3 台SSO 服务器,和3 台转发服务器,分别部署到不同的机器上。然后开启3 个客户端,进行压力测试。如图5(a)所示,整体系统的吞吐量在4000左

  然后,我们保持3 台SSO 服务器,改变转发服务器的数量,验证系统的可扩展性。转发服务器的数目从1 到5,测试verify 接口的性能。系统的吞吐量如图5(b)所示。因为SSO 服务器经过优化,性能很高,所以3 台SSO 服务器完全可以满足5 台转发服务器的转发要求。也就是说,即使转发服务器数目为5,性能瓶颈依旧在转发服务器上。

  所以在图中,系统吞吐量基本和转发服务器的数目成线性关系。由此可见该系统的可扩展性很强。

  本文提供了一个高扩展性、高性能的分布式单点登录系统的设计与实现。与传统的单点登录系统相比,系统结构清晰,构架灵活,可扩展性极强。由于中间层转发服务器的存在,应用服务器访问任意一个服务器都可以成功获得对应的服务,而不需要自己判断去连接哪一个SSO 服务器。由于去中心化的设计,在每一层添加和删除某些节点,对整个系统都没有任何影响。松耦合的特性,使得三层构架的开发变得简单和灵活,每一层可以作为一个子系统单独实现。

  同时加入了用户名和token 值得双缓存,大大减少了数据库的访问量,提高了系统的性能。

  相比于传统的单点登录系统,本系统多了一个中间转发层,相当于多了一次网络请求。这样会明显影响性能。中间转发层有较大的优化空间:

  1. 添加中间层的缓存。当用户首次调用接口之后,转发服务器从SSO 服务器中获取相应的信息,转发给用户。这里应该建立一个缓存机制,将相应的结果进行缓存,这样下次用户再次调用接口的时候,不用再次转发,转发服务器可以直接返回结果。目前存在的困难就是一致性的保证。当后台SSO 服务器中的数据改变时,现有的构架中,转发服务器无法获知信息。因此需要有一套新的协议确保一致性,才可以加入缓存优化。

  2. 添加中间层的batch。对于用户每一个请求,转发服务器都要发送一次网络请求,到后台的SSO 服务器中。这样无疑是一种浪费。我们可以借鉴数据库访问时batch 的思想,将多次网络请求打包成一次请求,这样多次网络传输缩减为一次网络传输。虽然用户会有少量的延迟(在毫秒的量级),但是系统的性能会得到极大地提高。

  如图6所示,转发服务器首先收到客户端请求,然后检查自己的缓存中是否有对应的数据;如果没有,通过一致性哈希,找到需要查询的服务器,然后将该条查询加入到该SSO 服务器的查询列表中;经过固定时间, 或者该SSO 服务器查询列表满了, 则将队列中所有查询请求一起发送给对应的SSO 服务器中。最后, 将获取的查询结果返回给客户端。

  通过上面两个优化方案, 可以使得由转发服务器到SSO 服务器的网络请求数目下降多个量级。系统整体性能理论上能提升将近一倍。经过固定时间, 或者该SSO 服务器查询列表满了, 则将队列中所有查询请求一起发送给对应的SSO 服务器中。最后, 将获取的查询结果返回给客户端。经过固定时间,或者该SSO 服务器查询列表满了,则将队列中所有查询请求一起发送给对应的SSO 服务器中。最后,将获取的查询结果返回给客户端。

  [1] 胡毅时.., “基于web 服务的单点登录系统的研究与实现,” 北京航空航天大学学报,vol. 30, no. 3, pp. 236–239, 2004.

  编者按:近期,互联网应用适老化改造成为舆论热点。相比尚不熟悉互联网的老人,已经能够熟练掌握互联网应用操作的老年网民同样面临网络谣言、网络诈骗、虚假广告等陷阱,他们抵御风险的能力远低于年轻网民。…

  在现代社会数字化与智能化飞速发展的当下,老年人与互联网之间的“数字鸿沟”已成为必须逾越的课题。2020年底,工信部正式印发《互联网应用适老化及无障碍改造专项行动方案》。…

  合作加盟供稿服务数据服务网站声明网站律师信息保护联系我们服务邮箱:违法和不良信息举报电话举报邮箱:人 民 网 版 权 所 有 ,未 经 书 面 授 权 禁 止 使 用