自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(60)
  • 收藏
  • 关注

原创 Seata分布式事务

这里以 Dubbo + Seata 为例,微服务架构体系是分布式事务的常见运用场景,多个微服务分散到不同的机器上,通过远程调用串联起来,此时如何使用Seata建立起分布式事务呢?Seata的AT模式做到了业务上的0侵入性 ,这点就要比TCC好很多。微服务一般有一个调用发起方,如下图所示就是Business,其通过RPC调用Storage、Order、Account等多个微服务。

2023-11-20 15:48:46 255

原创 TCC分布式事务----以Hmily框架为例

先引入一个插曲,RocketMQ为什么要有Half Message为什么不在本地事务提交之后,直接发一个commit消息不就行了,为什么还要先发一个可以撤回的、不能被消费的half message,再执行本地事务呢?这其实是一种状态转移:Producer把事务开始执行这个状态转移到了RocketMQ的Server,这样一来,即使Producer再执行完本地事务之后进行重启,Server由于已经根据halfMessage知道了这个事务执行的状态,所以会去主动轮询Producer。

2023-11-10 16:58:31 226

原创 本地消息表分布式事务

论文链接:https://queue.acm.org/detail.cfm?id=1394128里面提到,也就是说,实现本地消息表的最关键因素是这个本地消息表要和业务数据表位于同一个事务,这样一来,即使不进行2PC,也能保证业务执行成功,消息也会随之发送出去如下图,Insert和两个QueueMessage是一定同时成功,同时失败的。

2023-11-09 16:55:55 157

原创 《深入理解分布式事务:原理与实战》读书笔记

行锁升级表锁:如果不是索引查找,或者索引失效,此时需要全表扫描,会升级为锁整张表。为什么Mysql要把扫描到的每一行以及其间隙都加锁?这是为了防止幻读出现。幻读导致的问题是破坏了一致性声明,并且导致binlog混乱。

2023-11-06 16:17:06 212

原创 高并发系统设计

横向扩展,分散流量,分布式集群部署缺点:引入复杂度,节点之间状态维护,节点扩展(上下线)

2023-11-05 22:02:34 359

原创 操作系统学习与思考

x86是因特尔8086代芯片的CPU总线位数以及寄存器种类的规范,大部分操作系统都是以该规范作为基准来生产的。

2023-11-05 22:02:01 274

原创 dubbo协议与triple协议的对比

在一些大文件传输、直播等应用场景中,consumer 或 provider 需要跟对端进行大量数据的传输,由于这些情况下的数据量是非常大的,因此是没有办法可以在一个RPC 的数据包中进行传输,因此对于这些数据包我们需要对数据包进行分片之后,通过多次 RPC 调用进行传输,如果我们对这些已经拆分了的 RPC 数据包进行并行传输,那么到对端后相关的数据包是无序的,需要对接收到的数据进行排序拼接,相关的逻辑会非常复杂。生成好之后,需要导出的接口的实现需要继承自生成的DubboxxxTriple类。

2023-10-09 20:22:37 292

原创 Docker源码阅读总结

Docker源码概览

2023-04-18 22:02:57 1658 1

原创 Java类加载

Java类加载

2022-11-09 14:29:25 391

原创 Tomcat 连接器组件及IO模型

tomcat IO模型

2022-11-02 22:09:46 300

原创 Redis分片

Redis分片机制

2022-10-10 20:38:59 439

原创 MongoDB分片机制

MongoDB分片

2022-10-10 18:18:51 871

原创 Redis过期键的删除策略及持久化机制

redis

2022-09-27 10:53:59 725

原创 Redis数据结构设计详解

Redis数据结构

2022-09-26 17:36:59 810

原创 跳表论文解读

跳表

2022-09-25 22:31:13 335

原创 具有容错功能的键值对存储服务

该项目是Mit6.824的开源lab的实现,主语言为go该项目是一个键值对存储服务器,其服务端代码可以部署在多台机器上(2n+1台机器可以容忍n台机器宕机而不影响服务的可用性).当有多个客户端在网络不可靠,并且服务可能崩溃的情况下同时请求该服务器时,依旧可以保证返回结果的线性一致性

2022-09-21 10:36:56 212

原创 分布式一致性算法:Raft

Raft算法的介绍与实现

2022-09-09 17:56:30 491

翻译 MongoDB建模场景

