分布式一致性算法
分布式一致性算法概述分布式一致性算法是一组用于确保分布式系统中数据一致性的算法。这些算法旨在解决多个节点之间的数据同步和一致性问题,以确保在分布式环境中的各个节点上的数据副本保持一致。
一些常见的分布式一致性算法包括:
Paxos算法:Paxos算法是一种经典的分布式一致性算法,用于确保在网络中多个节点之间达成一致性协议。
Raft算法:Raft算法是另一种用于分布式一致性的算法,它的设计更加容易理解和实现,适用于构建可靠的分布式系统。
ZAB 算法:ZAB(ZooKeeper Atomic Broadcast)选举算法是为 ZooKeeper 实现分布式协调功能而设计的。
Gossip算法:Gossip算法,是一种分布式计算中常用的算法,它用于在一个分布式系统中传播信息或数据,以实现数据的一致性和同步。
算法简单介绍Paxos算法Paxos算法是一种分布式一致性算法,用于在分布式系统中达成一致的共识。它是由Leslie Lamport于1990年提出的,被认为是分布式系统领域的经典算法之一。Paxos算法的主要目标是允许多个节点在面对故障和网络延迟的情况下,达成共识,确保数据的一 ...
多级缓存架构
多级缓存架构分布式多久缓存架构概述分布式缓存架构是一种用于提高应用程序性能和可伸缩性的计算机架构,它利用分布式计算资源和存储资源来管理和存储数据的缓存。这种架构的主要目标是减轻数据库或其他后端存储系统的负载,从而加快数据访问速度并提高系统的可伸缩性。
架构图:
一共分为四层:客户端层、应用层、服务层、数据层;
各层缓存客户端层:客户端层的缓存通常是通过浏览器进行管理,它使用响应头中的一些字段来控制缓存行为,将静态文件缓存在客户端本地。
这些字段包括:
Cache-Control: 这个响应头字段包含了各种指令,以告诉浏览器如何处理响应的缓存。
max-age:指定了资源在被认为过期之前可以被缓存的秒数。例如,max-age=3600表示资源可以在浏览器缓存中存储一个小时。
no-cache:表示缓存必须重新验证资源的有效性,但仍然可以缓存。
no-store:表示不允许缓存该资源。
public:表示该响应可以被任何缓存存储,包括中间代理服务器。
private:表示响应只能被单个用户的浏览器缓存,而不能被共享缓存。
Expires: 这个响应头字段包含了一个日期/时间值,表 ...
动态通知方案
动态通知方案概述“动态通知” 是指在实时或运行时通知或提醒系统的方式。这种通知可以是基于事件、数据变化、用户行为或其他触发条件的。动态通知在计算机科学和信息技术领域中非常常见,用于各种应用,包括通信、监控、安全、用户界面等。
动态通知可以采用不同的方式和机制,主要包括:
Push通知:这是一种实时通知方式,其中数据或信息被主动推送到接收方。常见的例子包括移动应用中的推送通知、实时聊天消息等。
Pull通知:在这种方式下,接收方定期轮询或请求来获取更新或信息。这通常涉及定期检查服务器或资源的状态以获取新数据。
Push通知Push方式通常是基于观察者模式(Observer Pattern)实现的。在这种方式下,有一个被观察者(通常称为主题)和多个观察者。当主题的状态发生变化时,它会主动通知所有观察者,将更新推送给它们。
例如:微博动态推送
优点:
有很好的实时性
缺点:
需要在服务器存数据,无法保证无状态
粉丝量太多会引发写扩散的问题(大量动态队列持久化造成磁盘高IO)
写扩散问题解决:
设置上限,例如微信好友5000个
限流策略,X分钟内完成消息发布
优化存储策略 ...
MySQL数据异构同步方案
MySQL数据异构同步前述MySQL数据异构同步是将数据从一个MySQL数据库复制到另一个不同结构数据库(如Elasticsearch等),但这两个数据库可能具有不同的架构、结构或配置的过程。
总之,MySQL数据异构同步是一项复杂的任务,涉及多个概念和技术,旨在确保数据在不同的MySQL数据库之间正确、高效和安全地复制和同步。
传统做法直接在对MySQL数据更新的时候就调用其他团队的接口进行同步:
缺点:
团队之间强耦合
团队开发成本高,还需要了解其他团队的接口规范
推荐做法使用 Canal(阿里巴巴开源的数据库变更数据捕获组件)可以实现 MySQL 数据异构同步。
Canal能够监控 MySQL 数据库的变更,捕获INSERT、UPDATE、DELETE等操作,并将这些变更数据传递给目标数据库或其他系统。
实现流程:
使用Canal对MySQL数据变更进行监听
将变更数据发送到消息队列中
对应的异构数据库订阅消息队列
一旦有消息就根据变更数据执行相应逻辑
优点:
增强数据同步和处理的效率
大大对团队之间工作进行解耦
增强了架构的可伸缩性和灵活性
CAP定理
CAP定理概述CAP定理是分布式计算领域的一个重要理论,它描述了在一个分布式系统中,三个关键属性之间的权衡关系。一致性(Consistency)、可用性(Availability)、分区容忍性(Partition Tolerance)。
定理详解
一致性(Consistency):一致性要求所有参与分布式系统的节点在任何时刻都看到相同的数据副本,即数据的更新必须在所有节点上都是可见的。这意味着在写操作完成后,所有读操作都应该能够立即看到最新的数据。
可用性(Availability):可用性要求系统在任何时刻都能够响应客户端的请求,即系统不会因为部分故障而完全失效。高可用性意味着系统能够继续提供服务,即使某些节点或组件出现故障。
分区容忍性(Partition Tolerance):分区容忍性是指系统能够在网络分区或通信故障的情况下继续正常运行。网络分区是指分布式系统中的节点之间的通信被断开或延迟,但系统仍然需要继续工作。
CAP定理的三种典型组合是:
CA(一致性和可用性):在这种情况下,系统会牺牲分区容忍性,即当发生网络分区时,系统可能会停止工作,以确保数据的一致性和可用性 ...
BASE理论
BASE理论概述BASE理论是与ACID(原子性、一致性、隔离性、持久性)相对立的另一种分布式系统设计原则。BASE是一种更灵活的一致性模型,通常用于分布式系统中,特别是在面对高可用性和分区容错性的要求时。BASE代表以下三个属性:
理论详解
基本可用性(Basic Availability):这意味着系统在发生故障或分区时仍然能够提供基本的可用性。基本可用性不一定保证一致性或完全正常的性能,但它确保了系统在某些情况下仍然能够提供服务。
软状态(Soft State):在BASE模型中,系统的状态可以在一段时间内是不一致的,但最终会趋向于一致状态。这意味着系统中的数据可以在不同节点上存在短暂的不一致性,但最终会在时间的推移下趋于一致。
最终一致性(Eventual Consistency):最终一致性是BASE模型的核心思想,它指的是分布式系统中的数据最终会达到一致状态,但不保证在任何时间点都是强一致的。最终一致性允许系统在一段时间内存在不一致,但最终会在没有新的更新时达到一致状态。
BASE理论的核心思想是在某些情况下,为了保证高可用性和容错性,可以牺牲强一致性。这在一些互联网 ...
项目发布
项目发布问题项目发布是将项目的最终版本或特定功能部署到生产环境或可用于用户的过程。这个过程通常需要精心计划和执行,以确保项目的稳定性、性能和可用性。皆是在尽可能减少服务停机时间控制新版本带来的质量风险。
一般项目发布有以下几种方式:
全量发布:
蓝绿发布(Blue-Green Deployment):
概述: 蓝绿发布是一种部署策略,它在两个完全独立的生产环境中交替部署应用程序版本。一个环境是当前运行的版本(蓝色环境),另一个环境是新版本(绿色环境)。
部署流程:
初始阶段,蓝色环境运行当前稳定的版本,而绿色环境准备好新版本。
在准备就绪后,可以将流量从蓝色环境切换到绿色环境,使新版本上线。
如果出现问题,可以轻松切换回蓝色环境,恢复旧版本。
这个过程可以反复进行,确保平滑的升级和回滚。
红黑发布(Red-Black Deployment):
概述: 红黑发布是一种部署策略,它在同一生产环境中交替部署两个不同版本的应用程序。一个版本是当前生产版本(红色),另一个是新版本(黑色)。
部署流程:
初始阶段,红色版本是当前运行的生产版本。
黑色版本在准备就绪后,与红色版本并行部署。 ...
多线程设计模式
设计模式同步模式—保护性暂停定义保护性暂停即Guarded Suspension,用在一个线程等待另一个线程的执行结果,因为要等待另一方的结果,因此归类到同步模式。
要点:
有一个结果需要从一个线程传递到另一个线程,让他们关联同一个GuardedObject,JDK中,join的实现、Future的实现,采用的就是此模式。
如果有结果不断从一个线程到另一个线程那么可以使用消息队列(见生产者/消费者)
实现单个线程相互等待:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566public class Test01 { public static void main(String[] args) { GuardedObject guardedObject = new GuardedObject(); new Thread(() -> ...
Java并发工具
并发工具线程池概述对于线程池与数据库连接池一样,都利用了池化技术来优化频繁创建线程/连接所带来的性能损耗。并且可以控制线程数来减小上下文切换的性能消耗。
线程池有两个比较重要的参数:coreThreadCount 和 maxThreadCount
coreThreadCount:线程池中的核心线程数。
maxThreadCount:最大线程数。
分配策略:
如果线程池中的线程数少于 coreThreadCount 时,会创建新的线程处理,并将线程放入线程池;
如果线程数大于 coreThreadCount 则把任务丢到一个队列里面,由当前空闲的线程执行;
当队列中的任务堆积满了的时候,则继续创建线程,直到达到 maxThreadCount;
当线程数达到 maxTheadCount 时还有新的任务提交,那么我们就不得不将它们丢弃了。
可以看出JDK 原生的线程池当线程数大于 coreThreadCount 不会立马创建线程,而是放入队列;因此只需要创建和 CPU 核心数相当的线程就好了,多了反而会造成线程上下文切换,降低任务执行效率。(但是这是对于CPU 密集型的任务,对于IO ...
共享问题
共享问题问题概述一个程序运行多个线程本身是没有问题的,问题出在多个线程访问共享资源
多个线程读共享资源其实也没有问题
在多个线程对共享资源读写操作时发生指令交错,就会出现问题
临界区:
一段代码块内如果存在对共享资源的多线程读写操作,称这段代码块为临界区
竞态条件:
多个线程在临界区内执行,由于代码的执行序列不同而导致结果无法预测即程序的执行结果依赖线程执行的顺序,称之为发生了竞态条件
线程安全分析Java变量的线程安全问题
成员变量和静态变量是否线程安全?
如果它们没有共享,则线程安全
如果它们被共享了,根据它们的状态是否能够改变,又分两种情况
如果只有读操作,则线程安全
如果有读写操作,则这段代码是临界区,需要考虑线程安全
局部变量是否线程安全?
局部变量是线程安全的
但局部变量引用的对象则未必
如果该对象没有逃离方法的作用访问,它是线程安全的
如果该对象逃离方法的作用范围,需要考虑线程安全
常见的线程安全类
String
Integer
StringBuffer
Random
Vector
Hashtable
java.util.concurrent 包下的 ...