当前位置: 首页 > news >正文

分布式事务 - 个人笔记 @by_TWJ

目录

  • 1. 传统事务
    • 1.1. 事务特征
    • 1.2. 事务隔离级别
      • 1.2.1. 表格展示
      • 1.2.2. oracle和mysql可支持的事务隔离级别
  • 2. 分布式事务
    • 2.1. CAP指标
    • 2.2. BASE理论
    • 2.3. 7种常见的分布式事务方案
      • 2.3.1. 2PC
      • 2.3.2. 3PC
      • 2.3.3. TCC
        • 2.3.3.1. TCC的注意事项:
        • 2.3.3.2. TCC方案的优缺点:
      • 2.3.4. SAGA(略,详细请看文章)
      • 2.3.5. 本地事务表(略,详细请看文章)
      • 2.3.6. MQ事务消息(略,详细请看文章)
      • 2.3.7. 最大努力通知(略,详细请看文章)
  • 3. 分布式事务实现框架
    • 3.1. 分布式事务Seata
      • 3.1.1. Seata事务管理中有三个重要的角色:
      • 3.1.2. Seata提供了四种不同的分布式事务解决方案:
        • 3.1.2.1. XA模式
        • 3.1.2.2. AT模式
        • 3.1.2.3. TCC模式
          • 3.1.2.3.1. 实现
          • 3.1.2.3.2. 版本v1.5.1之前存在一些问题:
            • 3.1.2.3.2.1. 空回滚、幂等、悬挂
        • 3.1.2.4. SAGA模式
        • 3.1.2.5. 总结
        • 3.1.2.6. 注意
      • 3.1.3. 项目例子

分布式事务 - 个人笔记

1. 传统事务

1.1. 事务特征

事务拥有以下四个特性,习惯上被称为 ACID 特性:

  1. 原子性(Atomicity)
    • 定义: 事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
    • 意思:事务是最小的工作单元,不可再分。
  2. 一致性(Consistency)
    • 定义:事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态是指数据库中的数据应满足完整性约束。除此之外,一致性还有另外一层语义,就是事务的中间状态不能被观察到(这层语义也有说应该属于原子性)。
    • 意思:事务必须保证多条DML语句同时成功或者同时失败。
  3. 隔离性(Isolation)
    • 定义:多个事务并发执行时,一个事务的执行不应影响其他事务的执行,如同只有这一个操作在被数据库所执行一样。
    • 意思:事务A与事务B之间具有隔离。
  4. 持久性(Durability)
    • 定义:已被提交的事务对数据库的修改应该永久保存在数据库中。在事务结束时,此操作将不可逆转。
    • 意思:持久性说的是最终数据必须持久化到硬盘文件中,事务才算成功的结束。

1.2. 事务隔离级别

事务隔离性隔离级别,理论上隔离级别包括4个:

  • RU(READ-UNCOMMITTED 表示读未提交)

    • 可以读取到事务未提交的数据,隔离性差,会出现脏读(当前内存读),不可重复读,幻读问题;
  • RC(READ-COMMITTED 表示读已提交)

    • 可以读取到事务已提交的数据,隔离性一般,不会出现脏读问题,但是会出现不可重复读,幻读问题;
  • RR(REPEATABLE-READ 表示可重复读)

    • 可以防止脏读(当前内存读),防止不可重复读问题,防止会出现的幻读问题,但是并发能力较差;
    • 会使用next lock锁进制,来防止幻读问题,但是引入锁进制后,锁的代价会比较高,比较耗费CPU资源,占用系统性能;
  • SR(SERIALIZABLE 可串行化)

    • 隔离性比较高,可以实现串行化读取数据,但是事务的并发度就没有了;
    • 这是事务的最高级别,在每条读的数据上,加上锁,使之不可能相互冲突。

1.2.1. 表格展示

事务隔离级别脏读幻读不可重复读隔离性并发度能力
读未提交×××极差极好
读已提交××
可重复读
可串行化极高极差

× 表示没有解决
√ 表示已解决

例如:
读已提交,解决了脏读问题,但幻读和不可重复读,没有解决。

1.2.2. oracle和mysql可支持的事务隔离级别