谈到MongoDB,一个经常被问到的问题是:"我如何在MongoDB中为我的应用程序构建模式?" 诚实的回答是,这取决于。你的应用程序做的读比写多吗?从数据库中读取时,哪些数据需要在一起?有哪些性能上的考虑?文件有多大?它们会变得多大?你预计你的数据将如何增长和扩展?所有这些问题,以及更多的问题,都会影响到如何在MongoDB中设计一个数据库模式。有人说,MongoDB是无模式的。事实上,模式设计在MongoDB中是非常重要的。一个铁的事实是,我们所发现的大多数性能问题都可以追溯到糟糕的模式设计。...

2022-07-15 11:48:49 747

原创 Java游戏服务器架构的并发问题及解决方案

问题一:当A,B同时攻击C时,需要对C进行减血逻辑。如果A,B是在不同线程执行这个逻辑的,那么会引发C的血量异常问题。解决方案:将减血逻辑放在一个单独的线程执行。具体操作为,首先,创建一个MainMsgProcessor的单例工具类public class MainMsgProcessor { static final MainMsgProcessor instance = new MainMsgProcessor(); private MainMsgProcessor(){

2022-04-10 19:03:18 4417 2

原创 Database---Access Methods

我们需要考虑以下两个核心点:1.数据组织:我们怎样在内存/页中布局我们的数据结构?我们应该存储哪些信息来支持高效查询呢?2.并发:我们怎样允许多个线程访问数据库而不造成问题呢?Hash 概述在这种模型下, 数据库使用Hash Table 来保存Tuple而Hash Table 通常包括两部分:Hash 函数和Hash SchemeHash Scheme是当我们在我们的hash table中遇到hash碰撞时,我们处理问题的机制或步骤。Hash函数可以接受进行任意类型的输入,并返回一个固定长

2022-04-07 13:37:48 224

原创 Operating Systems Principles and Practice 2——The Programming Interface

Process management我们当然可以在内核中为用户实现一切,但是在今天,程序可以创建并管理诸如界面管理,web服务器,shell命令行等进程,这些程序的源码可以直接控制一些系统,数据库,编译器。一个早期的动机去管理用户进程是去允许开发者在shell上写自己的命令。shell是个任务控制系统...

2022-03-25 11:06:32 334

原创 Operating Systems Principles and Practice 2——The Kernel Abstraction

进程的抽象:什么是进程?它和程序之间有什么区别?程序可以被编译器转化为可执行的映像(就是一个文件,里面有机器指令以及执行这些指令所需要的数据),而操作系统会将可执行映像拷贝到物理内存。操作系统首先开辟一个栈来承载本地变量的相关状态,同时也会开辟一块空间叫做堆来动态的为数据结构和程序开辟空间。一旦一个程序被载入内存,操作系统可以通过设置该程序的栈顶指针并跳转到该程序的第一条指令来执行它。为了运行多个相同指令的拷贝,操作系统可以拷贝多份这样的指令 +栈+堆+静态数据的组合。因此,一个进程是一个程序的实例,就好

2022-03-12 21:44:44 562

原创 JVM知识体系——JVM入门及class文件格式

java从编码到执行xxx.java,当运行javac xxx.java后,xxx.java就被Java编译器编译为xxx.class文件,xxx.class是一个字节码文件,当运行java xxx.class后,xxx.class字节码文件会连同一些java类库被classloader一同记载入内存中,随后,JVM就会登场,JVM会对字节码进行解释,以及使用JIT即时编译器提高热点代码的执行效率,最后通过执行引擎与操作系统对接,完成Java文件的执行。JVM:从跨平台的语言到跨语言的平台JVM上可以

2022-02-28 21:27:33 400

原创 操作系统——进程

cpu管理的直观想法我们知道,cpu在通上电以后,只需要给cpu一个起始地址(pc),它就可以不断的进行取指令,执行指令的操动作。考虑这样一种情况:cpu取出一条指令,发现这是一条io指令,需要等待io操作,磁盘调度。那么cpu该怎样做呢?如果是干等着,cpu在整条指令的执行过程中是会有空闲时期的,这就导致cpu利用率的降低。如果先执行下面的指令呢?也不行,因为有时候下面指令的执行是需要依赖io结果的。于是,为了提高cpu的利用率,我们引出了多条程序并发执行:当程序A执行过程中被io阻塞了,cpu可以立刻

2022-02-28 14:57:18 577

原创 操作系统——IO与文件系统

如何让外设工作当敲击键盘时,会将对应字符存入键盘的寄存器,随后会向cpu发送中断,cpu取到寄存器的数据后向显卡的寄存器发送写命令,将该数据写入到显卡的寄存器中。最后显卡将该数据写入显存,屏幕上就会显示出结果。让外设工作需要如下几点1.操作系统要为用户提供一个简单的文件视图,用来使得不同硬件都有一个统一的接口 2.向对应的外设寄存器发送out指令3.外设执行完任务后中断cpu...

2022-02-24 14:22:30 613

原创 HTTPS理解

HTTPS即为HTTP+SSL/TLS首先了解几个概念1.对称加密对话双方使用相同的密钥对数据进行加密,解密缺点:容易被第三方拦截从而造成数据的泄漏,篡改。2.非对称加密服务端提供一对密钥:公钥和私钥。公钥加密的数据只能被私钥解密,私钥加密的数据只能被公钥解密。服务端自己保留私钥,而将公钥传给客户端。客户端拿公钥加密数据后传给服务端。这样第三方由于没有私钥无法解密,而服务端可以拿私钥进行解密。缺点:客户端无法直到这个公钥是否是真正的服务端的公钥。第三方可以拦截这个公钥,将其篡改为自己的公钥。当

2022-02-14 18:31:47 144 1

原创 计算机网络——链路层知识总结

链路层提供的服务使用链路层协议,将IP数据报通过单一通信链路 从一个节点移动到相邻节点。服务包括1.成帧在网络层数据报经链路传送之前,都要将其用链路层帧封装起来。一个帧由数据字段和首部字段组成,而网络层数据报就插在数据字段中2.链路接入MAC协议规定了帧在链路上的传输规则。当有多点共享一条链路时,MAC用于协调这些节点的帧传输。3.可靠交付链路层的可靠交付服务主要提供在易于产生高差错率的链路上,例如无线链路。其目的是本地纠正一个差错,而不是迫使端到端的数据重传。许多有线的链路层协议不提供该服务

2022-02-14 16:04:57 2818 2

原创 计算机网络---网络层:控制平面知识总结

控制平面工作的两种可能方法1.每路由器控制(传统方法)每台路由器中都运行一种路由选择算法。每台路由器中都拥有一个路由选择组件,用于与其他路由器中的路由选择组件通信,以计算转发表的值2.逻辑集中式控制(SDN方法)由逻辑集中式控制器计算并分发转发表以供每台路由器使用。这种情况下每台路由器中都有一个控制代理,这个代理负责与控制器进行交互以及执行相关命令。不同路由器的控制代理不能相互交互,也不能主动参与计算转发表。路由选择算法路由选择算法有三个分类标准标准一:集中式路由选择算法/分散式路由选择算法

2022-02-11 19:16:00 647

原创 计算机网络——网络层:数据平面知识总结

网络层概述在发送方,网络层取得运输层的报文段并 将其封装为一个数据报,然后向相邻路由器发送数据报。在接收方,网络层接收来自相邻路由器中的数据报,提取出运输层报文段,并将其交给运输层。每台路由器的数据平面的主要作用是从其输入链路向其输出链路转发数据报。控制平面的主要作用是协调这些本地的每路由器的转发动作。网络层有两个十分重要的功能1.转发转发是指将分组从一个输入链路接口转移到适当的输出链路接口的路由器本地动作。转发发生的时间尺度很短,通常为几纳秒,因此通常用硬件来实现。2.路由选择路由选择是指

2022-02-09 15:11:06 1225

原创 计算机网络——传输层知识总结

多路复用与多路分解网络层提供的是主机到主机之间的逻辑通信传输层提供的是应用程序之间(进程之间)的逻辑通信多路复用:收集不同socket的数据块,并为其封装上首部信息,传递给网络层多路分解:从网络层拿到数据块,标识出套接字进而将其定向到该套接字并交付给传输层UDP的套接字是由二元组标识的,即IP地址与端口号。当两个套接字具有相同的目的IP与目的端口号,那么他们将被定向到同一个socket。源端口号和源IP的作用是用来区分返回地址。而TCP的套接字是由四元组标识的udpudp的优点:采用udp

2022-02-06 18:53:04 1912

原创 从阻塞式IO到epoll——IO精讲

Linux虚拟文件系统的理解VFS 是一棵树, 树上的节点可以映射到对应的物理位置与之对应的,什么是实际上的文件系统呢,比如说Windows操作系统上的,D盘对应的就是那块磁盘,C盘对应的就是这块磁盘.VFS中, 每一个文件都一个唯一的inode号来代表它读文件时内存会在内存中开辟一个pagecache页缓存随后应用程序对文件的操作就是对页缓存的操作页缓存会变脏,此时可以手动把它持久化入磁盘,也可以等待操作系统统一持久化,但后者可能会引起数据的丢失(没刷之前断电)挂载在Linux中运行df命

2022-02-03 16:23:22 573

原创 Eureka的搭建与场景模拟

Eureka 搭建过程在我们的开发中经常会遇到这样的场景:服务的提供方提供给服务的消费方其所需要的数据。而如果服务的提供方的端口号发生变化的话,消费方的端口也需要随之发生改变。那么有没有这样一种方式,能够将提供方的端口信息注册到第三方中,消费方需要的时候直接去第三方中取出即可。而提供方的端口发生改变时第三方也会记录这个改变?这便是Eureka的功能,即一个服务注册与发现的组件我们现在就来模拟实现一下Eureka的工作过程首先先用SpringBoot迅速搭建消费方和生产方我们用货物进行模拟生产方

2021-11-05 21:10:19 139

原创 关于线程池中Worker对象的理解

Worker实现了两个接口,一个是AQS,另一个是Runnable。这意味着它既是一把锁,又同时是一个任务。这个对象里面包裹的有线程,并且有一个Runnable。且这个线程是线程工厂创建的。这个线程的start方法中的runnable参数为this,即这个worker,这也就意味着Worker内部的Thread的start()方法启动后,会执行这个Worker的run方法,而Worker的run方法又会调用runWorker()方法,runWorker方法会用刚刚创建的线程执行Worker里面封装的Runn

2021-09-28 20:41:41 501

原创 Spring 配置文件加载过程

Spring配置文件的加载主要是在loadBeanDefinitoin方法中进行的而这个方法又非常之复杂,我们本篇博客的目的就是详细讲解这一方法this.loadBeanDefinitions(beanFactory);点进去 protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException { XmlBeanDefinitio

2021-09-12 21:10:47 1869

原创 Spring启动流程详细概述

上篇博客我们对Spring的大概流程进行了一个阐述Spring源码流程剖析这篇博客主要讲Spring的启动流程首先开始debug,进入构造方法 public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, @Nullable ApplicationContext parent) throws BeansException { super(parent); this.

2021-09-06 21:40:25 3833

原创 相对路径与绝对路径

2021-09-02 16:48:13 50

原创 Spring源码流程剖析

Spring的启动类为new ClassPathXmlApplicationContext从这个构造方法入手,开始debug之后会进入到Spring的一个非常重要的方法:refresh public void refresh() throws BeansException, IllegalStateException { synchronized(this.startupShutdownMonitor) { StartupStep contextRef

2021-09-01 21:23:00 651

原创 在浏览器输入URL后发生了什么

在主机端输入www.baidu.com后首先,输入的是一个域名,因此基于dns域名转IP,端口默认是80接着,进行封装。(1)应用层:应用程序(浏览器)封装请求为HTTP协议的数据(2)传输层:操作系统封装一个TCP首部(TCP协议数据)包裹在外面,包含端口号(三次握手)(3)网络层:操作系统封装一个IP协议首部(IP协议数据),包含IP地址(4)数据链路层:封装以太网协议的数据,包含MAC地址以上数据:源端口:主机的浏览器端口目的端口:百度服务器主机进程端口:80源IP:主机A的局域网

2021-07-17 15:51:23 73

原创 Linux文件搜索命令

文件搜索命令:find(服务器高峰期不建议使用)精准搜索:在etc文件夹中寻找名字为init的文件,多一个字或者少一个字都不行模糊搜索:使用通配符-name如果改为-iname,那么会进行不区分大小写的查找我们应把单位换算为数据块,数据块是Linux系统中最小单位文件属性:使用ls-l可以看到的内容文件内容:文件内部的增删改查查找以init开头的,且文件类型位目录的文件花括号表示查询的多个或一个结果,表明对该结果进行命令操作.注意结尾分号和花括号与/之间的空格例:

2021-07-17 15:51:09 90

原创 SpringBoot

1.项目创建:使用本地maven项目进行创建<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://m

2021-07-17 15:50:54 67

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除