自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 dubbo服务连接管理分析

dubbo是高性能的rpc框架,而选型时,通常会认为其适用的场景是高qps、小包请求,这种说法的基本逻辑是 dubbo是共用连接的,如果单个请求过慢 或者 包体过大,会造成连接资源竞争,进而导致性能下降。那如果已经用了dubbo,而确实请求的包体较大(例如我这里的500k),那么具体会有什么影响呢?本文从这个角度去分析dubbo在连接管理相关的逻辑。

2024-02-26 14:43:57 370

原创 mysql到oracle的ddl迁移

从目标库(mysql)导出一套完成的表结构到源库(oracle)

2024-02-21 22:39:28 232

原创 mybatis的xml解析为sql流程分析

将xml解析成sql的关键逻辑解析

2024-02-21 22:25:46 783

原创 SSE(server-sent event) - springboot示例

Server-Sent Events(SSE)是一种用于实现服务器向客户端实时推送数据的Web技术。与传统的轮询和长轮询相比,SSE提供了更高效和实时的数据推送机制。SSE基于HTTP协议,允许服务器将数据以事件流(Event Stream)的形式发送给客户端。客户端通过建立持久的HTTP连接,并监听事件流,可以实时接收服务器推送的数据。

2023-07-10 20:27:32 142

转载 Mybatis-Plus整合多数据源

Mybatis-Plus整合多数据源

2023-07-06 14:12:15 165

原创 zeebe的任务队列

zeebe的代码都是异步化处理的,整个项目中都是个中任务的封装,并提交到线程池中处理,任务队列在其中是很重要的一部分,zeebe也有不同维度的多个任务队列,在此梳理下。

2023-07-05 18:25:46 186

原创 zeebe的数据持久化 snapshot-runtime (RocksDB)

snapshot是周期性创建的,仅通过snapshot是无法恢复 在创建snapshot之后产生的事件,因此还需要从日志取出日志回放,完成整个运行状态的恢复。snapshot 通常用于读操作,它表示一个 DB 在某一时间点的一份快照,即一份只读的、不可变的 DB 数据。snapshot是所有运行中的event的投影,代表了当前进程的运行状态,其中包含了所有的active data,例如:已部署的流程、运行中的流程实例、还未执行完的jobs。此操作将 checkpoint 写入到文件系统中指定位置。

2023-07-03 19:48:22 173

原创 zeebe的job超时重试机制

在断电测试中,发现client端拉取job时,若在job执行过程中server端服务宕机(client未发送completeCommand到server端),重启server端后,刚执行到一半的任务会重新执行,而且一般是在server端重启后5分钟左右重新执行, 针对这一现在分析zeebe代码实现的原理。每次activeJob时,会往deadline的列簇中插入数据,之后周期性轮询其中的记录是否超时,取出超时的任务进行对应的处理。,该设置就是重试在5分钟之后执行的原因。此处对应的处理逻辑较为简单,即。

2023-07-03 15:19:39 193 1

原创 zeeb中exporters 导出数据的position管理

