分布式架构

负载均衡 分布式 集群

与世无争的帅哥 提交于 2019-12-05 11:49:15
单机模式 例如有一个在线商城系统,如果这个系统业务量很小,比如在校学生自己随便写的一个小项目,所有的代码都放在一个项目store-web中,然后把这个项目部署在一台服务器上。整个项目所有的服务都由这台服务器提供,这就是单机结构。 集群模式 如果业务量增大,一个服务器已经处理不了当前的数据量时,可以采用集群模式。集群模式简单来说,就是将同一份项目代码放在多个服务器上,这多个服务器中每个服务器就是一个节点,所有节点构成一个集群。也就是说每台服务器都跑着相同的项目代码(即store-web)。这样通过将大量请求分配给不同的节点来执行,可以提高系统的处理能力。理论来说有多少个节点系统的处理能力就能提升多少倍。 这里有一个问题就是如何将大量请求分配给集群中不同的节点来执行。这个就涉及到 负载均衡 技术。 负载均衡 负载均衡服务器起着调度者的作用,用户的所有请求都会首先由它接收,调度者再根据每台服务器的负载情况将请求分配给某一台服务器去处理。负载均衡服务器如何合理分配任务,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡问题。 负载均衡经典的有四种实现方式: HTTP重定向实现负载均衡 DNS负载均衡 反向代理负载均衡 负载均衡组件 分布式架构 还是那个在线商城,如果采用分布式架构,就不能将所有业务塞进一个项目store-web了。需要按照功能模块将业务分解

分布式问题分析

人走茶凉 提交于 2019-12-05 11:24:56
分布式问题分析 https://www.cnblogs.com/zhang-qc/p/8688052.html 原作者的blog问题写的非常好 先分布式 才能cloud native 参考: https://github.com/CyC2018/Interview-Notebook/blob/master/notes/ 业务中的分布式: 分布式 存储 :将数据分片到多个节点上,不仅可以提高性能(可扩展性),同时也可以使用多个节点对同一份数据进行备份(高可用性) 分布式 计算 :将一个大的计算任务分解成小任务分配到多个节点上去执行,再汇总每个小任务的执行结果得到最终结果。MapReduce 是分布式计算最好的例子。 分布式事务: 指事务的操作位于不同的节点上,需要保证事务的 AICD 特性。 产生的原因: 数据库分库分表; SOA 架构,比如一个电商网站将订单业务和库存业务分离出来放到不同的节点上。 解决办法: 1. 两阶段提交协议(很好地解决分布式事务问题) 2. 消息中间件(本质上是一个暂存转发消息的一个中间件) 处理模型:(1)点对点;(2)发布/订阅 负载均衡的算法与实现: 算法有轮询(Round Robin)、加权轮询、最少连接(将请求发送给当前最少连接数的服务器)、加权最小连接、随机算法 上面的没有加权的适合服务器性能差不多场景 Zookeeper 分布式锁  

Java-技术专区-技术栈分析辨证方法

僤鯓⒐⒋嵵緔 提交于 2019-12-05 11:12:20
1、好多公司动不动就JVM、高并发、分布式、微服务等等,我没有实际经验。 2、从事Java开发三年了,目前的职位是高级Java工程师,感觉技术和工资都到了瓶颈,对以后的发展方向有些迷茫。 3、加班时间过长,年龄大了,精力严重不够,竞争力远不如年轻程序员了。 4、Java工程师体量庞大,供大于需,导致Java程序员面临更加激烈的竞争。 5、目前做技术管理,薪资25K,但25K基本是天花板了,不甘心。   在我看来,开发三年甚至五六年以上的Java程序员要解决上面的问题无非就是两个层面: 1、技术经验   在技术经验方便,个人感觉你要想有所突破,首先就要形成一套技术体系,从技术的实现原理到技术应用,再到不同技术的优劣比较。因为当前各大公司使用的如火如荼的技术栈,无怪乎那些你已经曾经使用过的东西,只是你需要在这个基础上,让自己更有深度和见解。 2、业务需求能力   在业务需求能力方面,一个公司除了看重技术积累方面,另外还比较注重个人的业务理解和分析能力,如果你在某个领域的业务能力比较强,能够hold住当前的一个业务架构,这样说明你对业务的理解能力是非常到位的。所以在业务方便,首先需要的是结合场景的个人理解,其次是延伸扩展。   裁员并不可怕,没有技术实力才可怕,真正有实力的人不会被埋没。真正有实力的人才能走的更远飞的更高。当你具备这些能力时,你不用担心裁员而是应该考虑我要不要继续留在

分布式事务

