自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

马赛琦的博客

每天要给自己充电,加油,努力。个人博客: www.masaiqi.com

  • 博客(57)
  • 收藏
  • 关注

原创 从本地事务到分布式事务

在我的博客阅读本文文章目录1. 从本地事务开始1.1. 刚性事务ACID1.2. 实现原子性和持久性1.3. 实现隔离性1.3.1. 隔离性用锁实现1.3.2. 事务隔离级别1.3.3. 多版本并发控制(Multi-Version Concurrency Control,MVCC)2. 迈入分布式事务2.1. 追求ACID的“强一致性”2.1.1. XA协议(2PC,3PC)2.2. 追求最终一致性(弱一致性的特例)2.2.1. CAP理论2.2.2. BASE理论2.3. 柔性事务实现最终一致性方案2.

2021-03-05 15:02:33 250 3

原创 Kafka基础

在我的博客阅读本文文章目录Kafka基础1. Kafka基础概念1.1. Kafka是什么1.2. Kafka的版本号1.3. Kafka的部分术语1.4. Kafka消息日志2. Kafka的分区策略3. Kafka的生产者压缩算法4. Kafka消息丢失相关5. Kafka基于TCP进行通信5.1. 生产者端的TCP管理5.2. 消费者端的TCP管理6. Kafka消息交付可靠性保障6.1. Kafka消息幂等性6.2. Kafka消息事务性7. Kafka消费者组7.1. Kafka消费组特性7.

2021-02-23 10:21:18 312 2

原创 Redis基础相关

在我的博客阅读本文文章目录Redis基础1. 设计一个键值数据库SimpleKV1.1. 需要存哪些数据1.2. 需要对数据做什么操作1.3. 键值数据存储在外存还是内存1.4. 一个键值数据库的基本结构1.5. 采用什么访问模式1.6. 如何定位键值对的位置1.7. 如何实现重启后快速服务2. Redis整体模型3. Redis为什么那么快3.1. 键和值的数据结构3.2. 值的数据结构3.2.1. 压缩列表3.2.2. 跳表3.2.3. 数据结构的时间复杂度3.3. 不同操作的复杂度3.4. 单线.

2021-01-07 19:13:52 249

原创 Spring Bean的生命周期(一图流+详细说明)