Oracle数据库默认的隔离级别是读已提交

oracle 支持的事务隔离级别有

  1. READ COMMITTED (读已提交)
  2. SERIALIZABLE (可串行化)
  3. READ ONLY (只读)

MySQL数据库默认的隔离级是可重复读

MySQL 支持的事务隔离级别有

  1. READ UNCOMMITTED(未提交读)
  2. READ COMMITTED(提交读)
  3. REPEATABLE READ(可重复读)
  4. SERIALIZABLE(可串行化)

2. 分布式事务

2.1. CAP指标

首先,分布式事务是基于分布式系统的,所以先看如下分布式系统存在的一些问题。

1998年,加州大学的计算机科学家 Eric Brewer 提出,分布式系统有三个指标

  • Consistency(一致性)
  • Availability (可用性)
  • Partition tolerance (分区容错性)

EricBrewer 说,分布式系统无法同时满足这三个指标。
这个结论就叫做 CAP 定理

在这里插入图片描述

满足两个指标,我们分别叫:

  • CP:满足“分区容错性”和“一致性”
  • AP:满足“可用性”和“分区容错性”
  • CA:满足“一致性”和“可用性”

具体解释

  • 一致性:指的是在分布式系统中,所有节点访问同一数据项时,看到的是相同的数据。一致性要求在任意时刻,所有节点中的数据是一样的。
  • 可用性:指的是在分布式系统中,客户端的请求能够在合理的时间内得到响应。
  • 分区容错性:指的是分布式系统能够容忍网络分区的情况,即系统中的某些节点之间由于网络故障而无法通信。

分布式事务
P是必须的,一定会存在网络方面的问题。
对于一个分布式系统来说,P 是一个基本要求,CAP 三者中,只能根据系统要求在 C 和 A 两者之间做权衡,并且要想尽办法提升 P

2.2. BASE理论

BASE理论是对CAP的一种解决思路,包含三个思想:

  • Basically Available (基本可用): 分布式系统在出现故障时,允许损失部分可用性,即保证核心可用。
  • soft state(软状态):在一定时间内,允许出现中间状态,比如临时的不一致状态
  • Eventually Consistent (最终一致性): 虽然无法保证强一致性,但是在软状态结束后,最终达到数据一致。

2.3. 7种常见的分布式事务方案

2.3.1. 2PC

在这里插入图片描述

为了解决分布式一致性问题,人们提出了很多解决方案,其中比较重要的就是2PC和3PC。2PC其实就是相当于在后厨引入一个协调者,他负责统筹所有参与者。

二阶段提交的算法思路是在分布式系统中引入了协调者,参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情报决定各参与者是否要提交操作还是中止操作。

那么整个操作被分为两个阶段:第一阶段:准备阶段(投票阶段)和第二阶段:提交阶段(执行阶段)

但是,同时,2PC也存在一些缺点,如同步阻塞问题、单点故障问题、无法100%保证数据一致性等问题。所以人们在2PC的基础上提出了3PC算法。

缺点:2PC的缺点也很致命:同步阻塞,单点问题,数据不一致,太过保守

  • 1、同步阻塞问题。执行过程中,所有参与节点都是事务阻塞型的。当参与者占有公共资源时,其他第三方节点访问公共资源不得不处于阻塞状态,各个参与者在等待协调者发出提交或中断请求时,会一直阻塞,而协调者的发出时间要依赖于所有参与者的响应时间,如果协调者宕机了(单点),那么他就一直阻塞在这,而且无法达成一致(3PC引入了超时提交解决)。
  • 2、单点故障。由于协调者的重要性,一旦协调者发生故障。参与者会一直阻塞下去。尤其在第二阶段,协调者发生故障,那么所有的参与者还都处于锁定事务资源的状态中,而无法继续完成事务操作。(如果是协调者挂掉,可以重新选举一个协调者,但是无法解决因为协调者宕机导致的参与者处于阻塞状态的问题)
  • 3、数据不一致。出现分区,或者网络故障。在二阶段提交的阶段二中,当协调者向参与者发送commit请求之后,发生了局部网络异常或者在发送commit请求过程中协调者发生了故障,这回导致只有一部分参与者接受到了commit请求。而在这部分参与者接到commit请求之后就会执行commit操作。但是其他部分未接到commit请求的机器则无法执行事务提交。于是整个分布式系统便出现了数据部一致性的现象。
  • 4、太过保守:2pc没有设计相应的容错机制,例如:当任意一个参与者节点宕机,那么协调者超时没收到响应,就会导致整个事务回滚失败。
  • 5、二阶段无法解决的问题:协调者(在第二阶段)发出commit消息之后宕机,而唯一接收到这条消息的参与者同时也宕机了。那么即使协调者通过选举协议产生了新的协调者,这条事务的状态也是不确定的,没人知道事务是否被已经提交。

