前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >登录服务的无状态化改造

登录服务的无状态化改造

原创
作者头像
mariolu
发布2021-02-12 11:44:02
1.3K0
发布2021-02-12 11:44:02
举报
文章被收录于专栏:CDN及云技术分享

一、当前状态

代码语言:javascript
复制
 F服务 -> D服务 -> P服务

登录网络服务 (以下简称F服务)接进来一个用户,然后用户会连接到会话管理服务(以下简称D服务)

  1. D服务内存高速缓存中有一些会话数据。并且D服务将在停止时将这些数据保留在磁盘中,然后在启动时将其加载到内存中。
  2. 如果客户端在10秒内未收到确认,客户端将重新连接。如果重新连接10次,它将重置此会话并创建一个新会话。因此,如果客户端没有收到任何通知,它将在100秒后重置会话。
  3. 在D服务重新启动时,“更快”会将所有消息丢弃到该分片。重新启动Dispatcher分片花了45秒。
    • 在当前方案中,客户端将在Dispatcher重新启动时重新连接到3个F网络服务。
  4. 最高并发用户数(PCU)约为1500万,而DAU约为1亿。

1.1、缺点

  1. 当D服务重新启动或一段时间未响应时,该forward_to_client消息将在F登录连接器服务中排队。
  2. 如果D服务的挂起时间太长,那么它将使上游F服务队列中有很多消息。可能引起雪崩。

1.2、改进办法

  1. 使D服务成为无状态
  2. 修改分片函数为一致性哈希

然后,如果会话管理服务D的某些分片挂了(停了),则不会影响网络登录F服务。

二、无状态重构

2.1、基本思路:

  • 添加Redis以存储会话信息
  • 会话管理D服务从Redis读取/写入会话信息
  • 大多数情况下,一个会话数据始终处理一个D服务分片。仅重新启动或卡住会导致路由到其他分片。
  • D服务中有一个内存缓存。

2.2 .策略

  1. F服务和G推送服务的shardFunction位于分片自身的内存中,因此这两个服务可能会同时获得不同的分片。
  2. 如果存在逻辑集,则并发哈希仅包含一个逻辑集,然后在逻辑集的分片中进行哈希,那么大多数情况下,ssid的请求将转发到逻辑集,它只会在逻辑集中更改。
2.3 哈希模式选择

哈希用来调度程序的上游服务,包括以下:

  • 并发哈希:

通过D服务的shard nums构建一个哈希环,哈希键为'ssid'

  • 多个哈希级别:

我们将通过一些逻辑集来构建第一级哈希环,例如,分片0,256和512是逻辑集,并且该逻辑集号为0;分片1、257、513是另一个逻辑集,并且此逻辑集编号为1。第二级哈希环由该逻辑集中的分片num建立。因此,当请求到来时,它将首先通过计算逻辑集号logic_set_number = concurrent_hash(hash_key=ssid, ring=logic_set_ring)。如果获得逻辑set.0,则将在第二级哈希环中进行计算:shard_number = concurrent_hash(hash_key = ssid,ring = shard_num_ring)。

  • 备份分片模式:

我们可以在中设置backup_offset services.json,假设它为1024,在副本中services.json假定它为2。然后分片0的备份分片为1024、2048。

哈希模式

优点

缺点

复杂

并发哈希

当一个分片关闭时,该分片的流量将平均迁移到其他分片

Redis连接数太大

正常

多个哈希级别

Redis连接数很小

当一个分片关闭时,该分片的流量将迁移到同一Redis集中的其他分片。这将使其他碎片繁忙

普通+

备份分片模式

Redis连接数很小

当一个分片出现故障时,该分片的流量将迁移到其他备份分片。这会使备份碎片繁忙

因此这里选择备份分片模式。

Redis哈希模式

使用普通的哈希模式。假设分派器具有4096个分片,而Redis具有1024个分片。然后,连接分片等于分派器分片mod 1024。

三、实现与问题讨论

  • 如果一个D服务卡住了,在F服务中重置此D服务分片的会话,然后客户端将创建新的会话,然后它将连接到其他D服务。
  • DNS将两个dc的ip返回给客户端,如果一个dc断开,则客户端可以连接到正常的dc。
  • D服务逻辑与以前相同

