`
izuoyan
  • 浏览: 9001556 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

探索并发编程(七)------分布式环境中并发问题

阅读更多

在分布式环境中,处理并发问题就没办法通过操作系统和JVM的工具来解决,那么在分布式环境中,可以采取一下策略和方式来处理:

  • 避免并发
  • 时间戳
  • 串行化
  • 数据库
  • 行锁
  • 统一触发途径

避免并发

在分布式环境中,如果存在并发问题,那么很难通过技术去解决,或者解决的代价很大,所以我们首先要想想是不是可以通过某些策略和业务设计来避免并发。比如通过合理的时间调度,避开共享资源的存取冲突。另外,在并行任务设计上可以通过适当的策略,保证任务与任务之间不存在共享资源,比如在以前博文中提到的例子,我们需要用多线程或分布式集群来计算一堆客户的相关统计值,由于客户的统计值是共享数据,因此会有并发潜在可能。但从业务上我们可以分析出客户与客户之间 数据是不共享的,因此可以设计一个规则来保证一个客户的计算工作和数据访问只会被一个线程或一台工作机完成,而不是把一个客户的计算工作分配给多个线程去 完成。这种规则很容易设计,例如可以采用hash算法。

时间戳

分布式环境中并发是没法保证时序的,无论是通过远程接口的同步调用或异步消息,因此很容易造成某些对时序性有要求的业务在高并发时产生错误。比如系统A需要把某个值的变更同步到系统B,由于通知的时序问题会导致一个过期的值覆盖了有效值。对于这个问题,常用的办法就是采用时间戳的方式,每次系统A发送变更给系统B的时候需要带上一个能标示时序的时间戳,系统B接到通知后会拿时间戳与存在的时间戳比较,只有当通知的时间戳大于存在的时间戳,才做更新。这种方式比较简单,但关键在于调用方一般要保证时间戳的时序有效性。

串行化

有的时候可以通过串行化可能产生并发问题操作,牺牲性能和扩展性,来满足对数据一致性的要求。比如分布式消息系统就没法保证消息的有序性,但可以通过变分布式消息系统为单一系统就可以保证消息的有序性了。另外,当接收方没法处理调用有序性,可以通过一个队列先把调用信息缓存起来,然后再串行地处理这些调用。

数据库

分布式环境中的共享资源不能通过Java里同步方法或加锁来保证线程安全,但数据库是分布式各服务器的共享点,可以通过数据库的高可靠一致性机制来满足需求。比如,可以通过唯一性索引来解决并发过程中重复数据的生产或重复任务的执行;另外有些更新计算操作也尽量通过sql来完成,因为在程序段计算好后再去更新就有可能发生脏复写问题,但通过一条sql来完成计算和更新就可以通过数据库的锁机制来保证update操作的一致性。

行锁

有的事务比较复杂,无法通过一条sql解决问题,并且有存在并发问题,这时就需要通过行锁来解决,一般行锁可以通过以下方式来实现:

  • 对于Oracle数据库,可以采用select ... for update方式。这种方式会有潜在的危险,就是如果没有commit就会造成这行数据被锁住,其他有涉及到这行数据的任务都会被挂起,应该谨慎使用
  • 在表里添加一个标示锁的字段,每次操作前,先通过update这个锁字段来完成类似竞争锁的操作,操作完成后在update锁字段复位,标示已归还锁。这种方式比较安全,不好的地方在于这些update锁字段的操作就是额外的性能消耗

统一触发途径

当一个数据可能会被多个触发点或多个业务涉及到,就有并发问题产生的隐患,因此可以通过前期架构和业务设计,尽量统一触发途径,触发途径少了一是减少并发的可能,也有利于对于并发问题的分析和判断。

分享到:
评论

相关推荐

    阿里专家级并发编程架构师课程 彻底解决JAVA并发编程疑难杂症 JAVA并发编程高级教程

    课程内容包括了JAVA手写线程池,UC线程池API详解,线程安全根因详解,锁与原子类,分布式锁原理与实现方式,并发编程-AQS等等针对性非常强的JAVA编程开发教程,这其中的内容对JAVA开发技能的拔尖,非常的有帮助。...

    阿里专家级并发编程架构师课程-网盘链接提取码下载 .txt

    课程内容包括了JAVA手写线程池,UC线程池API详解,线程安全根因详解,锁与原子类,分布式锁原理与实现方式,并发编程-AQS等等针对性非常强的JAVA编程开发教程,这其中的内容对JAVA开发技能的拔尖,非常的有帮助。...

    Tu灵六期Java高级互联网架构师第6期

    05 并发编程专题 06 并发编程专题 07 性能优化_Mysql 08 性能调优 _Mysql 09 性能调优 Tomcat深度剖析 10 性能调优专题 11 JVM性能调优专题 12 分布式框架专题-分布式缓存技术Redis 13 分布式框架专题-分布式缓存...

    蚂蚁架构师第3期并发编程设计模式分布式性能优化视频教程

    蚂蚁架构师之并发编程设计模式与分布式性能优化视频教程 java架构师视频教程推荐,真正的轻量级架构体系,学习java你不可或缺,java自学网作为国内顶尖的java学习论坛社区,专注提供高质量,含金量的视频教程!...

    Java ️总结:JVM,NIO,并发编程,MySQL,分库分表,微服务,分布式缓-Java-Summarize.zip

    Java ️总结:JVM,NIO,并发编程,MySQL,分库分表,微服务,分布式缓-Java-Summarize

    深入理解高并发编程-核心技术原理

    (1) 导致并发编程频繁出问题的“幕后黑手” (2)工作了3年的程序员小菜面试高并发岗位被吊打虐哭 (3)如何解决可见性和有序性问题?这次彻底懂了! 3、实战案例篇 (1) 如何实现亿级流量下的分布式限流?这些理论你必须...

    分布式并发控制的锁技术

    2.论述分布式并发控制锁技术面临的主要问题。 论述使用锁实现分布式并发控制的技术要点。包括:锁的种类;锁相容性矩阵;全局锁调度器的作用与结构特点;加锁准则与算法;死锁及其预防技术;等。 3.选择一个实用的...

    《大型分布式网站架构设计与实践》 Java 并发编程实战

    《大型分布式网站架构设计与实践》 Java 并发编程实战 pdf文档

    java稳定可靠的分布式-高并发性能调优

    JVM性能检测及调优,设计模式调优,数据库性能调优,实战演、还有其他豆瓣高评分的Java相关书籍:深入理解Java虚拟机、凤凰架构:构建可靠的大型分布式系统、谷歌大佬的算法刷题手册、阿里的高并发编程手册

    java并发编程源码-java_concurrent_distributed:学术资料库,了解Java并发和分布式编程。源代码是在Instar

    java并发编程源码java_concurrent_distributed 学术资料库,了解Java并发和分布式编程。 源代码是在Insubria大学的本科课程中开发的。

    【并发编程】自定义简单线程池.pdf

    并发工具:介绍并发编程中使用的工具和库,如线程池、并发集合等。 性能优化:讨论如何优化并发程序的性能,包括减少上下文切换、提高缓存效率等。 错误处理:讲解并发编程中的错误处理,如异常安全、错误传播等。 ...

    【并发编程】深入理解JMM.pdf

    并发工具:介绍并发编程中使用的工具和库,如线程池、并发集合等。 性能优化:讨论如何优化并发程序的性能,包括减少上下文切换、提高缓存效率等。 错误处理:讲解并发编程中的错误处理,如异常安全、错误传播等。 ...

    Java并发编程和多线程的区别

    并发编程不仅包括多线程,还包括了处理多个独立任务的各种技术和模式,如进程、协程、分布式编程等。并发编程的目标是实现任务的并发执行,以提高系统的性能和资源利用率。 因此,多线程是并发编程的一部分。多线程...

    【并发编程】CAS到底是什么.pdf

    并发工具:介绍并发编程中使用的工具和库,如线程池、并发集合等。 性能优化:讨论如何优化并发程序的性能,包括减少上下文切换、提高缓存效率等。 错误处理:讲解并发编程中的错误处理,如异常安全、错误传播等。 ...

    【并发编程】如何优雅使用线程池.pdf

    并发工具:介绍并发编程中使用的工具和库,如线程池、并发集合等。 性能优化:讨论如何优化并发程序的性能,包括减少上下文切换、提高缓存效率等。 错误处理:讲解并发编程中的错误处理,如异常安全、错误传播等。 ...

    面向对象的分布式脚本编程语言Reia.zip

    如果你既想要erlang的并发分布式编程的理念又不喜欢erlang丑陋的停留在80年代的那种语法,又想要现代的性感的漂亮的时尚的Ruby/Python式的面向对象观而不满意其并发模型,那么,可以尝试Reia. 标签:Reia

    【并发编程】简单化理解AQS和ReentrantLock.pdf

    并发工具:介绍并发编程中使用的工具和库,如线程池、并发集合等。 性能优化:讨论如何优化并发程序的性能,包括减少上下文切换、提高缓存效率等。 错误处理:讲解并发编程中的错误处理,如异常安全、错误传播等。 ...

    【并发编程】volatile的原理我好像又懂了.pdf

    并发工具:介绍并发编程中使用的工具和库,如线程池、并发集合等。 性能优化:讨论如何优化并发程序的性能,包括减少上下文切换、提高缓存效率等。 错误处理:讲解并发编程中的错误处理,如异常安全、错误传播等。 ...

    并发编程学习资料架构图

    大型互联网并发编程Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术

Global site tag (gtag.js) - Google Analytics