由于二阶段提交存在着诸如同步阻塞、单点问题、脑裂等缺陷,所以,研究者们在二阶段提交的基础上做了改进,提出了三阶段提交。

2.3.2. 3PC

在这里插入图片描述

3PC,三阶段提交协议,是二阶段提交协议的改进版本,三阶段提交有几个改动点:

  • (1)在参与者中都引入超时机制,解决的单点故障问题,并减少阻塞
  • (2)在2PC基础上,3PC把2PC的第一阶段,拆分成两个阶段,增加了CanCommit阶段。减少不能执行的事务,进入被锁阶段。

tips: 2pc只有协调者有超时机制,超时后,回滚。

所以3PC会分为3个阶段,CanCommit 准备阶段、PreCommit 预提交阶段、DoCommit 提交阶段

注意:3PC无法解决:数据不一致以及太过保守问题

数据不一致问题依然存在,当在参与者收到 preCommit 请求后等待 doCommit 指令时,此时如果协调者请求中断事务,而协调者因为网络问题无法与参与者正常通信,会导致参与者继续提交事务,造成数据不一致。

2.3.3. TCC

在这里插入图片描述

TCC(Try Confirm Cancel)是应用层的两阶段提交,所以对代码的侵入性强,其核心思想是:针对每个操作,都要实现对应的确认和补偿操作,也就是业务逻辑的每个分支都需要实现 try、confirm、cancel 三个操作,第一阶段由业务代码编排来调用Try接口进行资源预留,当所有参与者的 Try 接口都成功了,事务协调者提交事务,并调用参与者的 confirm 接口真正提交业务操作,否则调用每个参与者的 cancel 接口回滚事务,并且由于 confirm 或者 cancel 有可能会重试,因此对应的部分需要支持幂等。

2.3.3.1. TCC的注意事项:
  • (1)允许空回滚

