蚂蚁金服服务注册中心 Session 存储策略 | SOFARegistry 解析

Go实战全家桶之十:自研注册中心服务gocenterserver "msg": "成功","msg": "成功","msg": "成功", 阅读详情

SOFAStack

(Scalable Open Financial Architecture Stack)是蚂蚁金服自主研发的金融级分布式架构,包含了构建金融级云原生架构所需的各个组件,是在金融场景里锤炼出来的最佳实践。

640?wx_fmt=png
SOFARegistry 是蚂蚁金服开源的具有承载海量服务注册和订阅能力的、高可用的服务注册中心,在支付宝/蚂蚁金服的业务发展驱动下,近十年间已经演进至第五代。
本文为《剖析 | SOFARegistry 框架》第五篇,本篇作者力鲲,来自蚂蚁金服。《剖析 | SOFARegistry 框架》系列由 SOFA 团队和源码爱好者们出品,项目代号:<SOFA:RegistryLab:/>,文末包含往期系列文章。
GitHub 地址:
https://github.com/sofastack/sofa-registry


1
回顾:服务注册
 
SOFARegistry 作为服务注册中心,面临的一个很重要的挑战就是如何解决海量的客户端连接问题,这也是本文要剖析的内容。不过作为一篇完整的文章,我们还是会先花一点时间介绍 SOFARegistry 的相关信息,以便读者了解其背景。
服务注册中心在服务调用的场景中,扮演一个“中介”的角色,服务发布者 (Publisher) 将服务发布到服务注册中心,服务调用方 (Subscriber) 通过访问服务注册中心就能够获取到服务信息,进而实现调用。
640?wx_fmt=png
图1 - 服务的“中介”

2
流程:订阅/发布 
在《》一文中,我们提到了一个典型的 “RPC 调用的服务寻址” 应用场景,服务的提供方通过如下两个步骤完成服务发布:
  • 注册,将自己以 Publisher 的角色注册到 SOFARegistry;
  • 发布,将需要发布的数据 (通常是IP 地址、端口、调用方式等) 发布到 SOFARegistry;
与此相对应的,服务的调用方通过如下步骤实现服务调用:
  • 注册,将自己以 Subscriber 的角色注册到 SOFARegistry;
  • 订阅,收到 SOFARegistry 推送的服务数据;
从上面我们可以看到,整个流程中很重要的一个步骤就是注册,不管是 Publisher 还是 Subscriber 都只能在注册成功后才能实现发布订阅的需求。因此 SOFARegistry 要解决的一个问题就是如何维护与 Client 连接而产生的 Session,尤其是当 Client 数量众多的时候。
640?wx_fmt=png
图2 - 海量啊海量

3
设计:分层隔离
 
在 SOFARegistry 的应用场景中,体量庞大的数据主要有两类:Session 数据、服务信息数据。两类数据的相同之处在于其数据量都会不断扩展,而不同的是其扩展的原因并不相同:Session 是对应于 Client 的连接,其数据量是随着业务机器规模的扩展而增长,而服务信息数据量的增长是由 Publisher 的发布所决定。所以 SOFARegistry 通过分层设计,将两种数据隔离,从而使二者的扩容互不影响。
640?wx_fmt=png
图3 - 分层,扩容互不影响
当然,对于分层设计的概念介绍,在《》的 “如何支持海量客户端” 章节已经有了很完整的介绍,这里不再赘述。本文是想从代码层面来看看其设计实现的方式。

通信 Exchange
Exchange 作为 Client / Server 连接的抽象,负责节点之间的连接。在建立连接中,可以设置一系列应对不同任务的 handler (称之为 ChannelHandler),这些 ChannelHandler 有的作为 Listener 用来处理连接事件,有的作为 Processor 用来处理各种指定的事件,比如服务信息数据变化、Subscriber 注册等事件。
640?wx_fmt=png
图4 - 每一层各司其职,协同实现节点通信
Session 节点在启动的时候,利用 Exchange 设置了一系列 ChannelHandler:
  • PublisherHandler
  • SubscriberHandler
  • WatcherHandler
  • ClientNodeConnectionHandler
  • CancelAddressRequestHandler
  • SyncConfigHandler
其中 SubscriberHandler 和 PublisherHandler 主要是与服务发布方 (Publisher) 以及服务调用方 (Subscriber) 的行为相关,我们在下面说明。

