自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 写一个系统模拟Gossip实现,理解Gossip协议

Gossip是一种去中心化的通信协议,节点通过随机选择其他节点进行信息交换,以类似病毒传播的方式在网络中扩散数据,最终实现快速、容错性强的分布式一致性或状态同步。本篇文章先简要介绍一下Gossip协议的基本概念,再通过借鉴Gossip思想,实现一个单机下多线程模拟多节点计算平均数的例子带大家更好的理解它。

2024-11-28 21:52:39 1440

原创 SpringWebFlux实现即时IM,附带执行流程源码解析

为什么用SpringWebFlux?相对于SpringWebFlux,另一个更为大家所知的就是SpringMVC,我们在日常开发中使用到的SpringMVC,往往做的是同步的通信,服务端从接收请求到返回结果需要完整的业务流程的等待,而SpringWebFlux作为异步非阻塞框架,服务端对于所有的请求处理都是基于Reactor模型的,虽然客户端仍然需要同步等待(取决于客户端的设计是否同步),但是服务端无需维护一个线程等待业务完成,这意味着我们可以用springWebFlux实现一个即时IM

2024-11-20 16:58:24 1179

原创 自己写一个分布式定时任务框架+负载均衡+OpenAPI异步调用

定时任务框架+负载均衡+消息队列,谁说定时任务调度无法高并发?

2024-11-13 15:30:50 1084

原创 用go从零构建写一个RPC(4)--gonet网络框架重构+聚集发包

在追求高性能的分布式系统中,RPC 框架的底层网络能力和数据传输效率起着决定性作用。经过几轮迭代优化,我完成了第四版本的 RPC 框架。相比以往版本,这一版本的最大亮点在于 **重写了底层网络框架** 和 实现了**发送端的数据聚集机制**,这使得框架在高并发、高吞吐场景下表现更稳定、更高效。本文将重点介绍这两个新功能的设计动机、技术选型与实现细节。

2025-06-02 17:00:46 1255

原创 用go从零构建写一个RPC(3)--异步调用+多路复用实现

在已有基础通信、连接池与序列化机制之上,通过引入异步发送机制与多路复用技术进一步提升RPC系统的吞吐量与并发性能,使得系统更加健壮。多路复用实际上也是http2.0实现的能力,这里相当于完成了http2.0的任务。以后的版本可以考虑对于性能再进行优化,如网络框架的改进以及更高效的数据结构的使用

2025-05-24 21:10:07 1098

原创 用go从零构建写一个RPC(2)--连接池与长连接引入

在版本1中,虽然系统能够满足基本需求,但随着连接数的增加和处理请求的复杂度上升,性能瓶颈逐渐显现。为了进一步提升系统的稳定性、并发处理能力以及资源的高效利用,版本2引入了三个重要功能:**客户端连接池、服务器长连接以及服务器处理业务逻辑时引入的协程池,主要是为了更好的利用资源和提高系统的稳定性**。这些功能的引入,使得系统在面对大规模连接和高并发请求时,能够更好地应对。

2025-05-10 19:56:25 1165

原创 用go从零构建写一个RPC(1)--Client端基础功能

为了实现RPC的效果,我们调用的Hello方法,即server端的方法,应该是由代理来调用,让proxy里面封装网络请求,消息的发送和接受处理。而上一篇文章提到的服务端的代理已经在.rpc.go文件中实现,我们将客户端的实现也写在这里现在version1开发完了,目前的版本主要是实现基础功能,并且为了考虑后续的扩展性做了比较多的解耦,在后面的版本,我们可以逐渐提升这个rpc的性能和融入更多的功能

2025-05-07 22:36:18 656

原创 用go从零构建写一个RPC(1)--Server端基础功能

希望借助手写这个go的中间件项目,能够理解go语言的特性以及用go写中间件的优势之处,同时也是为了更好的使用和优化公司用到的trpc,并且作者之前也使用过grpc并有一定的兴趣,所以打算从0构建一个rpc系统,对于生产环境已经投入使用的项目抽丝剥茧后,再从0构建,从而更好的理解这个项目和做一个RPC需要注意的地方打算分为多个版本,从最基本的功能,到逐渐加入新功能和新特性,不断的完善。其中也有一些作者本身的思考优化,其中不足和有误之处还望大家指正

2025-04-26 23:51:39 1325

原创 ClickHouse架构理解与分布式场景

- 首先是engine,存储引擎的选择,ck支持不同表选择不同引擎后面详细说说这个引擎- PARTITION,这里是分区的概念,指明分区的键,ck中是每一个区为一个文件,一般对于大数据使用按天分区,这样扫描某一天数据的时候,只需要找到某一个分区,减少了扫描的数据量- ORDER BY,这个是建表的时候必填的,他决定了物理存储的顺序,同时order的每一个键也是主键(主键可以多个且没有唯一约束)- index_granularity这个是索引的粒度,每一个主键有一个索引,这里是稀疏索引,默认数量是819

2025-03-15 18:05:44 906

原创 Redis集群理解以及Tendis的优化

Tendis架构:存储层使用RocksDB(gossip最终一致性),缓存层redis分片集群,通过RDB和AOF实现两个层的同步,中间用多个Queue保证同一个slot的操作落在同一个Queue中,保持时序一致,即同步层,并且使用rcoksDB,天然支持aof这种增量写的日志处理和mysql的优点: 1. 缓存一致性无需保证,Tendis是同步层用aof持续持久化到存储层,并定期检查aof的指针位置 2. 部分内存数据可以落盘,避免内存占用,传统的redis为了RDB的子进程fork,需要预留一半

2025-02-02 17:15:45 1564

原创 MapReduce,Yarn,Spark理解与执行流程

