RocketMQ事务消息
事务消息事务消息为 Apache RocketMQ 中的高级特性消息,本文为您介绍事务消息的应用场景、功能原理、使用限制、使用方法和使用建议。
应用场景分布式事务的诉求
分布式系统调用的特点为一个核心业务逻辑的执行,同时需要调用多个下游业务进行处理。因此,如何保证核心业务和多个下游业务的执行结果完全一致,是分布式事务需要解决的主要问题。
以电商交易场景为例,用户支付订单这一核心操作的同时会涉及到下游物流发货、积分变更、购物车状态清空等多个子系统的变更。当前业务的处理分支包括:
主分支订单系统状态更新:由未支付变更为支付成功。
物流系统状态新增:新增待发货物流记录,创建订单物流记录。
积分系统状态变更:变更用户积分,更新用户积分表。
购物车系统状态变更:清空购物车,更新用户购物车记录。
传统XA事务方案:性能不足
为了保证上述四个分支的执行结果一致性,典型方案是基于XA协议的分布式事务系统来实现。将四个调用分支封装成包含四个独立事务分支的大事务。基于XA分布式事务的方案可以满足业务处理结果的正确性,但最大的缺点是多分支环境下资源锁定范围大,并发度低,随着下游分支的增加,系统性能会越 ...
分布式ID
一、为什么要用分布式ID?在说分布式ID的具体实现之前,我们来简单分析一下为什么用分布式ID?分布式ID应该满足哪些特征?
1、什么是分布式ID?拿MySQL数据库举个栗子:
在我们业务数据量不大的时候,单库单表完全可以支撑现有业务,数据再大一点搞个MySQL主从同步读写分离也能对付。
但随着数据日渐增长,主从同步也扛不住了,就需要对数据库进行分库分表,但分库分表后需要有一个唯一ID来标识一条数据,数据库的自增ID显然不能满足需求;特别一点的如订单、优惠券也都需要有唯一ID做标识。此时一个能够生成全局唯一ID的系统是非常必要的。那么这个全局唯一ID就叫分布式ID。
2、那么分布式ID需要满足哪些条件?
全局唯一:必须保证ID是全局性唯一的,基本要求
高性能:高可用低延时,ID生成响应要快,否则反倒会成为业务瓶颈
高可用:100%的可用性是骗人的,但是也要无限接近于100%的可用性
好接入:要秉着拿来即用的设计原则,在系统设计和实现上要尽可能的简单
趋势递增:最好趋势递增,这个要求就得看具体业务场景了,一般不严格要求
二、 分布式ID都有哪些生成方式?今天主要分析一下以下9种,分布式I ...
四种常见限流算法原理及实现
在分布式系统中,高并发场景下,为了防止系统因突然的流量激增而导致的崩溃,同时保证服务的高可用性和稳定性,限流是最常用的手段。
常见的四种限流算法,分别是:固定窗口算法、滑动窗口算法、漏桶算法、令牌桶算法。
1. 固定窗口算法1.1 实现原理固定窗口限流算法,也叫计数器限流算法,是最简单的一种限流算法。
实现原理是: 在一个固定长度的时间窗口内限制请求数量,每来一个请求,请求次数加一,如果请求数量超过最大限制,就拒绝该请求。
下面使用Java伪代码实现一下固定窗口限流算法,注意以下算法没有考虑并发情况,在并发环境下,可以使用Synchronized、Reentrantlock或者AtomicLong等并发工具来保证数据安全性。
1.2 代码实现public class FixWindowLimiter {
/**
* 每个窗口的最大请求数量
*/
public static long threshold = 10;
/**
* 窗口大小,1000ms
*/
public static long wind ...
GoF五种创建型模式
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。
这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。
创建型模式分为:
单例模式
工厂方法模式
抽象工程模式
原型模式
建造者模式
4.1 单例设计模式单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
4.1.1 单例模式的结构单例模式的主要有以下角色:
单例类。只能创建一个实例的类
访问类。使用单例类
4.1.2 单例模式的实现
单例设计模式分类两种:
饿汉式:类加载就会导致该单实例对象被创建
懒汉式:类加载不会导致该单实例对象被创建,而是首次使用该对象时才会创建
饿汉式-方式1(静态变量方式)
/**
* 饿汉式
* 静态变量创建类的对象
*/
public class Singleton ...
软件设计原则
在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据6条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。
开闭原则对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。
想要达到这样的效果,我们需要使用接口和抽象类。
因为抽象灵活性好,适应性广,只要抽象的合理,可以基本保持软件架构的稳定。而软件中易变的细节可以从抽象派生来的实现类来进行扩展,当软件需要发生变化时,只需要根据需求重新派生一个实现类来扩展就可以了。
下面以 搜狗输入法 的皮肤为例介绍开闭原则的应用。
【例】搜狗输入法 的皮肤设计。
分析:搜狗输入法 的皮肤是输入法背景图片、窗口颜色和声音等元素的组合。用户可以根据自己的喜爱更换自己的输入法的皮肤,也可以从网上下载新的皮肤。这些皮肤有共同的特点,可以为其定义一个抽象类(AbstractSkin),而每个具体的皮肤(DefaultSpecificSkin和HeimaSpecificSkin)是其子类。用户窗体可以根据需要选择或者增 ...
类及类关系的表示方法
统一建模语言(Unified Modeling Language,UML)是用来设计软件的可视化建模语言。它的特点是简单、统一、图形化、能表达软件设计中的动态与静态信息。
UML 从目标系统的不同角度出发,定义了用例图、类图、对象图、状态图、活动图、时序图、协作图、构件图、部署图等 9 种图。
类图概述类图(Class diagram)是显示了模型的静态结构,特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图不显示暂时性的信息。类图是面向对象建模的主要组成部分。
类图的作用
在软件工程中,类图是一种静态的结构图,描述了系统的类的集合,类的属性和类之间的关系,可以简化了人们对系统的理解;
类图是系统分析和设计阶段的重要产物,是系统编码和测试的重要模型。
类图表示法类的表示方式在UML类图中,类使用包含类名、属性(field) 和方法(method) 且带有分割线的矩形来表示,比如下图表示一个Employee类,它包含name,age和address这3个属性,以及work()方法。
属性/方法名称前加的加号和减号表示了这个属性/方法的可见性,UML ...
Hystrix简介
Hystrix Hystrix是一个用于构建弹性和容错系统的Java库,由Netflix开发和维护。它旨在帮助开发者构建具有容错能力的分布式系统,特别是在处理复杂的网络通信时。
Hystrix主要解决的问题是在分布式系统中的服务之间进行通信时可能出现的故障和延迟。这些问题可能导致级联故障,即一个服务的故障传递到其他服务,最终导致整个系统不可用。Hystrix通过引入隔离、断路器和回退机制来解决这些问题。
隔离是Hystrix的核心概念之一。它通过将每个服务调用封装在独立的线程池中运行,实现了请求的隔离。这样,当某个服务调用失败或延迟较高时,不会对其他服务产生负面影响。
断路器是Hystrix的另一个重要概念。它监控服务调用的错误率和延迟情况。当错误率或延迟超过预设的阈值时,断路器会打开,停止对该服务的调用,并快速失败。这样可以防止级联故障,并且当服务恢复正常后,断路器会逐渐闭合,重新允许对该服务的调用。
此外,Hystrix还提供了回退机制,用于在服务调用失败时提供备选方案。开发者可以定义回退逻辑,当服务调用失败时,Hystrix会自动调用回退逻辑来返回预先定义的备选结果 ...
ElasticSearch分片集群
1 分布式集群1.1 单节点集群我们在包含一个空节点的集群内创建名为 users 的索引,为了演示目的,我们将分配3个主分片和一份副本(每个主分片拥有一个副本分片)
{
“settings” : {
“number_of_shards” : 3,
“number_of_replicas” : 1
}
}
我们的集群现在是拥有一个索引的单节点集群。所有3个主分片都被分配在 node-1 。
通过elasticsearch-head插件查看集群情况
集群健康值:yellow( 3 of 6 ) : 表示当前集群的全部主分片都正常运行,但是副本分片没有全部处在正常状态 : 3个主分片正常 : 3个副本分片都是 Unassigned —— 它们都没有被分配到任何节点。 在同一个节点上既保存原始数据又保存副本是没有意义的,因为一旦失去了那个节点,我们也将丢失该节点上的所有副本数据。
当前我们的集群是正常运行的,但是在硬件故障时有丢失数据的风险。
1.2 故障转移当集群中只有一个节点在运行时,意味着会有一个单点故障问题——没有冗余。 幸运的是,我们只需再启动 ...
SpringCloud常用组件对比
Eurka和NacosNacos和Eureka都是服务注册和发现的开源项目,用于构建分布式系统和微服务架构。它们的主要区别如下:
服务注册和发现机制:
Nacos:Nacos提供了基于实例的服务注册和发现机制。服务提供者在启动时向Nacos注册自己的服务实例,并定期发送心跳来保持注册。服务消费者通过向Nacos查询服务列表来发现可用的服务实例。
Eureka:Eureka采用了基于中心化的服务注册和发现模式。服务提供者在启动时向Eureka注册自己的服务实例,并周期性地发送心跳来保持注册。服务消费者通过向Eureka服务器获取服务注册表来发现可用的服务实例。
Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式临时实例心跳不正常会被剔除,非临时实例则不会被剔除。另外Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
容错性和高可用性:
Nacos:Nacos支持多节点的集群部署,具有高可用性和容错性。它使用Raft算法来保证数据的一致性和可用性,并支持自动的主从切换和故障恢复。
Eureka:Eureka的设计目标是在AWS云平台上实现高 ...
Ribbon、Gateway、Nginx
Ribbon、Gateway、Nginx区别Ribbon Ribbon 是一个用于客户端负载均衡的开源项目,最初由 Netflix 开发并开源。它主要用于在分布式系统中选择合适的服务实例并进行负载均衡。
在微服务架构中,服务通常以多个实例运行,这些实例可能分布在不同的主机或容器中。Ribbon 可以与服务注册中心(如 Eureka、Consul 等)集成,通过查询注册中心获取可用的服务实例列表。
Ribbon 在客户端应用内部工作,作为一个负载均衡组件,它会根据一定的负载均衡策略选择一个合适的服务实例来发送请求。这些负载均衡策略包括轮询、随机、加权随机、最少连接等。选择的服务实例将接收客户端的请求,并将响应返回给客户端。
Ribbon 还提供了一些其他功能,如超时设置、重试机制、服务实例健康检查等。它可以根据服务实例的健康状态和负载情况动态地选择合适的实例,以实现负载均衡和故障恢复。
Ribbon 的优点是简单轻量、易于集成和扩展。它与多种服务注册中心和开发框架兼容,适用于各种微服务架构中的负载均衡需求。
Gateway Gateway是一种在分布式系统中充当入口点 ...