
分布式
文章平均质量分 60
用心去追梦
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
分布式事务——消息最终一致性方案
前言分布式事务一直是服务化拆分后一个绕不开的话题,原来在单体应用中执行的多个逻辑操作,现在被拆分成了多个服务之间的远程调用。虽然服务化为我们的系统带来了水平伸缩的能力,然而随之而来挑战就是分布式事务问题,多个服务之间使用自己单独维护的数据库,它们彼此之间不在同一个事务中,假如A执行成功了,B执行却失败了,而A的事务此时已经提交,无法回滚,那么最终就会导致两边数据不一致性的问题;尽管很早之前就有基于两阶段提交的XA分布式事务,但是这类方案因为需要资源的全局锁定,导致性能极差;因此后面就逐渐衍生出了消息最终一原创 2021-10-14 23:21:31 · 333 阅读 · 1 评论 -
Java7之线程池ForkJoinPool
许多情况下,在一个程序中使用多线程是有益处的,可以大大提高程序的效率,多线程主要有以下3个优点1,资源利用率更好2,程序设计在某些情况下更简单3,程序响应更快。当然凡事有利就有弊,多线程也会使程序的开发,维护及调试更加复杂,当然如果我们能够扬长避短,在正确的场合下使用多线程,那么它将成为我们程序中开发的利器。Java一直以来,对多线程的开发支持比较良好,特别在JDK5,6后引入的java.util.concurrent包,使用多线程的开发变的更加容易,这个包里面大部分的API都是更进一步的封装,作为开发者原创 2021-08-12 14:06:42 · 235 阅读 · 0 评论 -
注册中心ZooKeeper、Eureka、Consul 、Nacos
前言服务注册中心本质上是为了解耦服务提供者和服务消费者。对于任何一个微服务,原则上都应存在或者支持多个提供者,这是由微服务的分布式属性决定的。更进一步,为了支持弹性扩缩容特性,一个微服务的提供者的数量和分布往往是动态变化的,也是无法预先确定的。因此,原本在单体应用阶段常用的静态LB机制就不再适用了,需要引入额外的组件来管理微服务提供者的注册与发现,而这个组件就是服务注册中心。CAP理论CAP理论是分布式架构中重要理论一致性(Consistency) (所有节点在同一时间具有相同的数据)可用性(Av原创 2021-08-08 23:03:05 · 254 阅读 · 0 评论 -
SpringCloud-容错处理Hystrix熔断器
前言:微服务架构应用的特点就是多服务,而服务层之间通过网络进行通信,从而支撑起整个应用系统,所以,各个微服务之间不可避免的存在耦合依赖关系。但任何的服务应用实例都不可能永远的健康或网络不可能永远的都相安无事,所以一旦某个服务或局部业务发生了故障,会导致系统的不可用,我们知道当故障累积到一定程度就会造成系统层面的灾害,也就是级联故障,也叫雪崩效应,所以微服务需要在故障累计到上限之前阻止或疏通这些故障以保证系统的稳固安全,在市面上已经有很多这样的框架来解决这样的问题,如Twitter的Finagle、Netfl原创 2021-08-08 22:41:02 · 149 阅读 · 0 评论 -
腾讯面试题Java 并发包之线程池综述
Java 并发包之线程池综述■ 线程池的创建在Java中,您可以通过调整-Xss参数来调节每个线程栈的大小(64bit系统默认1024KB),当减小该值时意味着可以创建更多的线程数,但问题是JVM资源是有限的,线程不能无限创建!从笔者开发经验来看,线程池应该是并发包中使用频率和运用场景最多的并发框架,几乎所有并发/异步执行任务的需求都需要用到线程池,线程复用,以内部线程池的形式对外提供管理任务执行,线程调度,线程池管理等等服务。合理的使用线程池可以带来如下三个好处: 1.降低资源消耗:通过重用原创 2021-08-07 10:51:12 · 169 阅读 · 0 评论 -
分布式一致性算法
为什么需要一致性数据不能存在单个节点(主机)上,否则可能出现单点故障。多个节点(主机)需要保证具有相同的数据。一致性算法就是为了解决上面两个问题。一致性算法的定义一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中数据的值是一致的。一致性的分类强一致性说明:保证系统改变提交以后立即改变集群的状态。模型:PaxosRaft(muti-paxos)ZAB(muti-paxos)弱一致性说明:也叫最终一致性,系统不保证改变提交以后立即改变集群的状态,但是随着时间的推移最终状态是原创 2021-08-04 21:46:13 · 291 阅读 · 0 评论 -
微服务如何解决分布式事务
在系统变的复杂后,分布式、微服务等架构技术,就要考虑到应用在系统中了。尤其数据量大了后,就需要对数据库进行拆分。如:注册的用户数据,量大了后,就需要考虑分库分表一旦数据库进行了分拆,那就出现很多头疼的问题,其中之一就是事务问题。那我们就来看看问题是怎么出现的?进行数据拆分后,就类似上面的架构。上图中我们就拿用户的数据进行举例,用户量一旦几千万时,就需要进行分库分表;上图就分了3个库,每个库都保证了高可用。这样的架构设计,会遇到事务问题,我们来看看具体的业务场景:用户A转账100元给用户B,这个业原创 2021-08-04 21:34:33 · 319 阅读 · 0 评论 -
什么是分布式事务以及有哪些解决方案?
1、什么是分布式事务?答:指一次大的操作由不同的小操作组成的,这些小的操作分布在不同的服务器上,分布式事务需要保证这些小操作要么全部成功,要么全部失败。从本质上来说,分布式事务就是为了保证不同数据库的数据一致性。2、分布式事务产生的原因?2.1 数据库分库分表 当数据库单表数据达到千万级别,就要考虑分库分表,那么就会从原来的一个数据库变成多个数据库。例如如果一个操作即操作了01库,又操作了02库,而且又要保证数据的一致性,那么就要用到分布式事务。2.2 应用SOA化 所谓的SOA化,就是原创 2021-08-04 21:26:58 · 919 阅读 · 0 评论 -
分布式系统互斥性与幂等性问题的分析与解决
随着互联网信息技术的飞速发展,数据量不断增大,业务逻辑也日趋复杂,对系统的高并发访问、海量数据处理的场景也越来越多。如何用较低成本实现系统的高可用、易伸缩、可扩展等目标就显得越发重要。为了解决这一系列问题,系统架构也在不断演进。传统的集中式系统已经逐渐无法满足要求,分布式系统被使用在更多的场景中。分布式系统由独立的服务器通过网络松散耦合组成。在这个系统中每个服务器都是一台独立的主机,服务器之间通过内部网络连接。分布式系统有以下几个特点:可扩展性:可通过横向水平扩展提高系统的性能和吞吐量。高可靠性:高容原创 2021-07-28 21:35:21 · 131 阅读 · 0 评论 -
幂等性问题剖析
所谓幂等,简单地说,就是对接口的多次调用所产生的结果和调用一次是一致的。扩展一下,这里的接口,可以理解为对外发布的HTTP接口或者Thrift接口,也可以是接收消息的内部接口,甚至是一个内部方法或操作。数学上的定义:f(f(x)) = f(x)。x被函数f作用一次和作用无限次的结果是一样的。幂等性应用在软件系统中,我把它简单定义为:某个函数或者某个接口使用相同参数调用一次或者无限次,其造成的后果是一样的,在实际应用中一般针对于接口进行幂等性设计。举个栗子,在系统中,调用方A调用系统B的接口进行用户的扣费操原创 2021-07-28 21:24:46 · 339 阅读 · 0 评论 -
什么是分布式系统中的幂等性
最近很多人都在谈论幂等性,好吧,这回我也来聊聊这个话题,光看着俩字,一开始的确有点一头雾水,语文不好嘛,词太专业嘛,对吧现如今我们的系统大多拆分为分布式SOA,或者微服务,一套系统中包含了多个子系统服务,而一个子系统服务往往会去调用另一个服务,而服务调用服务无非就是使用RPC通信或者restful,既然是通信,那么就有可能再服务器处理完毕后返回结果的时候挂掉,这个时候用户端发现很久没有反应,那么就会多次点击按钮,这样请求有多次,那么处理数据的结果是否要统一呢?那是肯定的!尤其再支付场景。幂等性:就是用户原创 2021-07-28 21:11:59 · 125 阅读 · 0 评论 -
wait/notify/notifyAll在Object类中
wait/notify/notifyAll在Object类中因为我们在使用synchronized锁 对象锁可以是任意对象,所以wait/notify/notifyAll需要放在Object类中。wait/notify/简单的用法public class Thread03 extends Thread {@Overridepublic void run() {try {synchronized (this) {System.out.println(Thread.currentThread()原创 2021-07-02 11:39:04 · 321 阅读 · 0 评论 -
等待/通知机制
等待/通知的相关方法是任意Java对象都具备的,因为这些方法被定义在所有对象的超类java.lang.Object上,方法如下:1.notify() :通知一个在对象上等待的线程,使其从main()方法返回,而返回的前提是该线程获取到了对象的锁2.notifyAll():通知所有等待在该对象的线程3.wait():调用该方法的线程进入WAITING状态,只有等待其他线程的通知或者被中断,才会返回。需要注意调用wait()方法后,会释放对象的锁 。Exception in thread “Thread原创 2021-07-01 18:14:01 · 101 阅读 · 0 评论 -
多线程综合小案例
手写Callable与FutureTask模式可以基于Callable+FutureTask可以实现异步线程执行 带返回结果。LockSupport实现方式定义Callable+FutureTaskpublic interface MayiktCallable {V call();}public class MayiktFutureTask implements Runnable {private MayiktCallable mayiktCallable;private Thread c原创 2021-07-01 18:12:38 · 100 阅读 · 0 评论 -
Lock锁的基本使用
在jdk1.5后新增的ReentrantLock类同样可达到此效果,且在使用上比synchronized更加灵活相关API:使用ReentrantLock实现同步lock()方法:上锁unlock()方法:释放锁使用Condition实现等待/通知 类似于 wait()和notify()及notifyAll()Lock锁底层基于AQS实现,需要自己封装实现自旋锁。Synchronized —属于JDK 关键字 底层属于 C++虚拟机底层实现Lock锁底层基于AQS实现-- 变为重量级S原创 2021-07-01 18:11:04 · 3492 阅读 · 0 评论 -
正确的线程中止-标志位
在上方代码逻辑中,增加一个判断,用来控制线程执行的中止。public class Thread07 extends Thread {private volatile boolean isFlag = true;@Overridepublic void run() { while (isFlag) { }}public static void main(String[] args) { Thread07 thread07 = new Thread07(); th原创 2021-07-01 18:09:10 · 201 阅读 · 0 评论 -
如何安全的停止一个线程
调用stop方法Stop:中止线程,并且清除监控器锁的信息,但是可能导致 线程安全问题,JDK不建议用。 Destroy: JDK未实现该方法。Interrupt(线程中止)Interrupt 打断正在运行或者正在阻塞的线程。1.如果目标线程在调用Object class的wait()、wait(long)或wait(long, int)方法、join()、join(long, int)或sleep(long, int)方法时被阻塞,那么Interrupt会生效,该线程的中断状态将被清除,抛出Int原创 2021-07-01 18:05:57 · 452 阅读 · 0 评论 -
sleep防止CPU占用100%
sleep(long millis) 线程睡眠 millis 毫秒sleep(long millis, int nanos) 线程睡眠 millis 毫秒 + nanos 纳秒使用sleep方法避免cpu空转 防止cpu占用100%public static void main(String[] args) {new Thread(() -> {while (true) {try {Thread.sleep(30);} catch (InterruptedException e)原创 2021-07-01 18:04:55 · 952 阅读 · 0 评论 -
多线程优先级
1.在java语言中,每个线程都有一个优先级,当线程调控器有机会选择新的线程时,线程的优先级越高越有可能先被选择执行,线程的优先级可以设置1-10,数字越大代表优先级越高注意:Oracle为Linux提供的java虚拟机中,线程的优先级将被忽略,即所有线程具有相同的优先级。所以,不要过度依赖优先级。2.线程的优先级用数字来表示,默认范围是1到10,即Thread.MIN_PRIORITY到Thread.MAX_PRIORTY.一个线程的默认优先级是5,即Thread.NORM_PRIORTY3.如果原创 2021-07-01 18:03:36 · 544 阅读 · 0 评论 -
多线程yield
主动释放cpu执行权1.多线程yield 会让线程从运行状态进入到就绪状态,让后调度执行其他线程。2.具体的实现依赖于底层操作系统的任务调度器public Thread02(String name) {super(name);}@Overridepublic void run() {for (int i = 0; i < 50; i++) {if (i == 30) {System.out.println(Thread.currentThread().getName() + “,释原创 2021-07-01 18:02:07 · 218 阅读 · 0 评论 -
守护线程与用户线程
java中线程分为两种类型:用户线程和守护线程。通过Thread.setDaemon(false)设置为用户线程;通过Thread.setDaemon(true)设置为守护线程。如果不设置次属性,默认为用户线程。1.守护线程是依赖于用户线程,用户线程退出了,守护线程也就会退出,典型的守护线程如垃圾回收线程。2.用户线程是独立存在的,不会因为其他用户线程退出而退出。public class Thread01 {public static void main(String[] args) {Threa原创 2021-07-01 18:00:20 · 111 阅读 · 0 评论 -
多线程七种执行的状态
初始化状态就绪状态运行状态死亡状态阻塞状态超时等待等待状态start():调用start()方法会使得该线程开始执行,正确启动线程的方式。wait():调用wait()方法,进入等待状态,释放资源,让出CPU。需要在同步快中调用。sleep():调用sleep()方法,进入超时等待,不释放资源,让出CPUstop():调用sleep()方法,线程停止,线程不安全,不释放锁导致死锁,过时。join():调用sleep()方法,线程是同步,它可以使得线程之间的并行执行变为串行执行。yie原创 2021-07-01 17:58:06 · 279 阅读 · 0 评论 -
分布式服务追踪与调用链系统
如何构建新一代SkyWalking服务追踪框架1.生产环境调用接口报错了,如何定位?2.微服务服务追踪框架构设计原理3.Sleuth+zipkin实现分布式服务追踪4.SkyWalking超强大实现分布式服务追踪5.SkyWalking架构设计原理产生的背景在微服务系统中,随着业务的发展,系统会变得越来越大,那么各个服务之间的调用关系也就变得越来越复杂。一个 HTTP 请求会调用多个不同的微服务来处理返回最后的结果,在这个调用过程中,可能会因为某个服务出现网络延迟过高或发送错误导致请求失败,原创 2021-06-29 17:22:39 · 883 阅读 · 1 评论