任务处理
由于 SubscriberHandler 在 Session 节点启动时就已经初始化并设置,所以当有 Subscriber 注册时,就由 SubscriberHandler 负责后续一系列的处理逻辑。
640?wx_fmt=png
图5 - Subscriber 的注册过程
上面的流程图展示了 Subscriber 注册的处理过程,SessionSever 在处理注册请求时,除了保存 Subscriber 的会话信息,还要为新注册的 Subscriber 提供其所订阅的服务信息数据,最后通过推送的方式将数据发送 Subscriber。
下面是上述流程在代码模块上的实现,我们依然用图的方式展示出来,大家按图索骥也便于查阅相关源码中的细节。
640?wx_fmt=png
图6 - 代码流转:Subscriber 注册
可以看到,SOFARegistry 采用了 Handler - Task & Strategy - Listener 的方式来应对服务注册中的各种场景和任务,这样的处理模型能够尽可能的让代码和架构清晰整洁。
Publisher 的注册过程和 Subscriber 基本一致,略有不同的是 Publisher 在注册完毕之后将要发布的数据写到 DataServer 上。
640?wx_fmt=png
图7 - Publisher 的注册过程
这个过程也是采用了 Handler - Task & Strategy - Listener 的方式来处理,任务在代码内部的处理流程和订阅过程基本一致。
640?wx_fmt=png
图8 - 代码流转:Publisher 注册

会话缓存
在二层架构中 (即 Client 直接连接 DataServer),连接数是一个很难收敛的指标,因为当一个 Subscriber 订阅的服务位于不同 DataServer 上时,他就会与多个 DataServer 同时保持连接,这样“每台 DataServer 承载的连接数会随 Client 数量的增长而增长,每台 Client 极端的情况下需要与每台 DataServer 都建连,因此通过 DataServer 的扩容并不能线性的分摊 Client 连接数”。
640?wx_fmt=png
图9 - 两层结构中,扩容无法减少连接数
这也是 SOFARegistry 设计三层模型的原因,通过 SessionServer 来负责与 Client 的连接,将每个 Client 的连接数收敛到 1,这样当 Client 数量增长时,只需要扩容 SessionServer 集群就可以了。
所以从设计初衷上我们就能够看出来 SessionServer 必须要满足的两个主要能力:从 DataServer 获取服务信息数据;以及保存与 Client 的会话。下面我们分开来谈:

1. 从 DataServer 获取服务信息数据;

其实很好理解,既然 SessionServer 扮演了三层结构中的“中间商”角色,那它也就理应替 Subscriber 从 DataServer 获取数据。但是这里有一个考量:SessionServer 要不要缓存数据,以及如何缓存从 DataServer 获取的数据。
  • SessionServer 要不要缓存数据?
服务信息数据从 SessionServer 被推送到 Subscriber 主要有两种触发场景:一是 DataServer 上的数据有变化,二是有新的 Subscriber 注册到 SessionServer。两种场景的出现频率是不一样的,在实际应用中第二种场景才是数据推送的主要原因,所以 SessionServer 上缓存数据可以对 DataServer 层屏蔽 Client 的变化,从而有效减轻 DataServer 的压力。
640?wx_fmt=png
图10 - 两种场景导致的数据推送
  • 如何缓存从 DataServer 获取的数据?
这里 SOFARegistry 采用了 LoadingCache的数据结构,通过给 cache 中的 entry 设置过期时间的方式,使得 cache 定期从 DataServer 中拉取数据以替换过期的 entry。同时,当 DataServer 中有数据更新时,也会主动向 SessionServer 发请求使对应 entry 失效,从而促使 SessionServer 去更新失效 entry。具体细节如图所示:
640?wx_fmt=png
图11 - SessionServer 从 DataServer 更新数据
在代码实现中,依然是采用 Handler - Task & Strategy - Listener 的方式来处理,感兴趣的读者可以实际翻阅代码查看具体细节。
2. 保存与 Client 的会话
每个 SessionServer 都负责与若干 Client 的连接,所以在 SessionServer 中也会有专门的数据结构来保存这些会话。随着 Client 数量增加,我们可以通过扩容 SessionServer 集群的方式来解决 SessionServer 连接数增加的。
640?wx_fmt=png
图12 - SessionInterests 维护 Client 的连接
如图中所示,SessionServer 会分别用不同的数据结构来保存 Subscriber 和 Publisher 的会话,这种设计的一个重要原因是 SessionServer 会定期与 DataServer 进行 Publisher 的数据比对,以保证数据的一致性。这方面的细节我们会在后续的文章中继续讨论。