问题:空回滚出现的原因是 Try 超时或者丢包,导致 TCC 分布式事务二阶段的 回滚,触发 Cancel 操作,此时事务参与者未收到Try,但是却收到了Cancel 请求。(简略:cansel比try更快来到,cansel需要处理try为空的情况
解决办法:在cansel阶段,查询是否有冻结记录,如果没有,则创建一个不需要补偿的记录,例如:冻结金额为0

  • (2)防悬挂控制

问题:悬挂指的是二阶段的 Cancel 比 一阶段的Try 操作先执行,出现该问题的原因是 Try 由于网络拥堵而超时,导致事务管理器生成回滚,触发 Cancel 接口,但之后拥堵在网络的 Try 操作又被资源管理器收到了,但是 Cancel 比 Try 先到。但按照前面允许空回滚的逻辑,回滚会返回成功,事务管理器认为事务已回滚成功,所以此时应该拒绝执行空回滚之后到来的 Try 操作,否则会产生数据不一致。因此我们可以在 Cancel 空回滚返回成功之前,先记录该条事务 xid 或业务主键,标识这条记录已经回滚过,Try 接口执行前先检查这条事务xid或业务主键是否已经标记为回滚成功,如果是则不执行 Try 的业务操作。(简略:cansel比try更快来到,try需要处理,cansel已经创建了空try问题
解决办法:在try阶段,查询是否有冻结记录,如果有,则跳过直接返回结果。

  • (3)幂等控制

问题:由于网络原因或者重试操作都有可能导致 Try - Confirm - Cancel 3个操作的重复执行,所以使用 TCC 时需要注意这三个操作的幂等控制,通常我们可以使用事务 xid 或业务主键判重来控制。(简略:Try - Confirm - Cancel 3个操作的重复执行的问题
解决办法:在冻结记录表,增加状态字段,记录 Try - Confirm - Cancel 3个操作状态,执行Try - Confirm - Cancel操作时,先查看当前事务在哪个阶段。

具体解决办法:

  • 因为try阶段,防悬挂控制已经解决了try阶段的重复try问题。
  • comfirm阶段,我们已经把冻结记录删了,所以重复删除,不会影响功能。
  • cansel阶段,我们要判断是否重复取消执行,如果是,则直接返回结果。(真正要写代码的)
2.3.3.2. TCC方案的优缺点:

(1)TCC 事务机制相比于上面介绍的 XA 事务机制,有以下优点:

性能提升:具体业务来实现,控制资源锁的粒度变小,不会锁定整个资源。
数据最终一致性:基于 Confirm 和 Cancel 的幂等性,保证事务最终完成确认或者取消,保证数据的一致性。
可靠性:解决了 XA 协议的协调者单点故障问题,由主业务方发起并控制整个业务活动,业务活动管理器也变成多点,引入集群。

(2)缺点:TCC 的 Try、Confirm 和 Cancel 操作功能要按具体业务来实现,业务耦合度较高,提高了开发成本。

2.3.4. SAGA(略,详细请看文章)

2.3.5. 本地事务表(略,详细请看文章)

2.3.6. MQ事务消息(略,详细请看文章)

2.3.7. 最大努力通知(略,详细请看文章)

参考文章:七种常见分布式事务详解(2PC、3PC、TCC、Saga、本地事务表、MQ事务消息、最大努力通知)

3. 分布式事务实现框架

3.1. 分布式事务Seata

seata官网:https://seata.apache.org/zh-cn/docs/user/quickstart/

3.1.1. Seata事务管理中有三个重要的角色:

  • TC(Transaction Coordinator)-事务协调者: 维护全局和分支事务的状态协调全局事务提交或回滚
  • TM(Transaction Manager)-事务管理器:定义全局事务的范围、开始全局事务、提交或回滚全局事务
  • RM(Resource Manager)-资源管理器: 管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状
    态,并驱动分支事务提交或回滚。

字面意思就是:

  • TC 事务协调者,即独立运行的seata-server,用于接收事务注册,提交和回滚
  • TM 事务发起者。用来告诉TC全局事务的开始,提交,回滚
  • RM 事务资源,每一个RM都会作为一个分支事务注册在TC。

在这里插入图片描述

在这里插入图片描述

3.1.2. Seata提供了四种不同的分布式事务解决方案:

3.1.2.1. XA模式

XA模式是使用数据库本身所拥有的事务

多事务操作的方式,如下:
在这里插入图片描述

3.1.2.2. AT模式

AT模式是利用额外的表(undo_log、lock_table)存储原始的数据,若业务回滚,则恢复原始的数据。

多事务操作的方式,如下:
在这里插入图片描述
AT是利用全局锁的方式,最终使用的是行锁。

-- auto-generated definition
create table lock_table
(row_key        varchar(128)      not nullprimary key,xid            varchar(128)      null,transaction_id bigint            null,branch_id      bigint            not null,resource_id    varchar(256)      null,table_name     varchar(32)       null,pk             varchar(36)       null,status         tinyint default 0 not null comment '0:locked ,1:rollbacking',gmt_create     datetime          null,gmt_modified   datetime          null
)charset = utf8mb4;create index idx_branch_idon lock_table (branch_id);create index idx_statuson lock_table (status);create index idx_xidon lock_table (xid);-- auto-generated definition
create table undo_log
(branch_id     bigint       not null comment 'branch transaction id',xid           varchar(128) not null comment 'global transaction id',context       varchar(128) not null comment 'undo_log context,such as serialization',rollback_info longblob     not null comment 'rollback info',log_status    int          not null comment '0:normal status,1:defense status',log_created   datetime(6)  not null comment 'create datetime',log_modified  datetime(6)  not null comment 'modify datetime',constraint ux_undo_logunique (xid, branch_id)
)comment 'AT transaction mode undo table' charset = utf8mb4;create index ix_log_createdon undo_log (log_created);
3.1.2.3. TCC模式

缺点:
TCC 是一种侵入式的分布式事务解决方案,需要业务系统自行实现 Try,Confirm,Cancel 三个操作,对业务系统有着非常大的入侵性,设计相对复杂。

优势:
TCC 完全不依赖底层数据库,能够实现跨数据库、跨应用资源管理,可以提供给业务方更细粒度的控制。

3.1.2.3.1. 实现

需要创建冻结数据表

-- auto-generated definition
create table account_freeze_tbl
(xid      varchar(255)  primary key,user_id varchar(255)  null,freeze_money   int default 0 null,status  int default 0 null
)charset = utf8mb3;-- auto-generated definition
create table order_freeze_tbl
(xid      varchar(255)  primary key,order_id varchar(255)  null,freeze_count   int default 0 null,freeze_money   int default 0 null,status  int default 0 null
)charset = utf8mb3;-- auto-generated definition
create table storage_freeze_tbl
(xid      varchar(255)  primary key,storage_id varchar(255)  null,freeze_count   int default 0 null,status  int default 0 null
)charset = utf8mb3;

seata v1.5.1 及之后,解决空回滚、幂等、悬挂,需要添加 useTCCFence = true,并且新增表 tcc_fence_Log。

@LocalTCC
public interface TccAccountService {@TwoPhaseBusinessAction(name = "account", commitMethod = "commit", rollbackMethod = "rollback",useTCCFence = true)String account(@BusinessActionContextParameter("userId") String userId,@BusinessActionContextParameter("money") int money,@BusinessActionContextParameter("type") int type) ;boolean commit(BusinessActionContext actionContext);boolean rollback(BusinessActionContext actionContext);
}

CREATE TABLE IF NOT EXISTS tcc_fence_Log
(xid VARCHAR(128) NOT NULL ,branch_id Bigint NOT NULL ,action_name VARCHAR(64) NOT NULL ,status TINYINT NOT NULL ,gmt_create DATETIME NOT NULL  ,gmt_modified DATETIME NOT NULL  ,PRIMARY KEY (xid,branch_id))
ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;

TCC分支事务状态:包含四种:已尝试、已提交、已回滚、空悬挂

3.1.2.3.2. 版本v1.5.1之前存在一些问题:
3.1.2.3.2.1. 空回滚、幂等、悬挂

参考前面的TCC。

3.1.2.4. SAGA模式

seata saga:https://seata.apache.org/zh-cn/docs/dev/mode/saga-mode
Saga模式是SEATA提供的长事务解决方案,在Saga模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务(执行处理的时候出错了,给一个修复的机会)都由业务开发实现。

参考前面的SAGA

3.1.2.5. 总结
  • XA模式 - 强一致性分阶段事务模式,牺牲了一定的可用性,无业务侵入
  • TCC模式 - 最终一致的分阶段事务模式,有业务侵入
  • AT模式 - 最终一致的分阶段事务模式,无业务侵入,也是Seata的默认模式
  • SAGA模式 - 长事务模式,有业务侵入

tips:

  1. 无业务侵入 - 不用写代码
  2. 有业务侵入 - 要写代码
3.1.2.6. 注意

TCC 写代码注意点:

  1. try阶段,你可以通过RootContext.getXID() 获取xid,但在rollback阶段,你只能铜鼓businessActionContext.getXid() 获取xid
  2. seata 1.5.1 之后,已经完善了,空回滚、悬挂、幂等 问题,你不需要在配了
  3. 使用seata事务,本地事务需要开启的,都要开启 @GlobalTransactional

3.1.3. 项目例子

seata例子,只有XA、AT、TCC模式

相关文章:

分布式事务 - 个人笔记 @by_TWJ

目录 1. 传统事务1.1. 事务特征1.2. 事务隔离级别1.2.1. 表格展示1.2.2. oracle和mysql可支持的事务隔离级别 2. 分布式事务2.1. CAP指标2.2. BASE理论2.3. 7种常见的分布式事务方案2.3.1. 2PC2.3.2. 3PC2.3.3. TCC2.3.3.1. TCC的注意事项:2.3.3.2. TCC方案的优缺点…...

解决前端笔记本电脑屏幕显示缩放比例125%、150%对页面大小的影响问题--数据可视化大屏

近期在工作中遇到一个问题,记录一下,在项目上线之后,遇到一个问题,即缩放到90%时,页面字体比默认的100%字体大,一开始毫无头绪,经过一番的Google...Google...Google....,终于找到了解…...

【PG-1】PostgreSQL体系结构概述

1. PostgreSQL体系结构概述 代码结构 其中,backend是后端核心代码,包括右边的几个dir: access:处理数据访问方法和索引的代码。 bootstrap:数据库初始化相关的代码。 catalog:系统目录(如表和索引的元数据…...

jq命令简易教程——Linux中处理JSON数据的利器

在shell脚本中,当我们需要对JSON数据(例如ceph、kubernetes等一些命令的输出,或是调用API获得的响应)进行处理和提取时,如果使用传统的文本三剑客sed、awk和grep,命令将会非常臃肿不可读。虽然这三个命令在…...

前端开发攻略---Vue实现防篡改水印的效果。删除元素无效!更改元素属性无效!支持图片、元素、视频等等。

1、演示 2、水印的目的 版权保护:水印可以在图片、文档或视频中嵌入作者、品牌或版权所有者的信息,以防止未经授权的复制、传播或使用。当其他人使用带有水印的内容时,可以追溯到原始作者或版权所有者,从而加强版权保护。 身份识…...

在Go语言中复制sync类型

sync包提供了基本的同步原语,例如互斥锁、条件变量和等待组。对于所有这些类型,有一个硬性规则要遵循:它们永远不应该被复制。让我们来理解下这个原理和可能发生的问题。 我们将创建一个线程安全的数据结构来存储计数器。它将包含一个map[string]int,表示每个计数器的当前值…...

Golang | Leetcode Golang题解之第25题K个一组翻转链表

题目&#xff1a; 题解&#xff1a; func reverseKGroup(head *ListNode, k int) *ListNode {hair : &ListNode{Next: head}pre : hairfor head ! nil {tail : prefor i : 0; i < k; i {tail tail.Nextif tail nil {return hair.Next}}nex : tail.Nexthead, tail my…...

【初学】前后端flask+vue组合GET案例

【CSDN 目录配置很不好用】 一、python配置 pip install flaskpip install flask-cors 二、vue配置 1.下载node.js 2.安装node.js 3.测试 node -v4.在vue项目文件夹中创建vue项目 npm create vue@latest第一次会安装一个东西,然后输入名称,一路回车 ✔ Project name…...

计算机科学与技术CS考研408资料

在github上整理了考研的一些资料&#xff1a; 内容包括&#xff1a; 参考书数据结构、组成原理、操作系统、计算机网络.408笔记PDF408思维导图408真题2009-2021真题无logo版408真题2029-2023王道真题&#xff08;持续更新&#xff09;历年真题考频统计灰灰考研择校&#xff0…...

ACID模型是什么

ACID模型是什么 ACID模型是数据库管理系统中保证事务处理安全性的一组特性。ACID是原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff09;和持久性&#xff08;Durability&#xff09;四个英文单词的…...

【Linux】基础IO----理解缓冲区

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;理解缓冲区 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! > 专栏选自&#xff1a;Linux初阶 > 望…...

java学习之路-继承

文章目录 前言 目录 1.1继承的概念 1.2继承有什么好处&#xff0c;为何要继承 1.3继承的语句 1.4父类成员的访问 1.4.1 子类中访问父类的成员变量 1.4.2 子类中访问父类的成员方法 1.5 super关键字 2.子类构造方法 2.1如何创建构造方法 2.2创建构造方法 3.super和this 【相同点…...

Linux系统——Elasticsearch企业级日志分析系统

目录 前言 一、ELK概述 1.ELK简介 2.ELK特点 3.为什么要使用ELK 4.完整日志系统基本特征 5.ELK工作原理 6.Elasticsearch介绍 6.1Elasticsearch概述 6.2Elasticsearch核心概念 7.Logstash介绍 7.1Logstash简介 7.2Logstash主要组件 8.Kibana介绍 8.1Kibana简介 …...

多协议接入视频汇聚EasyCVR平台vs.RTSP安防视频EasyNVR平台:设备分组的区别

EasyCVR视频融合云平台则是旭帆科技TSINGSEE青犀旗下支持多协议接入的视频汇聚融合共享智能平台。平台可支持的接入协议比EasyNVR丰富&#xff0c;包括主流标准协议&#xff0c;有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海…...

Spring Security Oauth2 之 理解OAuth 2.0授权流程

1. Oauth 定义 1.1 角色 OAuth定义了四个角色&#xff1a; 资源所有者 一个能够授权访问受保护资源的实体。当资源所有者是一个人时&#xff0c;它被称为最终用户。 资源服务器 托管受保护资源的服务器能够使用访问令牌接受和响应受保护的资源请求。 客户 代表资源所有…...

mysql题目4

tj11&#xff1a; select count(*) 员工总人数 from tb_dept a join tb_employee b on a.deptnob.deptno where a.dname 市场部...

GFS部署实验

目录 1、部署环境 ​编辑 2、更改节点名称 3、准备环境 4、磁盘分区&#xff0c;并挂载 5. 做主机映射--/etc/hosts/ 6. 复制脚本文件 7. 执行脚本完成分区 8. 安装客户端软件 1. 安装解压源包 2. 创建gfs 3. 安装 gfs 4. 开启服务 9、 添加节点到存储信任池中 1…...

最前沿・量子退火建模方法(1) : subQUBO讲解和python实现

前言 量子退火机在小规模问题上的效果得到了有效验证&#xff0c;但是由于物理量子比特的大规模制备以及噪声的影响&#xff0c;还没有办法再大规模的场景下应用。 这时候就需要我们思考&#xff0c;如何通过软件的方法怎么样把大的问题分解成小的问题&#xff0c;以便通过现在…...

如何在Linux部署MeterSphere并实现公网访问进行远程测试工作

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…...

postgis导入shp数据时“dbf file (.dbf) can not be opened.“

作者进行矢量数据导入数据库中出现上述报错 导致报错原因 导入的shp文件路径太深导入的shp文件名称或路径中有中文将需要导入数据的shp 文件、dbf 文件、prj 等文件放在到同一个文件夹内&#xff0c;且名字要一致&#xff1b;导入失败&#xff1a; 导入成功&#xff1a;...

StarUML笔记之从C++代码生成UML图

StarUML笔记之从C代码生成UML图 —— 2024-04-14 文章目录 StarUML笔记之从C代码生成UML图1.安装C插件2.准备好一个C代码文件放某个路径下3.点击Reverse Code选择项目文件夹4.拖动(Class)到中间画面可以形成UML5.另外一种方式&#xff1a;双击Type Hierarchy&#xff0c;然后…...

sizeof()和strlen

一、什么是sizeof() sizeof()是一个在C和C中广泛使用的操作符&#xff0c;用于计算数据类型或变量所占内存的字节数。它返回一个size_t类型的值&#xff0c;表示其操作数所占的字节数。 在使用时&#xff0c;sizeof()可以接收一个数据类型作为参数&#xff0c;也可以接收一个…...

Python学习笔记13 - 元组

什么是元组 元组的创建方式 为什么要将元组设计为不可变序列&#xff1f; 元组的遍历...

[leetcode]remove-duplicates-from-sorted-list-ii

. - 力扣&#xff08;LeetCode&#xff09; 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,3,4,4,5] 输出&#xff1a;[1,2,5]示例 2&…...

共享内存和Pytorch中的Dataloader结合

dataloader中通常使用num_workers来指定多线程来进行数据的读取。可以使用共享内存进行加速。 代码地址&#xff1a;https://github.com/POSTECH-CVLab/point-transformer/blob/master/util/s3dis.py 文章目录 1. 共享内存和dataloader结合1.1 在init中把所有的data存储到共享内…...

分享 WebStorm 2024 激活的方案,支持JetBrains全家桶

大家好&#xff0c;欢迎来到金榜探云手&#xff01; WebStorm公司简介 JetBrains 是一家专注于开发工具的软件公司&#xff0c;总部位于捷克。他们以提供强大的集成开发环境&#xff08;IDE&#xff09;而闻名&#xff0c;如 IntelliJ IDEA、PyCharm、和 WebStorm等。这些工具…...

Android OOM问题定位、内存优化

一、OOM out of memory&#xff1a;简称OOM&#xff0c;内存溢出&#xff0c;申请的内存大于剩余的内存而抛出的异常。 对于Android平台&#xff0c;广义的OOM主要是以下几种类型 JavaNativeThread 线程数的上限默认为32768&#xff0c;部分华为设备的限制是500通常1000左右…...

棋盘(c++题解)

题目描述 有一个m m的棋盘&#xff0c;棋盘上每一个格子可能是红色、黄色或没有任何颜色的。你现在要从棋盘的最左上角走到棋盘的最右下角。 任何一个时刻&#xff0c;你所站在的位置必须是有颜色的&#xff08;不能是无色的&#xff09; &#xff0c;你只能向上、下、 左、右…...

滑动窗口例题

一、209:长度最小的子数组 209:长度最小的子数组 思路&#xff1a;1、暴力解法&#xff1a;两层for循环遍历&#xff0c;当sum > target时计算子数组长度并与result比较&#xff0c;取最小的更新result。提交但是超出了时间限制。 class Solution {public int minSubArray…...

智过网:注册安全工程师注册有效期与周期解析

在职业领域&#xff0c;各种专业资格认证不仅是对从业者专业能力的认可&#xff0c;也是保障行业安全、规范发展的重要手段。其中&#xff0c;注册安全工程师证书在安全生产领域具有举足轻重的地位。那么&#xff0c;注册安全工程师的注册有效期是多久呢&#xff1f;又是几年一…...

以前老网站/长沙网站seo哪家公司好

1.npm install vue-cli -g 全局的 2.vue -V 检查vue版本 3.vue init webpack demo(项目名称) 4.一直回车 eslint test e2e 都不安装 5.npm run dev 6.npm run build 打包发布转载于:https://www.cnblogs.com/rxfn/p/10869444.html...

郑州做网站制作的公司/北京百度快速排名

一.类的静态成员变量&#xff0c;以及静态函数。 静态成员变量&#xff1a; 1.静态成员共享机制 2.静态成员局部属于类&#xff0c;它不是对象的成员&#xff0c;位于静态区。 3.静态成员变量需要在外部进行初始化。 静态函数&#xff1a; 1.静态成员函数都在代码区&…...

网站导航是什么/百度入口官网

做csdn很久了&#xff0c;听到粉丝问的最多的问题就是&#xff1a;有没有新的完整的项目&#xff0c;因为现在很多流传的项目都太老了&#xff0c;实战意义不是很强。很多程序员每项技术单独拿出来有可能很厉害&#xff0c;例如&#xff1a;Spring Cloud、Spring Boot、Redis、…...

做旅游网站怎么样/今日搜索排行榜

利用多张影像对小物体进行拍摄&#xff0c;进而进行三维重建&#xff0c;是计算机视觉中的重要问题之一。 目前对此研究最全面的网站是&#xff1a;http://vision.middlebury.edu/mview/eval/ 目前最优秀的算法是Furukawa的PMVS2&#xff1a;http://www.di.ens.fr/pmvs/ 目前…...

男人和女人做受吃母乳视频网站免费/南宁百度seo公司

python 中时间格式转换 import time, datetime时间戳 时间戳转时间 timestamp time.time() # 当时时间下的时间戳 zerotimestamp datetime.datetime.utcfromtimestamp(time.time()) # 当时时间戳下巴黎时间计时的时间戳在时间戳上利用秒计时来实现时间的加减&#xff0c; …...

北京网站优化怎么样/免费seo搜索优化

数据结构(一) 1. 概述 数据结构定义: 我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(如元素的CURD、排序等)而执行的相应操作&#xff0c;这个相应的操作也叫算法。 数据结构 元素 元素的关系 算法…...