该方法是获取对应的exportedId对应的position信息,最终实际是从rocksDB进行获取对应的数据(io.camunda.zeebe.broker.exporter.stream.ExportersState#findExporterStateEntry)此处更新position都是异步执行的,最终执行的方法是:io.camunda.zeebe.broker.exporter.stream.ExporterContainer#updateExporterState(long, byte[])

2023-06-29 20:50:04 100 1

原创 zeebe中exporters 代码分析

数据导出器的顶层接口:io.camunda.zeebe.exporter.api.Exporterio.camunda.zeebe.broker.Broker#buildExporterRepository取出exporters的配置,并遍历加载数据最终调用 io.camunda.zeebe.broker.exporter.repo.ExporterRepository#validate 做实例创建、配置校验io.camunda.zeebe.broker.exporter.stream.Export

2023-06-29 20:32:47 1631 1

原创 zeebe-client 端代码

JobWorker的默认实现为 io.camunda.zeebe.client.impl.worker.JobWorkerImpl#JobWorkerImpl。此时各项参数采用默认配置,具体配置的数值参见 io.camunda.zeebe.client.impl.ZeebeClientBuilderImpl。JobWorker的核心方法为 io.camunda.zeebe.client.impl.worker.JobWorkerImpl#poll。0.3倍的最大jobs活跃数(该值默认为32)

2023-06-29 19:47:32 207 1

原创 zeebe-拉取、执行任务主流程源码分析

发送response的方法:io.camunda.zeebe.gateway.impl.job.InflightActivateJobsRequest#tryToSendActivatedJobs。上述的handler.accept 方法调用的上述的lambda方法(注意debug位置),而其中的handler.apply 方法对应的则是(activateJob流程中)JobIntent 的枚举: io.camunda.zeebe.protocol.record.intent.JobIntent。

2023-06-28 23:56:44 454 1

原创 conductor数据可靠性分析——redis异常时的服务功能可用性梳理

如果redis异常,conductor是什么表现?对应的redis key为: conductor_zlcft.test.WORKFLOW_DEF_NAMES conductor_zlcft.test.WORKFLOW_DEF.coreSatelliteOpen。其对应的配置类为:com.netflix.conductor.contribs.listener.archive.ArchivingWorkflowListenerConfiguration。

2023-05-25 20:49:55 180

原创 orkes-conductor源码分析

个人认为,这是对conductor能力的增强,能在编排场景解决一些对执行耗时有一定要求的场景,但不不应作为主要场景使用,server端调用、递归执行,都会增加server端的负载。该版本在conductor进行了二次开发,目前验证发现其http task的执行非常高效,从这个角度发出分析下其实现原理(原生的http task的实现可参考。orkes-conductor 的http-task的执行相比于原生conductor高效的原因是。)是接收一个http请求开始的,会同步调用到。该方法是任务调度的核心,

2023-05-25 20:10:55 186

原创 conductor server端源码解析(5)-注册、启动一个流程

该方法会判断workflow的input和output数据大小是否需要外部存储(5M~10M),将数据存入都外部存储中 com.netflix.conductor.core.utils.ExternalPayloadStorageUtils#uploadHelper。所有的系统任务管理在 com.netflix.conductor.core.execution.tasks.SystemTaskRegistry。3.调度任务,执行系统任务,将异步执行的系统任务和用户自定义任务push到队列中。

2023-05-25 19:54:31 195

原创 conductor server端源码解析(4)-任务的调度

conductor调度的核心是decider service,其根据当前流程运行的状态,解析出将要执行的任务列表,将任务入队交给worker执行。

2023-05-23 21:32:31 119

原创 conductor server端源码解析(3)-systemTask

具体的执行过程见 com.netflix.conductor.core.execution.tasks.SystemTaskWorker#pollAndExecute。其中具体的任务执行为:com.netflix.conductor.core.execution.tasks.WorkflowSystemTask#start。所有的系统任务实现注册于 com.netflix.conductor.core.execution.tasks.SystemTaskRegistry。

2023-05-23 21:28:55 139

原创 conductor server端源码解析(2)-更新任务信息(mysql实现)

查询流程信息: com.netflix.conductor.dao.ExecutionDAO#getWorkflow(java.lang.String, boolean)若状态为“TIMED_OUT”,则删除queue中的信息: com.netflix.conductor.dao.QueueDAO#remove。若状态为“SCHEDULED”,则推迟队列中的消息:com.netflix.conductor.dao.QueueDAO#postpone。若流程为“终止”状态,则删除队列中的信息,方法直接返回。

2023-05-23 21:19:14 98 1

原创 conductor server端源码解析(1)-查询待执行任务(mysql实现)

调用接口 com.netflix.conductor.rest.controllers.TaskResource#poll。若队列中暂无对应的任务,或者查到的数据少于待请求的数据,则循环等待:(此处timeout默认100ms)4.将task表中的任务状态更新为 “IN_PROGRESS”以及其它参数回写到库中(更新任务数据)1.若task对象不存在或者状态为“终止”态,则删除队列中该任务信息,处理完成,否则进入下一步。该方法做两件事情:1.从库中查询对应的任务信息 2.更新任务状态。

2023-05-23 21:13:09 158 1

原创 conductor client端源码解析(批量拉取)

代码: com.netflix.conductor.client.automator.TaskRunnerConfigurer#TaskRunnerConfigurer。** 在任务积压时,一次pull的任务数量越多,理论上在pull上的平均耗时就越少,消费能力越强,但是,若设置太大,会影响低负载时的耗时;我们走的实现为:com.netflix.dyno.queues.redis.RedisDynoQueue#pop。pull任务时的耗时,批次越大,每次拉取任务的平均耗时就越低,此在梳理下其相关逻辑。

2023-05-23 21:05:24 107

原创 conductor client端源码解析

自定义worker时会继承 com.netflix.conductor.client.worker.Worker该接口中定义了默认值 1000 ,即,若不指定拉取每秒拉取一次任务。

2023-05-23 20:36:37 120 1

原创 conductor部署

conductor部署的一些关键点

2023-05-22 21:20:39 369 1

原创 condutor架构

conductor框架的架构

2023-05-22 20:59:02 240 1

原创 微服务中的通信&saga

0.前言  相关内容主要是阅读《微服务架构设计》的一些所得及吐槽,内容作为笔记、周记的属性更重,若有幸被人看到,欢迎吐槽、指正。1.微服务中的通信一对一一对多同步模式请求/响应无异步模式异步请求/响应 单向通知发布/订阅 发布/异步响应apid的语义化版本控制规范(Semvers)要求版本号由三个部分组成:MAJOR.MINOR.PATCH MAJOR:进行不兼容的更改时MINOR:进行向后兼容的增强时PATCH:进行向后兼容的错误修复时

2021-07-26 01:09:37 228

原创 spring事务注解中timeout配置

要点:Spring事务超时 = 事务开始 到 最后一个Statement创建之间的时间 + 最后一个Statement的执行的时间(即其queryTimeout)设置@Transactional(timout = 1)时,希望是当前方法在一个事务中,且事务执行时间应小于1秒中,若超过1秒则应抛出异常: Transaction timed out: deadline was Mon Jul 05 00:02:18 CST 2021但这其中有一个坑:case1: 抛出Transaction .

2021-07-05 00:08:12 1692 1

原创 零拷贝& mmap

零拷贝零拷贝介绍及原理一次系统调用涉及两次上下文切换DMA 负责将数据从磁盘拷贝到 page Cache,不需要cup参与,此时cpu可以做别的事情传统的拷贝调用read() write()方法,涉及4次上下文切换传统的拷贝(数据从磁盘到网络) 数据流转:磁盘——>page Cache(内核空间缓存) ——>用户空间内存 ——> socket缓存 ——>网卡 一个4次数据拷贝零拷贝有两种实现方式:* mmap + write()* sendfil

2021-06-21 00:42:42 372

原创 微服务底层逻辑&笔记

文章目录0.前言1.单体应用2.微服务2.1 微服务三个维度2.2 微服务是一种架构风格2.2.1 mvc分层2.2.2 六边形风格2.3 定义微服务架构2.3.1 识别操作系统2.3.2 拆分服务总结0.前言  相关内容主要是阅读《微服务架构设计》的一些所得及吐槽,内容作为笔记、周记的属性更重,若有幸被人看到,欢迎吐槽、指正。1.单体应用  单体应用最直观的感受就是一个服务做完所有的事情,java里就是一个可执行jar包。小公司、创业公司适合采用这中架构,创建一个工程就开始干,什么功能往里边怼

2021-06-20 23:50:28 380

空空如也

空空如也

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

TA关注的人

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