java
文章平均质量分 94
沙琪玛~
认识你自己,凡事勿过度。
展开
-
一次分表的技术方案分享
分表技术方案原创 2022-08-08 19:16:46 · 868 阅读 · 2 评论 -
记一次COLA架构的实践
在我的博客阅读本文1. 传统做法2. DDD的一种实现代码结构:一图流:将业务决策从庞大的service中剥离出来,拆分为若干领域实体,将业务决策交给一个个的领域实体,由application层进行统一的委派,有效梳理业务,结构分明,降低代码维护难度,新同学更易上手。防腐层设计,业务与技术解耦,引导系统逐渐走上业务与技术分离的架构路线,保证业务逻辑在领域模型中得到不断重构和发展,成为系统的核心资产。3. COLA的做法模块划分:adapter模块定于对外透出服务的方.原创 2022-02-11 18:00:11 · 5772 阅读 · 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 · 641 阅读 · 0 评论 -
异步线程中链路追踪方案
在我的博客阅读本文文章目录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 · 1555 阅读 · 0 评论 -
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 · 3043 阅读 · 13 评论 -
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 · 227 阅读 · 2 评论 -
基于Redis实现分布式锁与Redis的ACID特性(以秒杀业务为例)
基于Redis实现分布式锁与Redis的ACID特性(以秒杀业务为例)1. 准备Redis实现秒杀业务,主要需要三块的知识储备:秒杀业务流程如何保证原子性(Redis能为我们做哪些ACID保证)Redis实现一个分布式锁下文会围绕这3块进行展开叙述。2. 秒杀业务流程分为三个阶段,秒杀阶段前,中,后。秒杀阶段前,通常用户会不断刷新商品详情页,这会导致详情页的瞬时请求量剧增。一般是尽量把商品详情页的页面元素静态化,然后使用 CDN 或是浏览器把这些静态化的元素缓存起来。秒杀阶段中,这是原创 2021-01-26 22:16:51 · 155 阅读 · 0 评论 -
基于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 · 216 阅读 · 0 评论 -
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 · 166 阅读 · 0 评论 -
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 · 185 阅读 · 0 评论 -
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 · 173 阅读 · 0 评论 -
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 · 10261 阅读 · 8 评论 -
HashMap源码的细节与启发
在我的博客阅读本文HashMap源码的细节与启发1. 前言这些天心血来潮想认认真真过一遍JCF的源码实现,在阅读到HashMap的时候发现自己之前还是太肤浅,很多地方没能理解JDK作者的巧思,因此想记录下来自己学习过程中的收获。在正式开始之前先吹一波美团技术团队,之前看并发编程的时候也是搜到不少美团技术团队的文章,写的既专业又接地气,这次看HashMap也多亏美团技术团队写的文章:《Java 8系列之重新认识HashMap》2. 哈希表首先,HashMap其实是**哈希表(Hash tabl.原创 2020-07-27 21:58:48 · 302 阅读 · 0 评论 -
设计模式总结(GOF23)
在我的博客阅读本文参考原文设计模式分类GoF的23种设计模式的功能1. 单例(Singleton)某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。分为饿汉式,懒汉式,double-check2. 原型(Prototype)将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。比如Java的clone方法3. 工厂方法(...原创 2020-03-01 15:41:40 · 182 阅读 · 0 评论 -
分布式系统的一致性理论(CAP和BASE)
在我的博客阅读本文一致性模型强一致性当更新操作完成之后,任何多个后续进程或者线程的访问都会返回最新的更新过的值,直到这个数据被其他数据更新为止。但是这种实现对性能影响较大,因为这意味着,只要上次的操作没有处理完,就不能让用户读取数据。弱一致性系统并不保证进程或者线程的访问都会返回最新更新过的值。系统在数据写入成功之后,不承诺立即可以读到最新写入的值,也不会具体的承诺多久之后可以读到...原创 2020-02-29 17:10:45 · 498 阅读 · 0 评论 -
纯注解形式的数据源动态切换实现(基于SpringBoot)
在我的博客阅读本文有一段时间没有更新博客了,其实这段时间也有在写一些框架的使用,比如quartz的基本使用等等,后来都没有发布出来,主要还是感觉过于简单,对于博客的定位我希望能讨论一些更深层次的设计方面的东西。最近公司有个需求,客户试用我们的产品到期了,签了正式的合同,准备迁移到生产环境,但是又想要保留测试的时候数据,因此我们开发组准备设计一个迁移程序,要考虑后期拓展与重复使用。这其中有个重...原创 2019-12-02 10:12:10 · 745 阅读 · 0 评论