3.1 阻塞情况

  • 如果F服务从D服务分片接收到stop_send_messages,则它知道D服务分片将重新启动,因此,如果FasterChannelUp在2分钟后未收到消息,则可以认为此D服务分片已关闭。
  • 如果F服务收到ChannelUp消息,则认为卡住的分片处于活动状态。
  • 如果F服务超过2分钟没有收到来自一个D服务分片的任何消息,则它将假定此D服务分片已关闭。
  • 如果Faster向阻塞的分片发送一些回显消息,则如果它收到一些响应,则认为此分派器分片处于活动状态。

3.2重新启动

  • 如果重新启动一个分派器分片,则F服务将等待2分钟,以决定此分片卡住还是返回。

3.3 卡滞状态与上游服务的不同情况讨论

3.3.1 假设F服务.0认为D服务.0卡住了,而上游P服务.0认为D服务.0仍然存在

  • F服务.0将在收到上游消息的同时向客户端发送复位消息,然后客户端将创建一个新会话,并通过与F服务.0相同的连接发送消息,F服务.0将这些消息发送给具有高可用性的的新D服务分片。
  • 如果下游服务P.0通过旧的ssid推送某些消息,则D服务.0会将这些消息发送到F服务.0。在大多数情况下,F服务.0应该不会收到此消息。但是,如果F服务.0收到此消息,它将把它发送给客户端。并且客户端将发现消息的ssid不等于当前的ssid,然后它将丢弃此消息。

3.3.2 情况:假设F服务.0认为D服务.0处于活动状态,而上游P服务.0认为D服务.0被卡住

  • 如果F服务.0接收到来自客户端的消息,则它将像以前一样将消息转发到D服务.0。
  • 如果P服务.0收到需要推送到D服务.0的消息,则它将在其未决rpc队列中处于未处理状态。

四.性能测试

  • 乱序的传入消息比率约为5/150 = 1/30,因此对于大多数消息,可以将其转发到其他服务,而无需持久保存到redis。
  • 传入消息的额外增量时间:90%的消息增量时间小于2秒。
  • 使用异步redis?
  • forward_to_server消息的平均值约为500B
  • 当一个分片卡住时迁移逻辑:将5%的流量移至其他分片。用于hashmode(ssid, 100) < 5确定用于移动的ssid。
  • 上游服务只能判断一个D服务碎片是存活还是卡住。

五. 改进后的情况讨论

5.1卡住状态与不同服务不同

假设D服务.0有一个备份分片D服务.1024,并且存在一个来自F服务.0-> D服务.0的会话,而P服务.0可以推送到D服务.0。F服务.0认为D服务.0卡住了,然后它将msg发送到备份分片D.1024;。P服务.0认为D服务.0可以,那么它将消息发送到D服务.0

  • 如果D服务Bus总线认为D服务.0仍然存在:

ssid的所有者可能会在D服务.0和D服务.1024之间频繁切换。或者使用别的策略,D服务.0将处理这些消息。

  • 如果D服务Bus总线认为D服务.0卡住了:

ssid的所有者将由D服务.1024接管,并且此ssid可能会被重置。

5.2重新启动问题

假设D服务.0具有备份分片D服务.1024,则在D服务.0重新启动时,有一些消息需要从F服务.0发送到D服务.0。当D服务.0重新启动时,它将首先将会话数据写入Redis。然后重新启动。

6. 其他

  • DNS的最高回报是2个dc中的ips。
  • 如果F服务找到一个D服务分片被卡住,则重置会话。
  • 如果GCM服务发现一个D服务分片被卡住,则重置会话。

6.1.什么时候认为分派器碎片卡住/有效?

  • 有tcp连接:如果3分钟内没有消息从该分片传入消息,则认为该分片被卡住了,否则它仍然有效。
  • 没有tcp连接:如ChannelUp3分钟后此分片没有任何消息,则我们认为该分片被卡住了,否则仍然有效。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、当前状态
    • 1.1、缺点
      • 1.2、改进办法
        • 2.1、基本思路:
        • 2.2 .策略
    • 二、无状态重构
    • 三、实现与问题讨论
      • 3.1 阻塞情况
        • 3.2重新启动
          • 3.3 卡滞状态与上游服务的不同情况讨论
            • 3.3.1 假设F服务.0认为D服务.0卡住了,而上游P服务.0认为D服务.0仍然存在
            • 3.3.2 情况:假设F服务.0认为D服务.0处于活动状态,而上游P服务.0认为D服务.0被卡住
        • 四.性能测试
        • 五. 改进后的情况讨论
          • 5.1卡住状态与不同服务不同
            • 5.2重新启动问题
            • 6. 其他
              • 6.1.什么时候认为分派器碎片卡住/有效?
              相关产品与服务
              云数据库 Redis
              腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档