分布式 订阅
分布式直流电源应用范围:小型开关站、环网柜、箱式变电站和用户终端,为二次控制线路、一次开关设备(弹簧机构真空断路器、电动负荷开关等)、通讯光端机等提供直流电源。 展开全文
分布式直流电源应用范围:小型开关站、环网柜、箱式变电站和用户终端,为二次控制线路、一次开关设备(弹簧机构真空断路器、电动负荷开关等)、通讯光端机等提供直流电源。
信息
频    率
50Hz±10%
工组环境温度
-10℃~+45℃
外文名
DC Power
交流输入电压
85~265VAC
中文名
分布式直流电源
分布式直流电源应用范围
分布式直流电源 [1]  主要应用于各种型号的开关设备内,为主开关(断路器、负荷开关等)和二次保护装置提供可靠的直流操作电源。
收起全文
精华内容
参与话题
问答
  • 分布式

    2020-03-20 16:56:55
    ①谈谈业务中使用分布式的场景 ②Session 分布式方案 ③分布式锁的场景 ④分布式锁的实现方案 ⑤分布式事务 ⑥集群与负载均衡的算法与实现

    谈谈业务中使用分布式的场景

    • 应用系统的服务拆分,比如公司的支付服务,把支付模块微服务化供其他项目调用,达到服务解耦。
    • 应用集群的分布式Session共享,比如A服务登录了(登录信息会保存在Session中),再访问B服务不再提示需要登录。
    • 底层数据库的压力分摊,如果系统的性能压力出现在数据库我们就可以采用读写分离,分库分表等方案进行解决。

    Session 分布式方案

    • 公司是使用Spring-session集成好的解决方案,它是基于Redis的Session共享存储方案,Redis可以做高可用集群,所有的web服务器都从这个存储介质中读取响应的Session,实现Session共享。

    分布式锁的场景

    1. 在并发情况下,一些更新语句会存在更新丢失的问题,所以在更新前需要加锁,分布式系统就需要加上分布式锁。

    分布式锁的实现方案

    1. 对于更新同一个表的情况,可以利用乐观锁版本号机制,即在更新之前先查询一遍获取老的版本号(old_version),再进行更新:
    update T set xxx = xxx,version = version + 1 where id = xxx and version = old_version
    
    1. Redis实现分布式锁,这里这里

    分布式事务

    1. 补偿事务(TCC),其核心思想是:针对每个操作,都要注册一个与其对应的确认和补偿(撤销)操作。
    2. 利用消息队列,做补偿机制,实现最终一致性。参考这里

    集群与负载均衡的算法与实现

    • 什么是负载均衡?用户请求通过负载均衡器按照某种负载均衡算法把流量均匀的分散到后端的多个服务器上,接收到请求的服务器可以独立的响应请求,达到负载分担的目的。
    • 常见的负载均衡模型有全局负载均衡和集群内负载均衡
    • 全局负载均衡一般通过DNS实现,通过将一个域名解析到不同IP,来实现不同的region调度能力。
    展开全文
  • 三种实现分布式锁的方式

    万次阅读 多人点赞 2018-06-14 15:01:57
    一、为什么要使用分布式锁我们在开发应用的时候,如果需要对某一个共享变量进行多线程同步访问的时候,可以使用我们学到的Java多线程的18般武艺进行处理,并且可以完美的运行,毫无Bug!注意这是单机应用,也就是...

    一、为什么要使用分布式锁

    我们在开发应用的时候,如果需要对某一个共享变量进行多线程同步访问的时候,可以使用我们学到的Java多线程的18般武艺进行处理,并且可以完美的运行,毫无Bug!

    注意这是单机应用,也就是所有的请求都会分配到当前服务器的JVM内部,然后映射为操作系统的线程进行处理!而这个共享变量只是在这个JVM内部的一块内存空间!

    后来业务发展,需要做集群,一个应用需要部署到几台机器上然后做负载均衡,大致如下图:

    这里写图片描述

    上图可以看到,变量A存在JVM1、JVM2、JVM3三个JVM内存中(这个变量A主要体现是在一个类中的一个成员变量,是一个有状态的对象,例如:UserController控制器中的一个整形类型的成员变量),如果不加任何控制的话,变量A同时都会在JVM分配一块内存,三个请求发过来同时对这个变量操作,显然结果是不对的!即使不是同时发过来,三个请求分别操作三个不同JVM内存区域的数据,变量A之间不存在共享,也不具有可见性,处理的结果也是不对的!

    如果我们业务中确实存在这个场景的话,我们就需要一种方法解决这个问题!

    为了保证一个方法或属性在高并发情况下的同一时间只能被同一个线程执行,在传统单体应用单机部署的情况下,可以使用Java并发处理相关的API(如ReentrantLock或Synchronized)进行互斥控制。在单机环境中,Java中提供了很多并发处理相关的API。但是,随着业务发展的需要,原单体单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,单纯的Java API并不能提供分布式锁的能力。为了解决这个问题就需要一种跨JVM的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题!

    二、分布式锁应该具备哪些条件

    在分析分布式锁的三种实现方式之前,先了解一下分布式锁应该具备哪些条件:

    1、在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行; 
    2、高可用的获取锁与释放锁; 
    3、高性能的获取锁与释放锁; 
    4、具备可重入特性; 
    5、具备锁失效机制,防止死锁; 
    6、具备非阻塞锁特性,即没有获取到锁将直接返回获取锁失败。

    三、分布式锁的三种实现方式
     

    目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题。分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance),最多只能同时满足两项。”所以,很多系统在设计之初就要对这三者做出取舍。在互联网领域的绝大多数的场景中,都需要牺牲强一致性来换取系统的高可用性,系统往往只需要保证“最终一致性”,只要这个最终时间是在用户可以接受的范围内即可。

     

    在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务、分布式锁等。有的时候,我们需要保证一个方法在同一时间内只能被同一个线程执行。

    基于数据库实现分布式锁; 
    基于缓存(Redis等)实现分布式锁; 
    基于Zookeeper实现分布式锁;

     

    1.基于数据库实现排他锁

    方案1

     表结构


    获取锁

     

    INSERT INTO method_lock (method_name, desc) VALUES ('methodName', 'methodName');

    对method_name做了唯一性约束,这里如果有多个请求同时提交到数据库的话,数据库会保证只有一个操作可以成功。

    方案2
    表结构

    DROP TABLE IF EXISTS `method_lock`;
    CREATE TABLE `method_lock` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
      `method_name` varchar(64) NOT NULL COMMENT '锁定的方法名',
      `state` tinyint NOT NULL COMMENT '1:未分配;2:已分配',
      `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      `version` int NOT NULL COMMENT '版本号',
      `PRIMARY KEY (`id`),
      UNIQUE KEY `uidx_method_name` (`method_name`) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='锁定中的方法';

    先获取锁的信息
         select id, method_name, state,version from method_lock where state=1 and method_name='methodName';

    占有锁
           update t_resoure set state=2, version=2, update_time=now() where method_name='methodName' and state=1 and version=2;

    如果没有更新影响到一行数据,则说明这个资源已经被别人占位了。

    缺点

        1、这把锁强依赖数据库的可用性,数据库是一个单点,一旦数据库挂掉,会导致业务系统不可用。
        2、这把锁没有失效时间,一旦解锁操作失败,就会导致锁记录一直在数据库中,其他线程无法再获得到锁。
        3、这把锁只能是非阻塞的,因为数据的insert操作,一旦插入失败就会直接报错。没有获得锁的线程并不会进入排队队列,要想再次获得锁就要再次触发获得锁操作。
        4、这把锁是非重入的,同一个线程在没有释放锁之前无法再次获得该锁。因为数据中数据已经存在了。

    解决方案
         1、数据库是单点?搞两个数据库,数据之前双向同步。一旦挂掉快速切换到备库上。
         2、没有失效时间?只要做一个定时任务,每隔一定时间把数据库中的超时数据清理一遍。
         3、非阻塞的?搞一个while循环,直到insert成功再返回成功。
         4、非重入的?在数据库表中加个字段,记录当前获得锁的机器的主机信息和线程信息,那么下次再获取锁的时候先查询数据库,如果当前机器的主机信息和线程信息在数据库可以查到的话,直接把锁分配给他就可以了。

     

     

    2.基于redis实现


    获取锁使用命令:

     

    SET resource_name my_random_value NX PX 30000

    方案

    try{
    	lock = redisTemplate.opsForValue().setIfAbsent(lockKey, LOCK);
    	logger.info("cancelCouponCode是否获取到锁:"+lock);
    	if (lock) {
    		// TODO
    		redisTemplate.expire(lockKey,1, TimeUnit.MINUTES); //成功设置过期时间
    		return res;
    	}else {
    		logger.info("cancelCouponCode没有获取到锁,不执行任务!");
    	}
    }finally{
    	if(lock){	
    		redisTemplate.delete(lockKey);
    		logger.info("cancelCouponCode任务结束,释放锁!");		
    	}else{
    		logger.info("cancelCouponCode没有获取到锁,无需释放锁!");
    	}
    }

     

    缺点:

    在这种场景(主从结构)中存在明显的竞态:
        客户端A从master获取到锁,
        在master将锁同步到slave之前,master宕掉了。
        slave节点被晋级为master节点,
        客户端B取得了同一个资源被客户端A已经获取到的另外一个锁。安全失效

     


    3.基于zookeeper实现
     

    让我们来回顾一下Zookeeper节点的概念:

     

     

    「每日分享」如何用Zookeeper实现分布式锁

     

     

    Zookeeper的数据存储结构就像一棵树,这棵树由节点组成,这种节点叫做Znode。

    Znode分为四种类型:

    1.持久节点 (PERSISTENT)

    默认的节点类型。创建节点的客户端与zookeeper断开连接后,该节点依旧存在 。

    2.持久节点顺序节点(PERSISTENT_SEQUENTIAL)

    所谓顺序节点,就是在创建节点时,Zookeeper根据创建的时间顺序给该节点名称进行编号:

    「每日分享」如何用Zookeeper实现分布式锁

     

    3.临时节点(EPHEMERAL)

    和持久节点相反,当创建节点的客户端与zookeeper断开连接后,临时节点会被删除:

    「每日分享」如何用Zookeeper实现分布式锁

     

    「每日分享」如何用Zookeeper实现分布式锁

     

    「每日分享」如何用Zookeeper实现分布式锁

     

    4.临时顺序节点(EPHEMERAL_SEQUENTIAL)

    顾名思义,临时顺序节点结合和临时节点和顺序节点的特点:在创建节点时,Zookeeper根据创建的时间顺序给该节点名称进行编号;当创建节点的客户端与zookeeper断开连接后,临时节点会被删除。

    Zookeeper分布式锁的原理

    Zookeeper分布式锁恰恰应用了临时顺序节点。具体如何实现呢?让我们来看一看详细步骤:

    获取锁

    首先,在Zookeeper当中创建一个持久节点ParentLock。当第一个客户端想要获得锁时,需要在ParentLock这个节点下面创建一个临时顺序节点 Lock1。

    「每日分享」如何用Zookeeper实现分布式锁

     

    之后,Client1查找ParentLock下面所有的临时顺序节点并排序,判断自己所创建的节点Lock1是不是顺序最靠前的一个。如果是第一个节点,则成功获得锁。

    「每日分享」如何用Zookeeper实现分布式锁

     

    这时候,如果再有一个客户端 Client2 前来获取锁,则在ParentLock下载再创建一个临时顺序节点Lock2。

    「每日分享」如何用Zookeeper实现分布式锁

     

    Client2查找ParentLock下面所有的临时顺序节点并排序,判断自己所创建的节点Lock2是不是顺序最靠前的一个,结果发现节点Lock2并不是最小的。

    于是,Client2向排序仅比它靠前的节点Lock1注册Watcher,用于监听Lock1节点是否存在。这意味着Client2抢锁失败,进入了等待状态。

    「每日分享」如何用Zookeeper实现分布式锁

     

    这时候,如果又有一个客户端Client3前来获取锁,则在ParentLock下载再创建一个临时顺序节点Lock3。

    「每日分享」如何用Zookeeper实现分布式锁

     

    Client3查找ParentLock下面所有的临时顺序节点并排序,判断自己所创建的节点Lock3是不是顺序最靠前的一个,结果同样发现节点Lock3并不是最小的。

    于是,Client3向排序仅比它靠前的节点Lock2注册Watcher,用于监听Lock2节点是否存在。这意味着Client3同样抢锁失败,进入了等待状态。

    「每日分享」如何用Zookeeper实现分布式锁

     

    这样一来,Client1得到了锁,Client2监听了Lock1,Client3监听了Lock2。这恰恰形成了一个等待队列,很像是Java当中ReentrantLock所依赖的

    释放锁

    释放锁分为两种情况:

    1.任务完成,客户端显示释放

    当任务完成时,Client1会显示调用删除节点Lock1的指令。

    「每日分享」如何用Zookeeper实现分布式锁

     

    2.任务执行过程中,客户端崩溃

    获得锁的Client1在任务执行过程中,如果Duang的一声崩溃,则会断开与Zookeeper服务端的链接。根据临时节点的特性,相关联的节点Lock1会随之自动删除。

    「每日分享」如何用Zookeeper实现分布式锁

     

    由于Client2一直监听着Lock1的存在状态,当Lock1节点被删除,Client2会立刻收到通知。这时候Client2会再次查询ParentLock下面的所有节点,确认自己创建的节点Lock2是不是目前最小的节点。如果是最小,则Client2顺理成章获得了锁。

    「每日分享」如何用Zookeeper实现分布式锁

     

    同理,如果Client2也因为任务完成或者节点崩溃而删除了节点Lock2,那么Client3就会接到通知。

    「每日分享」如何用Zookeeper实现分布式锁

     

    最终,Client3成功得到了锁。

    方案:

     

    可以直接使用zookeeper第三方库Curator客户端,这个客户端中封装了一个可重入的锁服务。

     

    Curator提供的InterProcessMutex是分布式锁的实现。acquire方法用户获取锁,release方法用于释放锁。

    https://github.com/apache/curator/

     

    缺点:

        性能上可能并没有缓存服务那么高。因为每次在创建锁和释放锁的过程中,都要动态创建、销毁瞬时节点来实现锁功能。ZK中创建和删除节点只能通过Leader服务器来执行,然后将数据同不到所有的Follower机器上。

     

        其实,使用Zookeeper也有可能带来并发问题,只是并不常见而已。考虑这样的情况,由于网络抖动,客户端可ZK集群的session连接断了,那么zk以为客户端挂了,就会删除临时节点,这时候其他客户端就可以获取到分布式锁了。就可能产生并发问题。这个问题不常见是因为zk有重试机制,一旦zk集群检测不到客户端的心跳,就会重试,Curator客户端支持多种重试策略。多次重试之后还不行的话才会删除临时节点。(所以,选择一个合适的重试策略也比较重要,要在锁的粒度和并发之间找一个平衡。)

     

    4.总结

    下面的表格总结了Zookeeper和Redis分布式锁的优缺点:

     

     

    三种方案的比较

     

     

    上面几种方式,哪种方式都无法做到完美。就像CAP一样,在复杂性、可靠性、性能等方面无法同时满足,所以,根据不同的应用场景选择最适合自己的才是王道。

    从理解的难易程度角度(从低到高)

    数据库 > 缓存 > Zookeeper

    从实现的复杂性角度(从低到高)

    Zookeeper >= 缓存 > 数据库

    从性能角度(从高到低)

    缓存 > Zookeeper >= 数据库

    从可靠性角度(从高到低)

    Zookeeper > 缓存 > 数据库

     

     

     


    Refrence:
    https://www.cnblogs.com/austinspark-jessylu/p/8043726.html
    https://www.toutiao.com/a6558681932786303501/?tt_from=weixin&utm_campaign=client_share×tamp=1528800534&app=news_article&utm_source=weixin&iid=34667892860&utm_medium=toutiao_ios&wxshare_count=1

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • Java基于Redis实现分布式

    千次阅读 多人点赞 2019-07-31 19:12:35
    分布式锁可以基于很多种方式实现,比如zookeeper、redis...。不管哪种方式,他的基本原理是不变的:用一个状态值表示锁,对锁的占用和释放通过状态值来标识。 一、为什么Redis可以方便地实现分布式锁 1、Redis为...

    分布式锁可以基于很多种方式实现,比如zookeeper、redis...。不管哪种方式,他的基本原理是不变的:用一个状态值表示锁,对锁的占用和释放通过状态值来标识。

    一、为什么Redis可以方便地实现分布式锁

    1、Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对Redis的连接并不存在竞争关系。

    2、Redis的SETNX命令可以方便的实现分布式锁。

    setNX(SET if Not eXists)

    语法:SETNX key value

    返回值:设置成功,返回 1 ;设置失败,返回 0 。

    当且仅当 key 不存在时将 key 的值设为 value,并返回1;若给定的 key 已经存在,则 SETNX 不做任何动作,并返回0。

    综上所述,可以通过setnx的返回值来判断是否获取到锁,并且不用担心并发访问的问题,因为Redis是单线程的,所以如果返回1则获取到锁,返回0则没获取到。当业务操作执行完后,一定要释放锁,释放锁的逻辑很简单,就是把之前设置的key删除掉即可,这样下次又可以通过setnx该key获取到锁了。

    二、分布式锁实现

    我们已经知道可以通过Redis自带的函数setNX来实现分布式锁,具体实现步骤如下。

    我在一台CentOS7的linux虚拟机中安装了Redis服务,ip地址为:192.168.246.130,服务端口为:6379。

    下面是java通过redis实现分布式锁的例子:

    import redis.clients.jedis.Jedis;
    public class RedisLock {
    	//锁的key
    	private static final String key = "DistributedRedisLock";
    	private static Integer count = 0;
    	public static void main(String[] args) {
    		for(int i=0;i<1000;i++){
    			new Thread(new Runnable() {
    				@Override
    				public void run() {
    					//获取Redis连接
    					Jedis jedis = new Jedis("192.168.246.130", 6379);
    					try{
    						while(true){
    							//获取锁
    							if(jedis.setnx(key, Thread.currentThread().getName()) == 1){
    								try{
    									System.out.println("线程("+Thread.currentThread().getName()+")获取到锁,开始执行操作");
    									count++;
    									System.out.println(count);
    									break;
    								}finally{
    									System.out.println("操作执行完成,释放锁");
    									//操作执行完一定要释放锁,所以在finally块中执行
    									jedis.del(key);
    								}
    							}else{
    								//返回的不是1,说明已经有某个线程获取到了锁
    								try {
    									//等待100毫秒之后重试
    									Thread.sleep(100l);
    								} catch (InterruptedException e) {
    									e.printStackTrace();
    								}
    							}
    						}
    					}catch(Exception e){
    						e.printStackTrace();
    					}finally{
    						//释放Redis连接
    						jedis.disconnect();
    					}
    				}
    			}).start();
    		}
    	}
    }

     

    上述代码的输出结果为:

    线程(Thread-320)获取到锁,开始执行操作

    1

    操作执行完成,释放锁

    线程(Thread-463)获取到锁,开始执行操作

    2

    操作执行完成,释放锁

    线程(Thread-997)获取到锁,开始执行操作

    3

    操作执行完成,释放锁

    ...

    线程(Thread-409)获取到锁,开始执行操作

    998

    操作执行完成,释放锁

    线程(Thread-742)获取到锁,开始执行操作

    999

    操作执行完成,释放锁

    线程(Thread-286)获取到锁,开始执行操作

    1000

    操作执行完成,释放锁

    上述代码虽然是在单应用多线程情况下测试的,但即便是在分布式环境下多应用多线程去获取锁,结果依然是正确的。

    三、解决死锁问题

    之前的例子代码只是测试代码,只是为了说明原理,例子本身很简单,所以有一些考虑不周的地方。比如当获取到锁之后在业务操作执行过程中发生了环境问题导致断开了和Redis的连接,那就无法在finally块中释放锁,导致其他等待获取锁的线程无限等待下去,也就是发生了死锁现象。

    解决方式:

    可以在Redis中给锁设置一个过期时间,这样即便无法释放锁,锁也能在一段时间后自动释放。

    代码上只需要在获取到锁之后在try语句块中加入如下代码:

    jedis.expire(key, 10); //这里给锁设置10秒的过期时间

    更妥善的解决方式:

    第一个解决方式并不是很好,因为当业务操作处理时间很长,超过了设置的过期时间,那锁就自动释放了,然后再执行finally块中释放锁的操作时,这个锁可能已经被其他线程所持有,会导致把其他线程持有的锁给释放了,从而导致并发问题。所以更妥善一点的方式是在释放锁时判断一下锁是否已经过期,如果已经过期就不用再释放了。

    代码上把获取到锁之后的操作改为如下代码:

    long start = System.currentTimeMillis(); //获取起始时间毫秒数
    try{
      jedis.expire(key, 10);
      ...
    }finally{
      ...
      if(System.currentTimeMillis() < start+10*1000){
         //如果之前设置的锁还未过期,则释放掉
         jedis.del(key);
      }
    }

     

    展开全文
  • JAVA 分布式 - 分布式介绍

    万次阅读 多人点赞 2018-11-22 22:44:26
    什么是分布式系统? 要理解分布式系统,主要需要明白一下2个方面: 1.分布式系统一定是由多个节点组成的系统。 其中,节点指的是计算机服务器,而且这些节点一般不是孤立的,而是互通的。 2.这些连通的节点上部署了...

    什么是分布式系统?

    要理解分布式系统,主要需要明白一下2个方面:

    • 1.分布式系统一定是由多个节点组成的系统。
      其中,节点指的是计算机服务器,而且这些节点一般不是孤立的,而是互通的。
    • 2.这些连通的节点上部署了我们的节点,并且相互的操作会有协同。

    分布式系统对于用户而言,他们面对的就是一个服务器,提供用户需要的服务而已,而实际上这些服务是通过背后的众多服务器组成的一个分布式系统,因此分布式系统看起来像是一个超级计算机一样。

    例如淘宝,平时大家都会使用,它本身就是一个分布式系统,我们通过浏览器访问淘宝网站时,这个请求的背后就是一个庞大的分布式系统在为我们提供服务,整个系统中有的负责请求处理,有的负责存储,有的负责计算,最终他们相互协调把最后的结果返回并呈现给用户。

    在这里插入图片描述

    使用分布式系统主要有特点:

        1.增大系统容量。 我们的业务量越来越大,而要能应对越来越大的业务量,一台机器的性能已经无法满足了,我们需要多台机器才能应对大规模的应用场景。所以,我们需要垂直或是水平拆分业务系统,让其变成一个分布式的架构。

        2.加强系统可用。 我们的业务越来越关键,需要提高整个系统架构的可用性,这就意味着架构中不能存在单点故障。这样,整个系统不会因为一台机器出故障而导致整体不可用。所以,需要通过分布式架构来冗余系统以消除单点故障,从而提高系统的可用性。

        3.因为模块化,所以 系统模块重用度更高

        4.因为软件服务模块被拆分,开发和发布速度可以并行而变得更快

        5.系统扩展性更高

        6.团队协作流程也会得到改善

    分布式系统的类型有三种:

        1.分布式处理,但只有一个总数据库,没有局部数据库

        2.分层式处理,每一层都有自己的数据库

        3.充分分散的分布式网络,没有中央控制部分,各节点之间的联系方式又可以有多种,如松散的联接,紧密的联接,动态的联接,广播通知式的联接等

    什么是 JAVA 分布式应用?

    一个大型的系统往往被分为几个子系统来做,一个子系统可以部署在一台机器的多个 JVM 上,也可以部署在多台机器上。但是每一个系统不是独立的,不是完全独立的。需要相互通信,共同实现业务功能。

    一句话来说:分布式就是通过计算机网络将后端工作分布到多台主机上,多个主机一起协同完成工作。

    实现分布式主要的方式

    分布式应用用到的技术: 网络通信,基于消息方式的系统间通信和基于远程调用的系统间通信。

    缺点: 就是会增加技术的复杂度。
    基于消息的系统通信方式,主要是利用的网络协议,比如 TCP/IP 协议。
    系统间的通信还需要对数据进行处理,比如同步 IO 和异步 IO。
    远程调用实现系统间的通信:通过调用本地的java接口的方法来透明的调用远程java的实现。具体的细节有框架来实现。

    在这里插入图片描述

    基于Java自身技术实现消息方式的系统间通信:
    基于Java自身包实现消息方式的系统间通信的方式有:
    TCP/IP+BIO、TCP/IP+NIO、UDP/IP+BIO以及UDP/IP+NIO 4种方式

    TCP/IP+BIO 在 Java 中可基于 Socket、ServerSocket 来实现 TCP/IP+BIO 的系统间通信。

    Socket 主要用于实现建立连接及网络 IO 的操作,ServerSocket 主要用于实现服务器端端口的监听及 Socket 对象的获取。

    多个客户端访问服务器端的情况下,会遇到两个问题:建立多个 socket 的,占用过多的本地资源,服务器端要承受巨大的来访量;创建过多的 socket,占用过多的资源,影响性能。

    通常解决这种问题的办法是,使用 连接池,既能限制连接的数量,又能避免创建的过程,可以很大的提高性的问题。缺点就是竞争量大的时候造成激烈的竞争和等待。需要注意的是,要设置超时时间,如果不这样的话,会造成无限制的等待。

    为了解决这个问题,采用一连接一线程的方式,同时也会带来副作用,内存占用过多。
    TCP/IP 异步通信: JAVA NIO 通道技术实现。

    JAVA 分布式知识体系介绍

    附上某 JAVA 分布式学习目录,帮助了解分布式都有哪些东西

    第 1 章 分布式 Java应用
    1.1 基于消息方式实现系统间的通信
        1.1.1 基于 Java自身技术实现消息方式的系统间通信
        1.1.2 基于开源框架实现消息方式的系统间通信
    1.2 基于远程调用方式实现系统间的通信
        1.2.1 基于 Java自身技术实现远程调用方式的系统间通信
        1.2.2 基于开源框架实现远程调用方式的系统间通信

    第 2 章 大型分布式 Java应用与 SOA
    2.1 基于 SCA实现 SOA平台
    2.2 基于 ESB实现 SOA平台
    2.3 基于 Tuscany实现 SOA平台
    2.4 基于 Mule 实现 SOA平台

    第 3 章 深入理解 JVM
    3.1 Java代码的执行机制
        3.1.1 Java源码编译机制
        3.1.2 类加载机制
        3.1.3 类执行机制
    3.2 JVM内存管理
        3.2.1 内存空间
        3.2.2 内存分配
        3.2.3 内存回收
        3.2.4 JVM 内存状况查看方法和分析工具
    3.3 JVM线程资源同步及交互机制
        3.3.1 线程资源同步机制
        3.3.2 线程交互机制
        3.3.3 线程状态及分析

    第 4 章 分布式应用与 SunJDK类库
    4.1 集合包
        4.1.1 ArrayList
        4.1.2 LinkedList
        4.1.3 Vector
        4.1.4 Stack
        4.1.5 HashSet
        4.1.6 TreeSet
        4.1.7 HashMap
        4.1.8 TreeMap
        4.1.9 性能测试
        4.1.10 小结
    4.2 并发包( java.util.concurrent )
        4.2.1 ConcurrentHashMap
        4.2.2 CopyOnWriteArrayList
        4.2.3 CopyOnWriteArraySet
        4.2.4 ArrayBlockingQueue
        4.2.5 AtomicInteger
        4.2.6 ThreadPoolExecutor
        4.2.7 Executors
        4.2.8 FutureTask
        4.2.9 Semaphore
        4.2.10 CountDownLatch
        4.2.11 CyclicBarrier
        4.2.12 ReentrantLock
        4.2.13 Condition
        4.2.14 ReentrantReadWriteLock
    4.3 序列化 /反序列化
        4.3.1 序列化
        4.3.2 反序列化

    第 5 章 性能调优
    5.1 寻找性能瓶颈
        5.1.1 CPU消耗分析
        5.1.2 文件 IO 消耗分析
        5.1.3 网络 IO 消耗分析
        5.1.4 内存消耗分析
        5.1.5 程序执行慢原因分析
    5.2 调优
        5.2.1 JVM 调优
        5.2.2 程序调优
        5.2.3 对于资源消耗不多,但程序执行慢的情况

    第 6 章 构建高可用的系统
    6.1 避免系统中出现单点
        6.1.1 负载均衡技术
        6.1.2 热备
    6.2 提高应用自身的可用性
        6.2.1 尽可能地避免故障
        6.2.2 及时发现故障
        6.2.3 及时处理故障
        6.2.4 访问量及数据量不断上涨的应对策略

    第 7 章 构建可伸缩的系统
    7.1 垂直伸缩
        7.1.1 支撑高访问量
        7.1.2 支撑大数据量
        7.1.3 提升计算能力
    7.2 水平伸缩
        7.2.1 支撑高访问量
        7.2.2 支撑大数据量
        7.2.3 提升计算能力

    展开全文
  • 分布式架构知识梳理

    万次阅读 多人点赞 2019-04-21 18:55:01
    1、何为分布式何为微服务? 2、为什么需要分布式? 3、分布式核心理论基础,节点、网络、时间、顺序,一致性? 4、分布式是系统有哪些设计模式? 5、分布式有哪些类型? 6、如何实现...
  • 分布式缓存 分布式缓存出于如下考虑:首先是缓存本身的水平线性扩展问题,其次是缓存大并发下本身的性能问题,再次避免缓存的单点故障问题(多副本和副本一致性)。 分布式缓存的核心技术包括首先是内存本身的管理...
  • Java笔试面试-Java 分布式框架面试总结

    万次阅读 多人点赞 2019-09-26 15:24:23
    答:ZooKeeper 是一个开源的分布式应用程序协调服务,是一个典型的分布式数据一致性解决方案。设计目的是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的系统,并以一系列简单易用的原子操作...
  • springcloud分布式事务处理方案

    万次阅读 热门讨论 2018-08-11 17:04:54
    笔者在公司最近的一个项目采用springcloud框架搭建微服务架构,这势必会引发分布式事务处理的思考,目前处理分布式主流方案tcc及消息的最终一致性;今天笔者集成github上较为流行的tx-lcn分布式处理框架,它是基于...
  • 本篇文章主要介绍基于Redis的分布式锁实现到底是怎么一回事,其中参考了许多大佬写的文章,算是对分布式锁做一个总结 分布式锁概览 在多线程的环境下,为了保证一个代码块在同一时间只能由一个线程访问,Java中...
  • 经过一段时间的分布式学习,自己在此过程中受益匪浅。几点感触总结如下: 1.在做较大或生疏系统的时候,一定先要将系统的架构图设计出来,架构图要力求做到尽可能的详尽(包括其用到的各种技术,数据传输方式等等)...
  • 如何用Redlock实现分布式

    万次阅读 热门讨论 2017-04-20 21:16:16
    之前写过一篇文章《如何在springcloud分布式系统中实现分布式锁?》,由于自己仅仅是阅读了相关的书籍,和查阅了相关的资料,就认为那样的是可行的。那篇文章实现的大概思路是用setNx命令和setEx配合使用。 setNx是...
  • 分布式存储

    2018-11-23 14:59:01
    分布式存储架构分析,分布式存储架构分析,分布式存储架构分析,
  • 如何在springcloud分布式系统中实现分布式锁?

    万次阅读 多人点赞 2017-04-03 11:01:42
    最近在看分布式锁的资料,看了 Josial L的《Redis in Action》的分布式锁的章节。实现思路是利用springcloud结合redis实现分布式锁。一、简介一般来说,对数据进行加锁时,程序先通过acquire获取锁来对数据进行排他...
  • 分布式-分布式

    万次阅读 2018-08-08 16:20:48
    一、分布式锁的几种实现方式 1.1 分布式锁的三种实现方式 1.2 使用分布式锁要满足的条件 二、基于数据库实现分布式锁 2.1 基于数据库表 2.2 基于数据库排他锁 2.3 总结 2.3.1数据库实现分布式锁的优点 2.3.2 ...
  • 分布式

    万次阅读 2020-05-09 15:44:37
    分布式锁的介绍和实现
  • 一分钟弄懂什么是分布式和微服务

    万次阅读 多人点赞 2018-10-18 21:33:31
    简单的说,微服务是架构设计方式,分布式是系统部署方式,两者概念不同 微服务是啥?这里不引用书本上的复杂概论了,简单来说微服务就是很小的服务,小到一个服务只对应一个单一的功能,只做一件事。这个服务可以...
  • 目录 1.前序 2.过程 2.1 TX-LCN框架介绍 2.2 环境搭建 2.2.1 开发环境 ...现如今,分布式框架纵横的大潮下,对于分布式的相关应用和技术的了解和使用也是必不可少的。最显著的几个技术点,我...
  • 分布式 实战(干货)

    万次阅读 多人点赞 2018-03-04 21:14:14
    分布式 实战(干货)更多干货分布式事务综述分布式事务处理一分布式事务二分布式事务处理三分布式事务四_基于可靠消息的最终一致性分布式事务五_基于可靠消息的最终一致性_异常流程分布式事务六_常规MQ队列分布式...
  • 分布式系统与分布式锁简析

    万次阅读 2019-04-19 09:44:09
    分布式系统涉及到很多的技术、理论与协议,很多人也说,分布式系统是“入门容易,深入难”,有一些人简历上写着熟悉分布式系统,但是其实只能算是管中窥豹,只见得其中一斑。 回到顶部 那么究竟什么是分布式系统...
  • 分布式事务

    万次阅读 2020-09-05 10:24:23
    【1】分布式事务框架 【2】分布式事务 【3】tx-lcn 【1】分布式事务框架 TransactionsEssentials(atomikos免费版) tcc-transaction ByteTCC hmily tx-lcn GTS EasyTransaction 【2】分布式事务 1> TCC...
  • 事务 | Spring Cloud 分布式事务管理 LCN、GTX、ByteTCC

    万次阅读 多人点赞 2018-03-18 21:03:04
    事务 | Spring Cloud 分布式事务管理 LCN、GTX、ByteTCC 在微服务如火如荼的情况下,越来越多的项目开始尝试改造成微服务架构,微服务即带来了项目开发的方便性,又提高了运维难度以及网络不可靠的概率. Spring ...
  • redis分布式

    万次阅读 2020-08-13 18:08:53
    一、分布式锁实现方式 1.数据库单独建表维护,使用的是数据库乐观锁 2.redis的分布式锁 3.zookeeper的分布式锁,zookeeper机制规定,同一个目录下只能有一个唯一的文件名, 借助zookeeper的临时节点实现 二、Redis的...
  • 注解实现基于redis的分布式

    万次阅读 2020-11-18 10:06:41
    分布式系统开发中常常用到分布式锁,比如防止多个用户同时预订同一个商品,传统的synchronized就无法实现了,而基于数据库的乐观锁实现又可能会对数据库产生较大的压力。而分布式锁相对较轻量,对性能影响也较小。...
  • 分布式程序

    千次阅读 2020-09-04 23:32:39
    分布式程序唯一连接通道是redis
  • 分布式事务和分布式

    千次阅读 2019-09-16 12:29:58
    为什么要使用分布式事务和分布式锁? 我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务、分布式锁等。 分布式事务的解决方案 基于可靠消息的最终一致性方案 可独立部署、独立伸缩(扩展性...
  • 分布式数据库和我们经常用的传统的关系型数据库有什么区别,比如oracle,mysql,sql server,首先看下定义: 分布式数据库定义:分布式数据库系统通常使用较小的计算机系统,每台计算机可单独放在一个地方,每台...
  • Redis分布式锁的正确实现方式(Java版)

    万次阅读 多人点赞 2019-05-19 22:57:03
    ... 一、什么是分布式锁? 要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁、进程锁。 线程锁:主要用来给方法、代码块加锁。当某个方法或代码使用锁,...
  • Redis分布式

    万次阅读 2020-03-24 01:02:25
    Redis分布式锁 介绍 随着微服务的兴起,比如Spring Cloud、Dubbo的等分布式解决方案地兴起,java的jvm锁某些场景下已经不在适用。特定的场景下,往往依靠分布式锁,常见的分布式锁实现方式有Redis分布式锁以及...
  • 分布式存储与分布式计算

    千次阅读 多人点赞 2019-03-19 10:04:53
    目录 1、从一个新闻门户网站...现在很多同学经常会看到一些名词,比如分布式服务框架,分布式系统,分布式存储系统,分布式消息系统。 但是有些经验尚浅的同学,可能都很容易被这些名词给搞晕。所以这篇文章就...

空空如也

1 2 3 4 5 ... 20
收藏数 426,861
精华内容 170,744
关键字:

分布式