在我的博客阅读本文1. 前言Spring是一个IOC(Inversion of Control,控制反转)容器框架,拥有DI(Dependency Injection,依赖注入),DL(Dependency Lookup,依赖查找 等功能。认为一个IOC框架最基本要有以下功能:配置解析对象创建对象生命周期管理本文基于Spring-5.2.2.RELEASE版本进行论述,为了简明扼要,在展示部分代码的时候省略了一些细节。Spring Bean的生命周期总结因为没有一个正式的文档,因此是.

2020-10-20 12:41:10 11149 8

原创 Wireshark网络协议分析 - UDP协议

在阅读本文。

2024-01-30 18:49:13 1388

原创 Wireshark网络协议分析 - TCP协议

在阅读本文。

2024-01-30 18:46:42 1953

原创 Wireshark网络协议分析 - Wireshark速览

在阅读本文。

2024-01-30 18:43:59 1665

原创 一次分表的技术方案分享

分表技术方案

2022-08-08 19:16:46 1256 1

原创 【岛上书店】读后感

《岛上书店》读后感

2022-07-04 10:28:06 865

原创 《你的第一本哲学书》- 他人的意识

《你的第一本哲学书》- 他人的意识

2022-06-24 19:50:24 410

原创 《你的第一本哲学书》- 是否存在外部世界

《你的第一本哲学书》- 是否存在外部世界

2022-06-23 21:18:10 463

原创 事件溯源-《复杂软件设计之道:领域驱动设计全面解析与实战》笔记 - 6

在我的博客阅读本文文章目录1. 关于事件溯源2. 基于事件溯源的聚合根设计2.1. 用事件替代状态2.2. 用活动替代聚合根3. 事件溯源优点3.1. 替代分布式事务3.2. 事件日志的顺序性4. 总结1. 关于事件溯源MartinFowler在2005年的博客中提及了“EventSourcing”这个词语,他将事件描述为一个应用的一系列状态改变,这一系列事件能够捕获用来重建当前状态的一切事实真相。他认为事件是不可变的,事件日志是一种只会不断追加(appendonly)的存储。事件从来不会被删除,.

2022-03-19 17:00:20 2042

原创 CQRS架构-《复杂软件设计之道:领域驱动设计全面解析与实战》笔记 - 5

在我的博客阅读本文文章目录1. DDD的实现架构1.1. 三层架构1.2. 传统DDD分层架构1.3. 清洁(Clean)架构1.4. 六边形架构1.5. 垂直切片架构1.6. CQRS架构的特点1.6.1. 命令和查询分离1.6.2. 不同的数据访问方式1.6.3. 领域事件实现数据同步2. 各种架构总结3. 参考资料1. DDD的实现架构DDD的实现架构有很多种,这些架构都是一种关注点分离模式的实现,也是SOLID单一职责原则的体现,将人们关注的一个职责与其他职责分离,不要试图混合在一起。传统.

2022-03-19 16:55:07 1557

原创 实体和值对象-《复杂软件设计之道:领域驱动设计全面解析与实战》笔记 - 4

在我的博客阅读本文文章目录1. 充血/贫血模型1.1. 理解充血模型与贫血模型1.2. 充血模型和贫血模型结合使用2. 实体2.1. 实体的标记2.2. 实体的设计2.3. 实体对象的创建3. 值对象3.1. 值对象与实体的区别3.2. 用值对象重构方法4. 领域服务4.1. 领域服务的特征4.2. Clean架构5. 仓储1. 充血/贫血模型1.1. 理解充血模型与贫血模型DDD领域模型=数据结构+操作方法,数据和行为结合在一起才是一个完整的真正业务对象(领域对象),也才能够真正发挥对象封装的.

2022-03-19 16:44:16 667

原创 聚合设计-《复杂软件设计之道:领域驱动设计全面解析与实战》笔记 - 3

在我的博客阅读本文文章目录1. Top Level2. 聚合设计的概念2.1. 高聚合低关联2.2. 聚合的逻辑一致性2.2.1. 业务数据(结构)2.2.2. 业务行为2.2.3. 结论与目标3. 设计聚合的几种方法3.1. 改变主谓宾顺序3.2. 根据领域事件3.3. 根据单一职责设计聚合3.4. 按时间边界设计聚合3.5. 通过事务边界设计聚合3.6. 通过ER模型设计聚合4. 总结1. Top Level聚合设计是DDD战术设计中的一部分。通过有界上下文划分团队,使用统一语言命名上下文;聚.

2022-03-19 16:38:52 1120

原创 领域驱动战略设计-《复杂软件设计之道:领域驱动设计全面解析与实战》笔记 - 2

在我的博客阅读本文目录1. Top Level2. 有界上下文2.1. 统一语言2.2. 如何发现有界上下文和统一语言2.3. 有界上下文之间的关系2.4. 核心子域、支持子域与通用子域3. 按时间线发现有界上下文4. 通过领域故事或流程发现有界上下文5. 通过事件风暴会议发现有界上下文5.1. 关注关系而非实体对象5.2. 领域事件5.3. 命令5.4. 事件风暴建模法5.5. 业务平台与中台设计5.6. 微服务与有界上下文6. 补充6.1. 理解DDD中的“服务”一词。1. Top Level.

2022-03-19 16:32:10 937

原创 领域驱动设计基础-《复杂软件设计之道:领域驱动设计全面解析与实战》笔记 - 1

在我的博客阅读本文目录1. 传统建模与DDD建模1.1. E-R数据建模&面向对象建模1.2. 领域驱动设计2. 领域驱动设计的特点2.1. 发现和理解问题2.2. 领域即边界2.3. 解决复杂性(Complicated)2.4. 新的数据结构设计方式2.5. 需要注重产品的程序员(The Product-Minded Software Engineer)3. 领域驱动设计的难点3.1. 业务策略和业务规则3.2. 统一语言和有界上下文3.3. 领域模型的提炼1. 传统建模与DDD建模1..

2022-03-19 16:27:15 1249

原创 记一次COLA架构的实践

在我的博客阅读本文1. 传统做法2. DDD的一种实现代码结构:一图流:将业务决策从庞大的service中剥离出来,拆分为若干领域实体,将业务决策交给一个个的领域实体,由application层进行统一的委派,有效梳理业务,结构分明,降低代码维护难度,新同学更易上手。防腐层设计,业务与技术解耦,引导系统逐渐走上业务与技术分离的架构路线,保证业务逻辑在领域模型中得到不断重构和发展,成为系统的核心资产。3. COLA的做法模块划分:adapter模块定于对外透出服务的方.

2022-02-11 18:00:11 7230 8

原创 多模块化改造若干问题与解决方案(持续更新)

在我的博客阅读本文文章目录1. 循环依赖问题2. API包如何打包给其他服务引入2.1. 在父POM中进行Deploy操作2.2. 如果API包的配置了spring-boot-maven-plugin需要注意3. SpringBoot的多模块项目如何启动3.1. 如果你的子模块中配置了spring-boot-maven-plugin需要注意4. 运维相关5. 如果你想统一整个模块的版本号6. 参考资料1. 循环依赖问题Maven中如果出现:A 依赖 BB 依赖 A就会导致Maven Com.

2021-11-23 15:47:03 762

原创 异步线程中链路追踪方案

在我的博客阅读本文文章目录1. 解决的问题2. 环境3. Brave的currentTraceContext4. 用Brave提供的API实现4.1. Runnable使用4.2. Spring线程池ThreadPoolTaskExecutor中使用1. 解决的问题当一个线程执行过程中开启了新的异步线程,会导致异步线程与当前线程的traceId不一致的问题。在线程池中,traceId可能在线程创建那一刻就已经固定了,不会跟着使用场景上下文traceId变动,在后面的线程复用环节中一直都是这个tr.

2021-09-27 10:45:24 1886

原创 服务PostgreSQL迁移至MySQL全记录

在我的博客阅读本文文章目录服务PostgreSQL迁移至MySQL全记录1. 语法差异2. 迁移工具选型2.1. 阿里云DTS2.2. 阿里云DataWorks服务PostgreSQL迁移至MySQL全记录1. 语法差异这里总结一下这次迁移过程中遇到的语法差异:PG中,select [column1] || [column2] 用来连接字符串;MySQL中 || 是逻辑运算符,按照PG语法,需要改成字符串连接函数 select concat([column1], [column2])PG支.

2021-06-16 20:38:03 1565

原创 gRPC异常处理流程设计

在我的博客阅读本文文章目录1. 核心诉求2. 方案选择2.1. 直接调用OnError方法,传递Status包装异常后返回2.2. 借助protobuf 的 OneOf语法2.3. 基于gRPC Metadata(实际采用的方案)2.4. 优化的方案2.4.1. 实现gRPC提供的ServerInterceptor接口2.4.2. 包装StreamObserver类,增强其功能。(采用的方案)3. 参考文档1. 核心诉求服务提供方异常能够被服务消费方感知异常分类处理:业务异常,需要返回对应.

2021-04-18 13:59:39 3644 13

原创 基于Redis实现分布式锁与Redis的ACID特性(以秒杀业务为例)

基于Redis实现分布式锁与Redis的ACID特性(以秒杀业务为例)1. 准备Redis实现秒杀业务,主要需要三块的知识储备:秒杀业务流程如何保证原子性(Redis能为我们做哪些ACID保证)Redis实现一个分布式锁下文会围绕这3块进行展开叙述。2. 秒杀业务流程分为三个阶段,秒杀阶段前,中,后。秒杀阶段前,通常用户会不断刷新商品详情页,这会导致详情页的瞬时请求量剧增。一般是尽量把商品详情页的页面元素静态化,然后使用 CDN 或是浏览器把这些静态化的元素缓存起来。秒杀阶段中,这是

2021-01-26 22:16:51 195

原创 基于Redis实现缓存系统的注意点与一些常见问题

在我的博客阅读本文文章目录基于Redis实现缓存系统的注意点与一些常见问题1. 从计算机系统的缓存开始2. Redis的缓存策略3. 缓存大小的设置4. 缓存删除方案4.1. 定期删除4.2. 惰性删除4.3. 内存淘汰(内存驱逐)5. 缓存使用过程中的一些问题5.1. Redis缓存与数据库不一致问题5.2. 缓存雪崩5.3. 缓存击穿5.4. 缓存穿透5.5. 缓存污染5.6. 数据倾斜6. 参考基于Redis实现缓存系统的注意点与一些常见问题1. 从计算机系统的缓存开始在计算机系统中,默认.

2021-01-26 22:15:40 371

原创 Redis的部分使用注意点

在我的博客阅读本文文章目录Redis的部分使用注意点1. 用SCAN命令代替KEYS等全数据返回命令2. 设置合适的AOF写回策略3. 一个Redis实例的数据库不要太大4. 设置合理的repl_backlog_size值5. 主从集群中适当调整down-after-milliseconds6. String的空间利用率7. 集合类型的四种统计模式7.1. 聚合统计7.2. 排序统计7.3. 二值状态统计7.4. 基数统计8. 面向LBS应用的GEO数据类型9. Redis保存时序数据特性9.1. H.

2021-01-26 22:12:33 245

原创 Spring应用上下文生命周期

在我的博客阅读本文文章目录Spring应用上下文生命周期1. 前言2. Spring应用上下文刷新阶段2.1. Spring上下文刷新准备阶段2.2. BeanFactory创建阶段2.3. BeanFactory准备阶段2.4. BeanFactory后置处理阶段2.5. BeanFactory注册BeanPostProcessor阶段2.6. 初始化MessageSource2.7. 初始化ApplicationEventMulticaster2.8. Spring应用上下文刷新阶段2.9. Sp.

2021-01-13 22:48:58 251

原创 HashMap源码的细节与启发

在我的博客阅读本文HashMap源码的细节与启发1. 前言这些天心血来潮想认认真真过一遍JCF的源码实现,在阅读到HashMap的时候发现自己之前还是太肤浅,很多地方没能理解JDK作者的巧思,因此想记录下来自己学习过程中的收获。在正式开始之前先吹一波美团技术团队,之前看并发编程的时候也是搜到不少美团技术团队的文章,写的既专业又接地气,这次看HashMap也多亏美团技术团队写的文章:《Java 8系列之重新认识HashMap》2. 哈希表首先,HashMap其实是**哈希表(Hash tabl.

2020-07-27 21:58:48 372

原创 synchronized关键字

在我的博客阅读本文1. 首先挂一个图图片摘自美团技术团队,个人觉得写的特别好:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6usd8Hzc-1592491318849)(https://img.masaiqi.com/20200618223900.png)]2. synchronized的锁作用范围Java锁作用范围有两种:一种是类的实例对象的锁(对象锁)。一种是类的class对象(类锁)。比如:在一个静态方法前面加synchronized关键字.

2020-06-18 22:42:24 234

原创 JMM(Java Memory Model)Java内存模型

在我的博客阅读本文1. 并发编程模型在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式进行,整个通信过程对程序员完全透明(不可见)。2. Java内存模型的抽象结构从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(MainMemory)中,每个线程都有一个私有的本地内存(LocalMemory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并.

2020-06-18 00:02:45 465 2

原创 volatile学习笔记

在我的博客阅读本文1. volatile关键字的作用可见性:对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入。有序性(阻止指令重排):volatile标志的变量的写不能与之前的代码重排序;volatile标志的变量的读不能与之后的代码进行重排序(一般记为 写前读后 后文详细说明)原子性:对任意单个volatile变量的读/写具有原子性,但类似于volatile++这种复合操作不具有原子性。2. volatile关键字的原理我们声明一个volati.

2020-06-16 21:58:56 748

原创 并发编程中的原子性与可见性

在我的博客阅读本文1. 可见性1.1 什么叫做可见性可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。1.2. 为什么会有可见性问题可见性问题的根本原因是因为现代CPU在设计上解决CPU运算速度与内存读写速度不匹配问题而导致的。这种访问速度的显著差异,导致CPU可能会花费很长时间等待数据到来或把数据写入内存。基于此,现在CPU大多数情况下读写都不会直接访问内存(CPU都没有连接到内存的管脚),取而代之的是CPU缓存,CPU缓存是位于CPU与内.

2020-06-16 12:25:36 418

原创 设计模式总结(GOF23)

在我的博客阅读本文参考原文设计模式分类GoF的23种设计模式的功能1. 单例(Singleton)某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。分为饿汉式,懒汉式,double-check2. 原型(Prototype)将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。比如Java的clone方法3. 工厂方法(...

2020-03-01 15:41:40 245

原创 分布式系统的一致性理论(CAP和BASE)

在我的博客阅读本文一致性模型强一致性当更新操作完成之后,任何多个后续进程或者线程的访问都会返回最新的更新过的值,直到这个数据被其他数据更新为止。但是这种实现对性能影响较大,因为这意味着,只要上次的操作没有处理完,就不能让用户读取数据。弱一致性系统并不保证进程或者线程的访问都会返回最新更新过的值。系统在数据写入成功之后,不承诺立即可以读到最新写入的值,也不会具体的承诺多久之后可以读到...

2020-02-29 17:10:45 579

原创 纯注解形式的数据源动态切换实现(基于SpringBoot)

在我的博客阅读本文有一段时间没有更新博客了,其实这段时间也有在写一些框架的使用,比如quartz的基本使用等等,后来都没有发布出来,主要还是感觉过于简单,对于博客的定位我希望能讨论一些更深层次的设计方面的东西。最近公司有个需求,客户试用我们的产品到期了,签了正式的合同,准备迁移到生产环境,但是又想要保留测试的时候数据,因此我们开发组准备设计一个迁移程序,要考虑后期拓展与重复使用。这其中有个重...

2019-12-02 10:12:10 837

原创 软件设计原则学习

在我的博客中查看本文软件设计原则学习最近在学习GOF23,感觉前提一定要清楚了解设计的原则,不然无法完全体会设计模式的优势。因此也就兴冲冲的好好钻研了一波设计原则。1. 开闭原则开闭原则(Open-Closed Principle,OCP)是指一个软件实体(如类、模块、函数)应该对扩展开放,对修改关闭。所谓开闭,其实是对扩展和修改两个行为的一个原则,强调的是用抽象构建框架,用实现...

2019-10-28 21:35:59 265

原创 一个利用观察者模式和策略模式对代码进行解耦优化的例子

在我的博客阅读本文1. 前言观察者模式(Observer Pattern):当一个对象被修改时,则会自动通知它的依赖对象。属于行为模式。(一对多模式适用)策略模式(Strategy Pattern):一个类的行为或其算法可以在运行时更改。属于行为模式。关于这两种设计模式详细的介绍,网上一搜一大把,不复赘述。本文基于这两种设计模式,提供一个具体的业务场景作为实例,表述一种模块间解耦和优...

2019-10-14 13:50:33 671

原创 idea的lombok插件支持@SuperBuilder注解啦

在我的博客阅读本文1. 前言今早进公司打开idea,弹出更新提示,简单看了下,原来是idea的lombok插件更新了,惊喜的发现update log上写着Add support for @SuperBuilder。为什么说是惊喜呢?因为之前也有用到这个的场景,去官网认认真真看完了@SuperBuilder的用法以及描述,刚准备大展拳脚,结果发现idea上怎么写都识别不出来,后来去插件的gi...

2019-10-09 22:29:20 29312 10

原创 公司MES项目现场落地实施总结

这篇博文以一名程序员职场新人立场去记录这次落地实施的感受在我的博客阅读本文这些天代表公司这里出门浙江台州玉环市进行MES系统的现场落地实施,因为是人生中第一次出差,所以兴奋也是有的,但是中间也遇到各种各样的问题,心情是兴奋到失落到坦然面对,为什么这么说呢,且听我下面慢慢道来。首先最直观的环境变化,环境的变化有很多方面,衣食住行和原来都截然不同,不过本身作为江苏人,吃浙江菜也很吃得惯,吃倒...

2019-10-09 22:27:26 1672

原创 RocketMQ学习与部署Docker记录(后续更新)

在我的博客阅读本文1. RocketMQ简介RocketMQ是一个分布式消息和流数据平台(消息中间件),具有低延迟、高性能、高可靠性、万亿级容量和灵活的可扩展性。RocketMQ是2012年阿里巴巴开源的第三代分布式消息中间件,2016年11月21日,阿里巴巴向Apache软件基金会捐赠了RocketMQ;第二年2月20日,Apache软件基金会宣布Apache RocketMQ成为顶级项...

2019-09-12 14:59:21 815

原创 React学习记录

不会前端的java工程师不是好java工程师在我的私人博客查看本篇博文前言俗话说的好,不会前端的java工程师不是好java工程师。笔者在之前已经学习过Vue的相关技术栈,事实上笔者的毕业设计也是用Vue做的~除了Vue,React和Flutter如今也是如日中天般的火爆,今天这篇文章记录一下学React的过程。后续应该随着学习的深入还会不断更新,所以这里排个update log,方便记...

2019-09-03 18:09:18 383

空空如也

空空如也

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

TA关注的人

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