架构师面试(十四):注册中心设计
问题
大家或多或少都接触过【注册中心】,对注册中心的基本功能,如:服务注册、服务发现、健康检查和变更通知 ,肯定是耳熟能详的;那么大家对注册中心的架构设计是否了解呢?
如果让你负责设计一个分布式的注册中心系统,那么你会考虑哪些关键问题呢?
解析
我们先来回顾关于【注册中心】的几个关键点:
1、注册中心的四大基本功能包括:服务注册、服务发现、健康检查和变更通知;其中 “服务注册” 动作由服务提供方节点发起,“服务发现” 动作由服务消费方节点发起,“健康检查” 和 “变更通知” 动作由注册中心发起;
2、注册中心这个组件存在的本质意义是什么呢?从系统架构分析的角度是为了解耦服务提供方节点对服务消费方节点的依赖。怎么理解呢?假设 服务消费方节点A 对 服务提供方节点B 进行 RPC 调用,我们说A和B的关系是 单向依赖;但是在实际的应用中,B节点的访问地址需要提供(以及将来的回收)给A,此时A和B 就形成了双向依赖的循环依赖关系;通过引入注册中心则方便的解决了该问题;
3、注册中心从功能的实现角度分析其本质,即:注册中心 = 存储系统 + 订阅系统,即在搭建一个注册中心的框架时,把握好其【存储实现】和【订阅实现】,也就基本实现了一个注册中心系统。
现在回到我们的问题上来,设计一个分布式的注册中心系统,需要考虑哪些关键问题呢?需要考虑三个最关键的点:
1、存储模型实现
注册中心需要记录和保存:服务提供方服务与节点之间的映射关系、服务消费方服务与节点之间的映射关系、服务消费方与服务提供方之间的订阅和被订阅的映射关系;存储模型的实现关乎注册中心【服务注册】和【服务发现】两个基本功能的实现。
2、订阅模型实现
注册中心需要通过【健康检查】密切关注着服务提供方节点的任何风吹草动,一旦有情况,需要及时通过【变更通知】主动告之服务消费方节点,这就是订阅模型需要做的实现;我们曾经提到过,订阅模型系统由三种实现模型,即:信箱模型、电话模型和BP机模型(见《架构师面试(三):订阅模型》),大家想一下广为人知的作为注册中心的zookeeper采用了什么样的订阅模型呢?
关于【健康检查】,大家需要注意,当服务数量非常高的时候,注册中心应该通过什么样的算法及时检测到服务提供方的健康状态呢?
3、数据节点同步
作为分布式的注册中心系统,肯定有很多的节点组成,而不同客户端连接的往往是不同的节点,这些节点之间如何进行数据同步呢?这是作为分布式注册中心系统必须要考虑的关键问题。为了让大家有一个更直观的理解,我们举一个例子:
假设一个分布式的注册中心系统由三个节点组成,分别是:X、Y、Z;服务提供方A有两个节点,分别是PA-1、PA-2;服务消费方B有两个节点,分别是CA-1、CA-2;服务B订阅了服务A;PA-1连接的是X节点、PA-2和CA-1连接的是Y节点、CA-2连接的是Z节点。(下面重点来了)当PA-1节点挂掉以后,X节点通过【健康检查】及时获取这个事件后,必须及时同步到Y节点和Z节点,由Y节点把变更通知给CA-1和由Z节点把变更通知给CA-2。
最后,我们一句话总结:设计一个分布式的注册中心系统,需要考虑存储模型实现、订阅模型实现和数据节点同步这样三个最关键的问题。

