Eureka设计原理
1. Eureka设计原理
1.1. 前言
目前我越来越关注技术原理层面的东西,开始考虑中间件设计背后,要考虑哪些因素,为什么要这样设计,有什么优化的地方,这次来讨论Eureka
1.2. 设计问题
设计一个注册中心,需要考虑什么东西?一步步来
- 首先注册中心的作用是用来存储各个服务器的地址端口等信息,所以需要考虑如何存储
- 存储就需要考虑是主动去拉还是各系统自己推送地址信息过来?拉取或推送的时间频率如何考虑?如何进行拉取推送,使用socket通信?
- 如何保证注册服务的准确性,实时性,可靠性?
- 当有几百上千个服务的时候,会对Eureka造成压力吗?如何克服这种压力?
1.3. 注册步骤
- Eureka Client A启动后主动注册到Eureka Server,Eureka Client B再一段时间后主动向服务端拉取注册表,发现客户端A注册上来了
- 当Eureka Client C启动再注册上Eureka Server,一定时间后客户端AB再去拉取注册表,就可以发现C注册上来了
- 客户端每隔一段时间(默认30秒)会去服务端拉取注册表信息,保证注册表是最新的
- 且客户端每隔一段时间(默认30秒)会发送一次心跳,来表示客户端存活
1.4. 如何抗住上千台机器压力
- 假设100个服务每个部署20台机器,那就是2000台
- 按每个客户端每隔30秒发送一个心跳+一次注册表拉取,每分钟就是4次,也就是总共每分钟4*2000=8000次
- 也就是每秒8000/60=133次,换算成一天 80006024=1152 0000 也就是每天上千万的请求量了
- 经过这么一算你会发现这样的请求频率好像还能接受,只需要Eureka Server能抗住每秒200的qps就行了
- 那么它是如何抗住200qps的?Eureka采用的是ConcurrentHashMap来存储注册表信息,没错就是这玩意,我一开始看到也很吃惊,不是吃惊它什么巧妙的设计,我觉得让一个刚入行的菜鸟来做存储,可以也做成这样,只不过可能用的HashMap。但后来想想,我们系统的QPS之所以上不去,实际上耗时都在IO操作上,不管是文件操作还是数据库操作都是比较耗时的,用ConcurrentHashMap这种纯内存操作的确可以做到非常快速的响应
- 经过上面的分析,我们知道了30秒的间隔差不多就能抗住上千万的日请求了,那么就算你机器再增多上去,再加个两三千台,真撑不住的时候,你还可以改请求间隔,时间改长一点就行了
1.5. 服务端缓存机制
Eureka为了防止同时读写内存数据造成的并发冲突问题,采用多级缓存来提高响应速度
1.6. 注册延迟原理
- 同样的上面的机制,导致了服务注册到可使用完毕需要更多的延迟,这些延迟在什么地方呢?
- 首先是注册,查看源码会发现,客户端启动时默认需要40秒才能主动去注册
@Override
public int getInitialInstanceInfoReplicationIntervalSeconds() {
return configInstance.getIntProperty(
namespace + INITIAL_REGISTRATION_REPLICATION_DELAY_KEY, 40).get();
}
- 注册之后服务端的ReadWriteCacheMap会清掉缓存,打算之后重新读内存
- 服务端后台线程默认30秒会去发现ReadWriteCacheMap清空了,就会去清空ReadOnlyCacheMap中的缓存,而这个缓存是客户端来读的时候经历的一级缓存
- 客户端来请求的周期同样是默认30秒,这又导致了一次延迟
- 而如果用Ribbon请求,它首先请求的是Eureka Client缓存的注册表,这个缓存更新同样要30秒,这样就导致了最大可能造成2分钟左右的延迟
这里我要着重强调,Eureka为什么要这么设计?目的是为了分散请求压力,当客户端机器越来越多的时候,不至于qps都集中到同一时刻,所以在小规模的部署中,有些时间是可以减小的
- 比如客户端的这个初始化时间,找到上面对应的json文件,name属性就是application.properties里需要配置的属性值
- 或者直接去查询Eureka文档,我看了下,它也没详细的文档,直接给你导向到具体的类去了,自己看服务端配置
Eureka设计原理的更多相关文章
- Atitit ati licenseService 设计原理
Atitit ati licenseService 设计原理 C:\0workspace\AtiPlatf\src_atibrow\com\attilax\license\LicenseX.ja ...
- kafka入门:简介、使用场景、设计原理、主要配置及集群搭建(转)
问题导读: 1.zookeeper在kafka的作用是什么? 2.kafka中几乎不允许对消息进行"随机读写"的原因是什么? 3.kafka集群consumer和producer状 ...
- html5设计原理(转)
转自: http://www.cn-cuckoo.com/2010/10/21/the-design-of-html5-2151.html 今天我想跟大家谈一谈HTML5的设计.主要分两个方面:一 ...
- 学习HTML5必读之《HTML5设计原理》
引子:很久前看过的一遍受益匪浅的文章,今天再次转过来,希望对学习HTML5的朋友有所帮助. 今天我想跟大家谈一谈HTML5的设计.主要分两个方面:一方面,当然了,就是HTML5.我可以站在这儿只讲HT ...
- 分布式文件系统FastDFS设计原理
原文地址: http://blog.chinaunix.net/uid-20196318-id-4058561.html FastDFS是一个开源的轻量级分布式文件系统,由跟踪服务器(tracker ...
- ApplicationContext容器的设计原理
1.在ApplicationContext容器中,我们以常用的FileSystemXmlApplicationContext的实现为例来说明ApplicationContext容器的设计原理. 2.在 ...
- BeanFactory容器的设计原理
XmlBeanFactory设计的类继承关系 1.BeanFactory接口提供了使用IoC容器的规范.在这个基础上,Spring还提供了符合这个IoC容器接口的一系列容器的实现供开发人员使用. 2. ...
- Spring技术内幕——深入解析Spring架构与设计原理(一)IOC实现原理
IOC的基础 下面我们从IOC/AOP开始,它们是Spring平台实现的核心部分:虽然,我们一开始大多只是在这个层面上,做一些配置和外部特性的使用工作,但对这两个核心模块工作原理和运作机制的理解,对深 ...
- BigPipe设计原理
高性能页面加载技术--BigPipe设计原理及Java简单实现 1.技术背景 动态web网站的历史可以追溯到万维网初期,相比于静态网站,动态网站提供了强大的可交互功能.经过几十年的发展,动态网站在互动 ...
随机推荐
- POJ1463-Strategic game-(树形dp)
http://poj.org/problem?id=1463 题意:有一棵n个结点的树,要在这棵树上放士兵守卫,一个士兵可以守卫自己所在的位置以及与之相邻的点.问最少放多少个士兵? 题解:对于每个点, ...
- MVC Core 使用TagHelper扩展几个插件
未完待续... 案例1:按钮权限校验,无权限不显示,利用TagHelper控制元素是否输出 [HtmlTargetElement("tc-permission", TagStruc ...
- thinkphp5.0 中简单处理微信支付异步通知
public function wx_notify(){ $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; libxml_disable_ent ...
- mysql Navicat通过代理链接数据库
1.做完host 账号 密码(数据库服务器)配置之后,选择ssh 2.配置代理服务器ip的登录的账号密码.(代理服务器必须可以连你的Navicat客户端和数据库服务器,不然怎么做代理.) 3.可以直接 ...
- Linux-day02
一.安装搜狗输入法 1.更新包安装 setting→language support 2.安装中文语言包,安装Fcitx输入法框架 3.安装搜狗输入法命令: sudo dpkg -i sogoupin ...
- 使用PostMan进行压力/性能测试
1. 2. 3. 4.查看结果/导出结果
- 从最近的比赛学习CTR/CVR
https://zhuanlan.zhihu.com/p/35046241 包大人 深度学习炼丹劝退师 278 人赞同了该文章 从最近的比赛学习CTR/CVR 最近在玩kaggle的talking d ...
- k均值聚类算法原理和(TensorFlow)实现
顾名思义,k均值聚类是一种对数据进行聚类的技术,即将数据分割成指定数量的几个类,揭示数据的内在性质及规律. 我们知道,在机器学习中,有三种不同的学习模式:监督学习.无监督学习和强化学习: 监督学习,也 ...
- MybatisPlus使用代码生成器遇到的小问题
MyBatisPlus 在3.0.3版本之前使用代码生成器因为存在默认依赖,所以不需要其他的依赖,项目中使用的是3.0.1的版本,所以不用添加其他依赖,添加之后反倒是会报错,实际上MP官网上已经说明了 ...
- 使用canvas实现图片预览、缩放(压缩)以及生成文件下载
参考 https://www.runoob.com/html/html5-canvas.html https://www.cnblogs.com/yuanzhiguo/p/8288822.html h ...