4
总结 
SOFARegistry 作为服务注册中心,需要面对的业务场景以及要处理的任务种类都比较多,其代码也涉及到分布式存储、一致性算法、会话连接等多个方面,可以算是架构设计方面一本很好的“教材”。本文从 Session 存储的角度出发,剖析了 SessionServer 在实现过程中的一些设计思路和代码抽象,希望可以对读者的学习有所帮助和启发。

5
SOFARegistryLab 系列阅读
 




点击“阅读原文”,获取 SOFALab 全系列文章~

640?wx_fmt=png

SOFARegistry注册中心的搭建(蚂蚁金服) 之前的文章中,详细的介绍了如何去搭建一个基于SOFABoot框架的项目,我们都知道,在用SpringBoot框架去开发一款分布式项目时,Spring Cloud为我们提供了一整套的针对多个服务之间的相互调用的问题,包括Eureka、Hystrix、Feign、Config等。在之前的文章中也介绍了,SOFABoot的主要功能中,除了介绍过的健康检查能力,类隔离和日志隔离之外,还有一个重要的,就是SOFAStack中一些SOFA中间件的集成管理。其实,SOFAStack同Spring Cloud一样,就... 阅读详情

相关推荐

一份来自蚂蚁金服大佬的数据库设计总结(纯干货)

一个成功的管理系统,是由:[50% 的业务 + 50% 的软件] 所组成,而 50% 的成功软件又有 [25% 的数据库 + 25% 的程序] 所组成,数据库设计的好坏是一个关键。 如果把企业的数据比做生命所必需的血液,那么数据库的设计就是应用中最重要的一部分。有关数据库设计的材料汗牛充栋,大学学位课程里也有专门的讲述。 不过,就如我们反复强调的那样,再好的老师也比不过经验的教诲。所以我归纳历年来所走的弯路及体会,并在网上找了些对数据库设计颇有造诣的专业人士给大家传授一些设计数据库的技巧和经验。精选了其中的

qianlia的博客 3149

【最佳实践】携程服务注册中心架构演进

1.前言 携程的微服务框架产品从2013年发展至今,已经历了7年多的打造。其中所使用的服务注册中心也从最开始人工数据维护架构演进到了现在全自动、百万容量级的架构。本文将逐一回顾携程服务注册中心所经历的三轮迭代过程,并重点介绍最新的第三版架构的设计与实现。 ...

天天新知 639

图文并茂把Ubuntu22.04安装到u盘,实现即插即用

1、刚好打算把Ubuntu安装到u盘,随便记录下整个过程。 2、前提准备:u盘(我的是16g大小),Vmware虚拟机,Ubuntu镜像文件(可以去官网下载); 3、下面记录全过程: 1、打开虚拟机,并选择创建新的虚拟机: 2、选典型: ​ ...

子非鱼 1万+

自研服务注册中心设计

设计目标: 1、提供可跨语言使用服务注册与发现平台 2、提供指令下发功能对集群服务进行管理 管控指令存在时效性,指令是可损的 3、提供节点信息存储与扩展 服务器类型(物理机、虚拟机、Docker容器等)、节点权重、服务分组、IP、Port、Name、Version等 服务注册: RPC/Web服务启动时,通过ControlCenterPlugin与控制中心服务建立并维护长连接,并自动上报服务节点,以及节点信息 服务发现 主动发现:Http服务 - 服务管理...

3408

避坑指南:ROS2 Humble摄像头标定常见错误排查(从‘CALIBRATE’按钮不变绿到保存文件找不到)

本文详细解析了ROS2 Humble环境下摄像头标定的常见问题及解决方案,从CALIBRATE按钮不变绿到标定文件保存失败等疑难杂症。提供硬件准备、参数设置、实时诊断到结果验证的全流程指导,特别针对Ubuntu2204系统和usb_cam驱动的兼容性问题给出实用建议,帮助开发者高效完成内参标定。

weixin_29193359的博客 398

探索热阻测试仪在半导体器件热管理中的应用与前景