相关文章:
架构师面试(十四):注册中心设计
问题 大家或多或少都接触过【注册中心】,对注册中心的基本功能,如:服务注册、服务发现、健康检查和变更通知 ,肯定是耳熟能详的;那么大家对注册中心的架构设计是否了解呢? 如果让你负责设计一个分布式的注…...
ctf-web: php原生类利用 -- GHCTF Popppppp
源代码 <?php error_reporting(0); class CherryBlossom { public $fruit1; public $fruit2; public function __construct($a) {$this->fruit1 $a; } function __destruct() { echo $this->fruit1; } public function __toString() { $newFunc …...
「Unity3D」UGUI将元素固定在,距离屏幕边缘的某个比例,以及保持元素自身比例
在不同分辨率的屏幕下,UI元素按照自身像素大小,会发生位置与比例的变化,本文仅利用锚点(Anchors)使用,来实现UI元素,固定在某个比例距离的屏幕边缘。 首先,将元素的锚点设置为中心&…...
nextjs15简要介绍以及配置eslint和prettier
目录 一、Next.js 何时使用服务器端渲染(SSR)?何时使用静态生成(SSG)? 1、服务器端渲染(SSR - getServerSideProps) 2、 静态生成(SSG - getStaticProps) …...
存储过程和自定义函数在银行信贷业务中的应用(oracle)
数据校验和清洗 例如,检查客户的年龄是否在合理范围内,贷款金额是否符合规定的上下限等。 对于不符合规则的数据,可以进行清洗和修正。比如,将空值替换为默认值,或者对错误的数据进行纠正。 CREATE OR REPLACE PROC…...
基于Ollama平台部署的Qwen大模型实现聊天机器人
文章目录 基于Ollama平台部署的Qwen大模型实现聊天机器人1 概述2 技术栈2.1 开发技术2.2 环境 3 技术架构4 实现步骤4.1 环境搭建4.1.1 WSL配置及Ubuntu安装4.1.2 Ollama安装及模型部署 4.2 模块安装4.2.1 安装Streamlit 1.42.24.2.2 安装requests 2.32.34.2.3 安装ollama 0.4.…...
在 JDK 1.8 的 ConcurrentHashMap 中,为什么存在两种插入方式?
在 JDK 1.8 的 ConcurrentHashMap 中,之所以对“容器为空”和“计算位置为空”采取不同的处理方式,主要是因为 并发场景下的性能优化和并发安全保证。我们可以分开来看这两种情况: 1. 容器为空时,使用 volatile CAS 初始化 原因…...
如何让powershell的界面变成全屏显示?
刚打开powershell,原来的样子: 全屏:可以按一下键盘上的alt enter 键,效果:...
语音识别踩坑记录
本来想在原来的语音识别的基础上增加本地扩展本地词典, 采用的语音识别是Vosk识别器,模型是 vosk-model-small-cn-0.22 // 初始化Vosk识别器 if (recognizer null) {using (Model model new Model(modelPath)){string grammar "{""…...
图片查看器:用PyQt5实现本地图片预览工具
通过python代码,基于PyQt5实现本地图片预览查看工具。 我们对窗口进行了圆角设计,图片的翻页按钮半透明处理,当鼠标移动至按钮上的动画效果,当选择某一张图片,进行左右翻页则轮播同目录所有支持的图片格式。 import …...
Deepin通过二进制方式升级部署高版本 Docker
一、背景: 在Deepin系统中通过二进制方式升级部署高版本 Docker,下面将详细介绍二进制方式升级部署高版本 Docker 的具体步骤。 二、操作步骤 1.根据需求下载二进制文件,下载地址如下: https://mirrors.tuna.tsinghua.e…...
车架号VIN查询 API 接口用JAVA如何调用?
以下是车架号VIN查询 API 接口用JAVA如何调用的示例代码: package com.shuxun.data.impl.demo;import com.shuxun.common.core.util.HttpUtil; import org.apache.commons.codec.digest.DigestUtils;import java.util.HashMap; import java.util.Map;public class …...
Vulnhub 靶机 VulnOSv2 write up opendocman cms 32075 sql注入 账号密码 ssh连接 37292.c 脏牛提权
Vulnhub 靶机 VulnOSv2 write up opendocman cms 32075 sql注入 账号密码 ssh连接 37292.c 脏牛提权 一、信息收集 1、首先拿到靶场先扫一下ip arp-scan -l 3、 2、指纹扫描 nmap -sS -sV 192.168.66.178nmap -p- -sV -A 192.168.66.253 PORT STATE SERVICE VERSION 22…...
爬虫的精准识别:基于 User-Agent 的正则实现
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
Python数据分析之数据可视化
Python 数据分析重点知识点 本系列不同其他的知识点讲解,力求通过例子让新同学学习用法,帮助老同学快速回忆知识点 可视化系列: Python基础数据分析工具数据处理与分析数据可视化机器学习基础 四、数据可视化 图表类型与选择 根据数据特…...
【免费】2004-2020年各省货运量数据
2004-2020年各省货运量数据 1、时间:2004-2020年 2、来源:国家统计局、统计年鉴 3、指标:行政区划代码、地区、年份、货运量(万吨) 4、范围:31省 5、指标解释:货运量指在一定时期内,各种运输工具实际运…...
【CXX】6.6 UniquePtr<T> — std::unique_ptr<T>
std::unique_ptr 的 Rust 绑定称为 UniquePtr。有关 Rust API 的文档,请参见链接。 限制: 目前仅支持 std::unique_ptr<T, std::default_delete>。未来可能会支持自定义删除器。 UniquePtr 不支持 T 为不透明的 Rust 类型。对于在语言边界传递不…...
Java 集合框架大师课:集合框架源码解剖室(五)
🔥Java 集合框架大师课:集合框架源码解剖室(五) 💣 警告:本章包含大量 裸码级硬核分析,建议搭配咖啡因饮料阅读!☕️ 第一章 ArrayList 的扩容玄学 1.1 动态扩容核心代码大卸八块 …...
llamafactory 微调教程
文章目录 llamlafactory微调deepseekr1-0.5b1.1 说明1.2 搭建环境创建GPU实例连接实例部署llama_factory创建隧道,配置端口转发访问llama_factory 1.3 微调大模型从huggingface上下载基座模型查看模型是否下载成功准备数据集微调评估微调效果导出合并后的模型 释放实…...
代码随想录|二叉树|04二叉树的统一迭代法
一刷我这里放了。。。 代码随想录...
OpenClaw多任务调度:GLM-4.7-Flash并行处理文件与邮件
OpenClaw多任务调度:GLM-4.7-Flash并行处理文件与邮件 1. 为什么需要多任务调度 上周我需要同时处理两个紧急任务:整理三个月积累的会议录音文字稿,以及给二十多位合作伙伴发送定制化跟进邮件。手动操作需要至少6小时,而第二天早…...
OpenClaw安全加固指南:nanobot镜像的防火墙与权限配置
OpenClaw安全加固指南:nanobot镜像的防火墙与权限配置 1. 为什么需要安全加固? 当我第一次在本地部署OpenClaw时,最让我忐忑不安的就是安全问题。这个能操控我鼠标键盘、读写文件的AI助手,会不会不小心删掉我的重要文档…...
游戏玩家如何选?网易UU/ToDesk远程控制延迟实测(含手机投屏技巧)
游戏玩家专属远程控制工具深度评测:延迟、画质与投屏技巧全解析 作为一名资深游戏玩家,你是否遇到过这样的场景:出差在外想用手机继续刷副本,却苦于找不到合适的远程控制方案;或是想在平板上玩PC独占的3A大作ÿ…...
为什么你的STM32F103工程编译失败?可能是启动文件没选对!
为什么你的STM32F103工程编译失败?可能是启动文件没选对! 在嵌入式开发领域,STM32系列微控制器因其出色的性能和丰富的外设资源而广受欢迎。然而,即使是经验丰富的开发者,在STM32F103项目开发过程中也难免会遇到各种编…...
Java初学者项目需要哪些技术?
对于Java初学者,以下技术栈组合既能满足学习需求,又能完成完整项目开发:核心基础Java语法基础掌握变量、循环、条件语句面向对象三大特性:封装、继承、多态集合框架:$ArrayList$、$HashMap$等异常处理机制开发工具IDE&…...
重构Sketch图层管理流程:RenameIt效率引擎突破设计协作瓶颈
重构Sketch图层管理流程:RenameIt效率引擎突破设计协作瓶颈 【免费下载链接】RenameIt Keep your Sketch files organized, batch rename layers and artboards. 项目地址: https://gitcode.com/gh_mirrors/re/RenameIt 在现代UI/UX设计工作流中,…...
双模型协作:OpenClaw同时调用GLM-4.7-Flash与Coder模型实战
双模型协作:OpenClaw同时调用GLM-4.7-Flash与Coder模型实战 1. 为什么需要双模型协作? 在我的日常开发工作中,经常遇到这样的场景:需要先理解一个复杂需求(比如"帮我写个爬虫抓取知乎热榜并分析关键词"&am…...
Ubuntu 20.04 LTS下FinalShell安装全攻略(附一键脚本及常见问题解决)
Ubuntu 20.04 LTS下FinalShell终极配置指南:从安装到高阶应用 为什么开发者需要FinalShell? 作为一名长期使用Ubuntu进行远程服务器管理的开发者,我深知一款优秀的SSH工具对工作效率的影响。FinalShell作为跨平台的国产SSH工具,…...
LumiPixel优化升级:如何利用Z-Image模型生成更细腻的像素人像
LumiPixel优化升级:如何利用Z-Image模型生成更细腻的像素人像 1. 引言:像素艺术的复兴与挑战 像素艺术作为一种独特的数字艺术形式,近年来在游戏、NFT和数字设计领域迎来复兴。然而传统像素创作面临两大核心挑战: 细节表现力不…...
OpenClaw调用百川2-13B量化模型实测:Token消耗降低30%的3个技巧
OpenClaw调用百川2-13B量化模型实测:Token消耗降低30%的3个技巧 1. 为什么选择量化模型 当我第一次在本地部署OpenClaw时,最让我头疼的就是显存问题。我的RTX 3090显卡在运行百川2-13B原版模型时,显存占用经常突破20GB,导致其他…...