怎甘沉沦 提交于 2019-12-05 09:30:46
目录: 1.什么是事务? 2.换个角度看事务 3.Java中的事务 4.啥又是分布式事务? 5.分布式事务的几种实现思路 6.总结 写在前面 在分布式、微服务大行其道的今天,相信大家对这些名词都不会陌生。而说到使用分布式,或者拆分微服务的好处,你肯定能想到一大堆。 比如每个人只需要维护自己单独的服务,没有了以前的各种代码冲突。自己想测试、想发布、想升级,只需要care自己写的代码就OK了,很方便很贴心! 然而事物都有两面性,但是它也同时也会带来的一些问题,今天的文章谈的就是分布式系统架构带来的其中一个棘手的问题: 分布式事务 1、什么是事务? 首先抛出来一个问题:什么是事务? 有人会说事务就是一系列操作,要么同时成功,要么同时失败;然后会从事务的ACID特性(原子性、一致性、隔离性、持久性)展开叙述。 确实如此,事务就是为了保证一系列操作可以正常执行,它必须同时满足ACID特性。 但是今天我们 换个角度思考下,我们不仅要知道what(比如什么是事务),更要知道事务的why(比如为什么会有事务这个概念?事务是为了解决什么问题)。 有时候,换个角度说不定有不一样的收获。 2、换个角度看事务 就像经典的文学作品均来自于生活,却又高于生活,事务的概念同样来自于生活,引入“事务”肯定是为了解决某种问题,不然,谁又愿意干这么无聊的事情呢? 最简单最经典的例子: 银行转账

redis分布式锁