- 1-5的步骤较为简单,就是**创建一个container用于生成application master**。具体是资源管理器收到调用它的submitApplication()消息后,便将请求传递给 YARN调度器(scheduler)。调度器分配一个容器,然后资源管理器在节点管理器的管理下在容器中启动application master的进程- 接下来,它接受来自共享文件系统的、在客户端计算的输入分片(步骤7)。然后**对每一个分片创建一个 map任务**对象以及由mapreduce.job.reduc

2025-01-26 23:31:39 1920 2

原创 对于RocksDB和LSM Tree的一些理解,以及TiDB架构初识

- HBase、LevelDB,rocksDB(是一个引擎)底层的数据结构是LSM Tree- 适合写多读少的场景,都是追加写入内存中的MemTable,写入一条删除(或修改)标记,而不用去访问实际的数据,从而大大提高写的速度- 追加顺序写(innodb的页是随机的)- sst和memTable有序是为了compact,范围查询,key 的有序性可以让我们对sst其进行增量编码、indexblock的页目录

2025-01-25 22:37:06 1227

原创 AQS公平锁与非公平锁之源码解析

1. cas失败两次会进行阻塞,2. 链表中持有锁的节点就是头节点3. 唤醒意味着该节点重新参与竞争锁,因为如果是非公平锁仍需要竞争4.链表的头节点不记录线程信息但是状态为SIGNAL5. 获取后继节点,如果判断这个后继节点是null或者是cancel状态,说明该节点已经失效,那么就会**从尾部开始向前找最接近头部的SINGAL节点或者状态是0的节点(那就是在队尾)

2025-01-21 20:01:10 764

原创 RocketMQ刷盘机制------源码解析

同步刷盘其实也是用回调(批量刷只能用回调),只是回调的时机不同,若开启同步,则有run方法一直刷盘,刷完执行回调。若异步则是缓冲区满了才刷,但是写到缓冲区时立即执行回调,所以这里的磁盘IO使得broker有性能区别,但是对于调用过程中的线程资源来说,因为是回调,其实发起请求的线程在返回future后就释放了,全是异步处理,后续回调都是用线程池,所以对于线程的使用是一样的,rocketMQ这样设计,可以避免所有请求进来,使用get阻塞,浪费大量的线程资源

2025-01-13 23:46:05 1177

原创 RocketMQ消息发送---源码解析

我们知道rocketMQ的消息发送支持很多特性,如同步发送,异步发送,oneWay发送,也支持超时机制,回调机制,并且能够保证消息的可靠性和消息发送的限流,底层使用netty框架等等,如此多的特性,我们跟进源码来详细看看

2025-01-12 22:54:42 1090

原创 Mybatis源码之整合Spring,以及Mapper的执行流程跟进

Mybatis和Spring的整合,主要根据自动装配实现的,通过一些Bean的处理,最终将Mapper的代理对象注入容器中Mapper的调用过程,通过代理对象实现,代理对象的增强中,会让我们调用splsession(实际上是SqlsessionTemplate)的对应crud方法,SqlsessionTemplate也是通过代理对象,创建并管理sqlsession的生命周期,并实际调用sqlsession的crud,从而进入Executor操作数据库

2025-01-06 23:20:50 1018

原创 Spring与响应式编程

对于长时间的服务间调用和数据库交互,在响应式中可以通过响应式的数据库驱动和WebClient来解决,他们都是非阻塞的,订阅者订阅数据源后即可释放线程,所以对于这种场景响应式更有优势同样,对于高并发的操作,假如有多个消费者需要传感器的数据,我们只需要在服务端返回SSE类型数据即可,假如我们使用MVC,比如Controller返回一个defferResult,我们不可避免的需要占用一个servlet里面的线程来执行订阅,以及写回响应时也需要获取一个servlet容器里面的线程,所以对于大量请求的场景,响应式

2024-12-28 17:50:16 1248

原创 PowerJob源码解析------调度流程

PowerJob由调度中心(powerjob-server)和执行器(powerjob-worker)构成,server负责任务的获取与调度,worker负责任务的执行和具体执行逻辑,调度中心是一个基于 SpringBoot 的 Web 应用,而worker是一个普通Jar包,我们作为依赖导入项目进而定义任务逻辑,worker和server之间维护着心跳并且均支持集群部署

2024-12-26 18:10:45 1456

原创 PowerJob源码解析------启动流程

PowerJob由调度中心(powerjob-server)和执行器(powerjob-worker)构成,server负责任务的获取与调度,worker负责任务的执行和具体执行逻辑,调度中心是一个基于 SpringBoot 的 Web 应用,而worker是一个普通Jar包,我们作为依赖导入项目进而定义任务逻辑,worker和server之间维护着心跳并且均支持集群部署

2024-12-24 16:49:50 1368

原创 小傅哥 Small-Spring 解读与总结(下)包括SpringBoot启动

小傅哥 Small-Spring 个人解读与总结,希望能给大家带来更好对于Spring框架的学习效果。包括SpringBoot的启动。

2024-12-03 13:53:12 1230

原创 小傅哥 Small-Spring 解读与总结(上)

小傅哥 Small-Spring 个人解读与总结,希望能给大家带来更好对于Spring框架的学习效果。

2024-12-02 22:17:09 1248

原创 实现一个简易的AI流式对话,模拟ChatGPT(SpringBoot+Vue2)

我们如何实现一个AI流式输出?目前的AI对话接口大多都附带有流式输出接口,但是后端接收到的数据是流式的,我们仍需要处理数据流并返回给前端,让前端显示流式的效果。试着实现一个简易的AI流式对话,模拟chatgpt(SpringBoot+Vue2)

2024-11-24 21:46:27 4548 8

空空如也

空空如也

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

TA关注的人

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