T3Ster是MicReD研发的热测试仪,运用JEDEC稳态实时测试方法,专业测试分离或集成的双极型晶体管、MOS晶体管、常见的三极管、LED封装和半导体闸流管等器件的热特性。利用瞬态温升技术,可测得器件稳态热阻和温升,不但可以测得半导体器件稳态热阻和温升,而且可以直接测量各部分对于温升的贡献,计算芯片热流路径上的纵向热阻构成,对器件热可靠性设计、散热问题解决、产品性能提升和长期可靠性至关重要。关键词:T3ster,Micred,功率循环,结温测试,热阻测试,结温热阻测试,半导体热特性测试;

anscos_Olivia的博客 896

【xxl-job源码篇02】注册中心 自研RPC netty的应用

xxl-job源码解读,牛逼的自研RPC、注册中心、netty的应用

和我一起学习吧 4629

高分系列卫星轨道、传感器参数等信息

遥感卫星数据简介-高分系列

中遥科 3309

Go实战全家桶之十:自研注册中心客户端gocenterclient

"msg": "成功",

leijmdas的专栏 995

Python调用Google Trends官方数据接口实战指南

Google Trends作为全球最权威的搜索热度分析工具,其数据本质是公开、结构化、可编程访问的时序指标,而非需爬取的网页内容。其底层基于标准HTTP协议与JSON API交互,核心原理在于复现用户浏览器行为——通过/explore接口获取token,再凭token请求/widgetdata/multiline等端点获取归一化(0-100)时间序列数据。该技术路径规避了Selenium渲染依赖与非官方库的脆弱性,具备高稳定性、易调试、可监控等工程优势,广泛应用于竞品监测、内容选题验证、地域营销策略制定等业

weixin_29789925的博客 420

从0入门LocoTrack:6倍加速的SLAM追踪新范式实战指南

传统点追踪方法(如CorrTracker、TAPIR)在处理大规模场景或实时任务时,要么精度不足,要么速度太慢。而LocoTrack通过“局部4D相关性”和“Transformer全局关联”的创新设计,实现了精度与速度的双重突破速度:比现有SOTA方法快6倍,吞吐量高达数万点/秒;精度:在Kinetics、DAVIS等数据集上,定位误差显著低于传统方法;鲁棒性:能应对低纹理、动态场景等复杂环境,这是传统方法的“噩梦场景”。

m0_71589036的博客 95

eureka、zookeeper、nacos区别

eureka、zookeeper、nacos区别

幽静净土的技术分享 4731

【100%通过率】华为OD机试真题 Python 实现【字符串重新排列】【2022.11 Q4新题】

给定一个字符串s,s包括以空格分隔的若干个单词,请对s进行如下处理后输出: 1、单词内部调整:对每个单词字母重新按字典序排序 2、单词间顺序调整: 1)统计每个单词出现的次数,并按次数降序排列 2)次数相同,按单词长度升序排列 3)次数和单词长度均相同,按字典升序排列 请输出处理后的字符串,每个单词以一个空格分隔。

MISAYAONE的博客 7982

手搓一个最简单的注册中心

说到注册中心,相信很多人用过eureka和nacos,用法比较简单,只需引用jar包和配置服务器地址即可启用.但是今天我要说的不是两者的使用或者原理,而是更纯粹一点,就是手搓一个注册中心.

学习笔记 931

【系统分析师】写作框架:软件设计模式及其应用

本文围绕"软件设计模式及其应用"展开论述。首先介绍了近三年参与的某软件开发项目背景及个人承担的系统设计工作。其次系统阐述了设计模式的三大分类:创建型(如工厂方法、单例模式)、结构型(如适配器、装饰器模式)和行为型(如观察者、策略模式),重点分析了各类模式的特点和典型应用场景。最后结合项目实践,详细说明了采用的三种设计模式的具体实施过程及效果,包括提高代码复用性、降低耦合度等优势。文章还总结了项目经验,指出存在的不足及改进方向,强调合理运用设计模式对构建高质量软件系统的重要性。全文通过理论

数据知道的博客 5061

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

[从源码学设计]蚂蚁金服SOFARegistry之程序基本架构

之前我们通过三篇文章初步分析了 MetaServer 的基本架构,MetaServer 这三篇文章为我们接下来的工作做了坚实的铺垫。本系列我们接着分析 Data Server,顺带会涉及一些 Session Server。因为 DataServer 和 MetaServer 代码实现和架构的基本套路类似,所以我们主要关心差异点和DataServer的特点。本文会分析DataServer程序的基本架构。