两盒软妹~` 提交于 2019-12-05 07:18:49
关于分布式锁的概念网上太多了,这里就不罗嗦了。对于开发者来说,最关心的应该是什么情况下使用分布式锁。 使用分布式锁,一般要满足以下几个条件: · 分布式系统(关键是分布式) · 共享资源(各系统访问同一资源,资源的载体可能是传统关系型数据库或者NoSQL) · 同步访问(没有同步访问,谁管你资源竞争不竞争) 场景案例 · 光说不练假把式,上点干货。管理后台的部署架构(多台tomcat服务器+redis+mysql)就满足使用分布式锁的条件。多台服务器要访问redis全局缓存的资源,如果不使用分布式锁就会出现问题。 看如下伪代码: long N=0L; //N从redis获取值 if(N<5){ N++; //N写回redis } · 从redis获取值N,对数值N进行边界检查,自加1,然后N写回redis中。 这种应用场景很常见,像秒杀,全局递增ID、IP访问限制等。以IP访问限制来说,恶意攻击者可能发起无限次访问,并发量比较大,分布式环境下对N的边界检查就不可靠,因为从redis读的N可能已经是脏数据。传统的加锁的做法(如java的synchronized和Lock)也没用,因为这是分布式环境,这个同步问题的救火队员也束手无策。在这危急存亡之秋,分布式锁终于有用武之地了。 所谓知己知彼,百战百胜。要想用好他,首先你要了解他。分布式锁可以基于很多种方式实现,比如zookeeper

微服务架构四大金刚利器

三世轮回 提交于 2019-12-05 06:40:04
概述 互联网应用发展到今天,从单体应用架构到SOA以及今天的微服务,随着微服务化的不断升级进化,服务和服务之间的稳定性变得越来越重要,分布式系统之所以复杂,主要原因是分布式系统需要考虑到网络的延时和不可靠,微服务很重要的一个特质就是需要保证服务幂等,保证幂等性很重要的前提需要分布式锁控制并发,同时缓存、降级和限流是保护微服务系统运行稳定性的三大利器。 随着业务不断的发展,按业务域的划分子系统越来越多,每个业务系统都需要缓存、限流、分布式锁、幂等工具组件,distributed-tools组件(暂未开源)正式包含了上述分布式系统所需要的基础功能组件。 distributed-tools组件基于tair、redis分别提供了2个springboot starter,使用起来非常简单。 以使用缓存使用redis为例,application.properties添加如下配置 redis.extend.hostName=127.0.0.1 redis.extend.port=6379 redis.extend.password=pwdcode redis.extend.timeout=10000 redis.idempotent.enabled=true 接下来的篇幅,重点会介绍一下缓存、限流、分布式锁、幂等的使用方式。 缓存 缓存的使用可以说无处不在,从应用请求的访问路径来看,用户user

分布式服务框架之服务化最佳实践

不羁岁月 提交于 2019-12-05 06:07:00
在服务化之前,业务通常都是本地API调用,本地方法调用性能损耗较小。服务化之后,服务提供者和消费者之间采用远程网络通信,增加了额外的性能损耗,业务调用的时延将增大,同时由于网络闪断等原因,分布式调用失败的风险也增大。如果服务框架没有足够的容错能力,业务失败率将会大幅提升。 除了性能、可靠性等问题,跨节点的事务一致性问题、分布式调用带来的故障定界困难、海量微服务运维成本增加等也是分布式服务框架必须要解决的难题。本章节我们将对服务化之后面临的挑战进行分析,并给出解决方案和业务最佳实践。 1. 性能和时延问题 在服务化之前,业务通常都是本地API调用,本地方法调用性能损耗较小。服务化之后,服务提供者和消费者之间采用远程网络通信,增加了额外的性能损耗: 1) 客户端需要对消息进行序列化,主要占用CPU计算资源。 2) 序列化时需要创建二进制数组,耗费JVM堆内存或者堆外内存。 3) 客户端需要将序列化之后的二进制数组发送给服务端,占用网络带宽资源。 4) 服务端读取到码流之后,需要将请求数据报反序列化成请求对象,占用CPU计算资源。 5) 服务端通过反射的方式调用服务提供者实现类,反射本身对性能影响就比较大。 6) 服务端将响应结果序列化,占用CPU计算资源。 7) 服务端将应答码流发送给客户端,占用网络带宽资源。 8) 客户端读取应答码流,反序列化成响应消息,占用CPU资源。

转:TCC分布式事务

柔情痞子 提交于 2019-12-05 04:54:23
FROM: https://www.cnblogs.com/jajian/p/10014145.html 之前网上看到很多写分布式事务的文章,不过大多都是将分布式事务各种技术方案简单介绍一下。很多朋友看了还是不知道分布式事务到底怎么回事,在项目里到底如何使用。 所以这篇文章,就用大白话+手工绘图,并结合一个电商系统的案例实践,来给大家讲清楚到底什么是 TCC 分布式事务。 首先说一下,这里可能会牵扯到一些 Spring Cloud 的原理,如果有不太清楚的同学,可以参考之前的文章: 《拜托,面试请不要再问我Spring Cloud底层原理!》 。 1 | 0 业务场景介绍 咱们先来看看业务场景,假设你现在有一个电商系统,里面有一个支付订单的场景。 那对一个订单支付之后,我们需要做下面的步骤: 更改订单的状态为“已支付” 扣减商品库存 给会员增加积分 创建销售出库单通知仓库发货 这是一系列比较真实的步骤,无论大家有没有做过电商系统,应该都能理解。 2 | 0 进一步思考 好,业务场景有了,现在我们要更进一步,实现一个 TCC 分布式事务的效果。 什么意思呢?也就是说,[1] 订单服务-修改订单状态,[2] 库存服务-扣减库存,[3] 积分服务-增加积分,[4] 仓储服务-创建销售出库单。 上述这几个步骤,要么一起成功,要么一起失败,必须是一个整体性的事务。 举个例子

基于zookeeper实现分布式锁

隐身守侯 提交于 2019-12-05 04:26:14
前言:2016春节之后一直比较忙,因此博客N个没有更新,现在也是忙里偷闲,偷偷的更新一篇! 一、分布式锁介绍 分布式锁主要用于在分布式环境中保护跨进程、跨主机、跨网络的共享资源实现互斥访问,以达到保证数据的一致性。 二、架构介绍 在介绍使用Zookeeper实现分布式锁之前,首先看当前的系统架构图 解释: 左边的整个区域表示一个Zookeeper集群,locker是Zookeeper的一个 持久节点 ,node_1、node_2、node_3是locker这个持久节点下面的 临时顺序节点 。client_1、client_2、client_n表示多个客户端,Service表示需要互斥访问的共享资源。 三、分布式锁获取思路 1. 获取分布式锁的总体思路 在获取分布式锁的时候在locker节点下创建临时顺序节点,释放锁的时候删除该临时节点。客户端调用createNode方法在locker下创建临时顺序节点, 然后调用getChildren(“locker”)来获取locker下面的所有子节点,注意此时不用设置任何Watcher。客户端获取到所有的子节点path之后,如果发现自己在之 前创建的子节点序号最小,那么就认为该客户端获取到了锁。如果发现自己创建的节点并非locker所有子节点中最小的,说明自己还没有获取到锁, 此时客户端需要找到比自己小的那个节点,然后对其调用exist()方法

简要分析ZooKeeper基本原理及安装部署

天大地大妈咪最大 提交于 2019-12-05 04:21:06
一、ZooKeeper 基本概念 1、ZooKeeper 是什么? Zookeeper官网地址: http://zookeeper.apache.org/ Zookeeper官网文档地址: http://zookeeper.apache.org/doc/trunk/index.html ZooKeeper 是Hadoop下的一个子项目,它是一个针对大型分布式系统的可靠协调系统;它提供的功能包括:配置维护、名字服务、分布式同步、组服务等; 它的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。 Zookeeper一个最常用的使用场景就是用于担任服务生产者和服务消费者的注册中心,服务生产者将自己提供的服务注册到Zookeeper中心,服务的消费者在进行服务调用的时候先到Zookeeper中查找服务,获取到服务生产者的详细信息之后,再去调用服务生产者的内容与数据,简单示例图如下: 2、ZooKeeper设计目标: ZooKeeper允许分布式进程通过共享的层次结构命名空间进行相互协调,这与标准文件系统类似。 名称空间由ZooKeeper中的数据寄存器组成 - 称为znode,这些类似于文件和目录。 与为存储设计的典型文件系统不同,ZooKeeper数据保存在内存中,这意味着ZooKeeper可以实现高吞吐量和低延迟。