罗西的思考 1003

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

[源码阅读] 阿里SOFA服务注册中心MetaServer(1)

SOFARegistry 是蚂蚁金服开源的一个生产级、高时效、高可用的服务注册中心。本系列将带领大家一起分析其MetaServer的实现机制,本文为第一篇,介绍MetaServer总体架构。本系列总体参考了官方的博客,具体请参见"0xFF 参考"。大家可以把参考作为总纲,我这系列文章作为注释补遗翻阅。在微服务架构下,一个互联网应用的服务端背后往往存在大量服务间的相互调用。例如服务 A 在链路上依赖于服务 B,那么在业务发生时,服务 A 需要知道服务 B 的地址,才能完成服务调用。而分布式架构下,每个服务往往

weixin_44484668的博客 2104

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

蚂蚁金服开源服务注册中心 SOFARegistry

\nSOFAStack(Scalable Open Financial Architecture Stack )是蚂蚁金服自主研发的金融级分布式架构,包含了构建金融级云原生架构所需的各个组件,是在金融场景里锤炼出来的最佳实践。\n本文根据 SOFA Meetup#1 北京站 现场分享整理,完整的分享 PPT 获取方式见文章底部。\n\nSOFAStack 开源一周年,继续补充开源大图\n2018...

测试0901-1 900

蚂蚁金服服务注册中心数据一致性方案分析 | SOFARegistry 解析

SOFAStack(Scalable Open Financial Architecture Stack) 是蚂蚁金服自主研发的金融级云原生架构,包含了构建金融级云原生架构所需的各个组...

金融级分布式架构 2234

SOFA原理学习--sofa rpc入门示例

       最近在项目开发中有用到sofa-rpc框架,其是蚂蚁金服开源的,简单的看了一下源码其和阿里巴巴另外一个比较出名的RPC框架Dubbo类似,其实sofa-rpc提供的dubbo协议最终就是使用的Dubbo的功能(sofa-rpc直接将dubbo的jar引入),所以如果对Dubbo有所了解的人我感觉在sofa-rpc学习上也是很快的。 SOFARPC 简介     SOFARPC ...

井底之蛙 3万+

蚂蚁金服服务注册中心数据分片和同步方案详解 | SOFARegistry 解析

SOFAStack(Scalable OpenFinancialArchitecture Stack)是蚂蚁金服自主研发的金融级分布式架构,包含了构建金融级云原生架构...

金融级分布式架构 908

10年后,阿里给千万开源人写了一封信

年末将至,阿里巴巴开源技术委员会负责人贾扬清写了一封信,想要和热爱开源的你说一声:谢谢。未来,我们希望与更多开源人一起,用技术普惠世界。阿里巴巴开源技术委员会负责人 贾扬清当我们回想起为...

金融级分布式架构 487

自研RPC框架

最初demo版本,不断完善中ing,注册中心还没做,服务治理不打算做了… 技术介绍:底层传输框架为netty,基于springboot-starter,自定义注解注入FactoryBean动态代理类… consumer端 自定义注解@RpcReference注入bean的元数据,rpc.starter.consumer为true的时候开启注解扫描 provider端 自定义注解@RpcComponent 暴露服务 netty客户端服务端之间使用rpcInvocation和rpcResult对象来传输数据

流年 480

Zookeeper 注册中心解析

Zookeeper 作为 Hadoop 项目中的一个子项目,是 Hadoop 集群管理的一个必不可少的模块,它主要用来控制集群中的数据,如它管理 Hadoop 集群中的 NameNode,还有 Hbase 中 Master Election、Server 之间状态同步等。 本文介绍的 Zookeeper 的基本知识,以及介绍了几个典型的应用场景。这些都是 Zookeeper 的基本功能,最重要的

我喂自己袋盐 2万+

SOFA原理学习--sofa boot入门学习

        目前Spring boot可以说是Spring web最为流行的开发框架了,目前很多框架都支持Spring boot注册扫描的模式,这篇博客我们用一个示例来展示一下sofa-boot简单的开发工程。 1、创建API中相关接口及实现类 接口: public interface IHelloService { public String sayHello(String...

井底之蛙 1万+
上一篇: 云原生时代,什么是蚂蚁金服推荐的金融架构?
下一篇: SOFA Weekly | 每周精选【10/14 - 10/18】
SOFAStack
博客等级 码龄7年 747粉丝 389原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值