自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Kafaka核心设计与实践原理(第一部分)

(系统解耦、冗余存储、流量削峰、缓冲、异步通信、扩展性、可恢复性等)(由此也可以把 Kafka 作为长期的数据存储系统来使用,只需要把对应的数据保留策略设置为“永久”或启用主题的日志压缩功能即可)Kafka的设计目标是高吞吐量,所以他的一些特性都和这个目标相关,如。

2024-02-22 19:01:00 1386

原创 实现领域驱动设计-实体、领域服务

当领域中的某个操作过程或转换过程不是实体或者值对象的职责时,我们应该将该操作放在一个单独的接口中,即领域服务。请确保该领域服务和业务、技术通用语言是一致的;并且保证它是无状态的;并且能够明确地表达限界上下文中的通用语言。另外一种解释:在战术建模当中,并非所有模型都是事物。有些模型是对领域中的一些行为操作进行建模。此类模型我们称之为领域服务。我们希望在领域设计当中统一用模型对象进行交互。此时领域服务使用细粒度的领域对象如实体或者值对象进行交互,在服务内部描述领域知识得出结果并将其返回(

2023-11-27 19:37:59 128

原创 实现领域驱动设计-应用结构

符合REST原则的系统具有更好的松耦合性和可伸缩性,基于REST的系统被分为很多较小的资源块,每一个资源块都可以独立地测试和调试,并且每一个资源块都表示了一个可重用的入口点。HTTP设计本身以及URI成熟的重写与缓存机制使得RESTful HTTP成为一种不错的架构。CQRS(Command Query Responsibility Segregation),Command 与 Query 分离的一种模式。Command:命令则是对会引起数据发生变化操作的总称,即新增,更新,删除这些操作,都是命令。

2023-11-20 23:11:39 163

原创 技术人生的发展与问题思考

是负责使用技术能力解决业务问题,提供稳定可靠的技术支撑,确保业务安全合规低风险地健康发展,并通过技术或业务创新来推动业务发展;负责向业务各方提供各种必要的技术支撑,通过合理的数据分析为业务决策提供依据;通过对技术领域的积累和发展,通过业务领域的理解和落地影响业务决策;负责构建梯队完整、能力全面、制度完善的技术团队来支撑业务发展。总结:对一个具体的业务而言,自己是否处在技术领域责任链的最顶端。即是否为最终责任人。

2023-10-06 22:36:54 268

原创 基于配置中心的决策引擎平台--系分

当同一个业务场景中,有非常多的业务分支后,需要有非常多的 if 判断,来承载这些简单的业务逻辑,但随着业务的发展,业务逐渐复杂,if 分支越来越多,可维护性越来越差,技术债务越来越重。异常逻辑处理特殊case不同业务流程处理… …但这些分支逻辑难以避免,我们需要考虑如何正视它。Rule:规则的生成多种方式来定义规则Condition:执行条件的定义Action: 条件满足后的行为RuleEngine:执行决策的引擎。

2023-05-12 21:03:28 763

原创 定时任务方案实现与对比

ScheduledExecutorService 继承线程池,也是把任务提交给线程池执行,只不过它的任务类进行了扩展。ScheduledExecutorService 自定义了阻塞队列 DelayedWorkQueue 给线程池使用,它可以根据 ScheduledFutureTask 的下次执行时间来阻塞 take 方法,并且新进来的 ScheduledFutureTask 会根据这个时间来进行排序,最小的最前面。

2023-05-02 17:20:51 2460

原创 Java Memory Model

简单来说就是系统在执行代码的时候并不一定是按照你写的代码的顺序依次执行。

2023-04-30 11:57:45 1213

原创 ABTEST平台建设思路与方案

可将实验分为互斥流量实验和正交流量实验,分别对应下图中的实验1和实验2。实验类型一句话特点介绍优点缺点互斥流量实验(随机实验)将流量随机的分配到某个组上进行实验1.请求只会获得到一个组的结果 2. 可认为是只有一层的正交流量实验1. 实验简单,在做数据分析时,只需要对比所有互斥实验即可1.由于组之间流量互斥,100的流量所分的组是有限的。2. 若所有运行中实验把流量占满后, 将无法在同一个流量入口下再新增实验,将影响业务的AB推进正交流量实验。

2023-04-30 11:56:47 1527

原创 DDD系列:五、实际项目应用

Domain-Driven Design 是一种软件/应用结构设计方法论,它把,用于应对复杂且多变的业务。DDD的设计目标是,将,同时,提高软件的设计质量。同时,优先设计业务领域模型,屏蔽掉了大部分数据模型、技术实现细节,让开发者和上游下游的业务沟通上,减少gap。

2023-04-30 11:53:28 1041

原创 DDD系列:四、领域层设计规范

在接口层面,当把多个类似的业务,做到同一个接口中时,容易出现参数膨胀,所以在设计接口时,考虑Single Responsibility Principle,若不同的接口有相同的一些操作,需要下沉到Application Service层中去。接口层直接对接业务,可以快速的变化,但我们希望ApplicationService层的调整比较小,Domain层几乎没有变化。

2023-04-30 11:50:34 2055

原创 DDD系列:三、Repository模式

​。

2023-04-30 11:50:01 2262

原创 DDD系列:二、应用架构设计演变

​ 通过规定一个固定的架构设计,可以让团队内有一个统一的开发规范,降低沟通成本,提升效率和代码质量。目标。

2023-04-30 11:49:42 1652

原创 DDD系列:一、 Domain Primitive

​ 软件开发中,是一个永恒的挑战。如使用一些设计模式或范例,从偏技术的角度来降低软件复杂度,而 DDD 的目标是对业务设计提出一种架构思想,进而降低复杂度。​​ 在一个特定领域里,拥有精准定义的、可自我验证的、拥有行为的 Value Object。

2023-04-30 11:48:12 1195

原创 多级缓存建设方案

xx系统中对容量和耗时有较高要求,以支付优惠立减为例,每个用户咨询可用立减时,都会过一遍全量生效活动。目前日常活动数3000+,目标2w+;日常秒级咨询量1w+,大促22w+。所以如何支撑日常和大促的业务非常具有挑战性。对此我们做了很多优化,其中缓存是整个优化的基石。本次缓存设计参考自yy系统,其代码经过了长时间的验证,所以我们希望输出一套缓存标准化方法,尽量满足当前已有业务场景,经过验证后能推广至其他系统,帮助大家夯实缓存系统,为业务发展保驾护航。

2023-04-29 11:31:26 1511 1

原创 业务维度digest日志的记录与监控方案

满足从业务整体的维度,对于一个业务接口,记录一行请求日志,并通过某个 Unique Id(如UserId、OrderId)将多行日志关联起来,最终产出一批和业务强相关的数据,帮助业务或管理层更加清晰、及时的了解到业务变化情况,做出更合理的业务发展判断。​    描述的需求中,涉及到了digest日志记录、日志数据清洗、日志数据呈现方式等,但在本文档中,我们重点讨论项目中digest日志的记录方案。

2023-04-29 11:24:35 1248

原创 如何提高代码质量

好和坏是一个比较笼统的概率,代码质量高低是一个综合各种因素得到的结论,并不能通过单一的维度去评价一段代码写的好坏。对一段代码的质量评价,常常有很强的主观性。比如,怎么样的代码才算可读性好,每个人的评判标准都不大一样。定义解释可维护性、可扩展性能够在不修改或少量修改原有代码的情况下,通过扩展的方式添加新的功能代码。(对修改关闭,对扩展开放)可读性、简洁性思从深而行从简,目的是让他人可以轻松读懂你的代码。列如命名是否规范、注释是否详尽、函数长度是否合适等可复用性。

2023-03-06 14:27:00 834

原创 多线程系列:附、基于生产者消费者多线程模式的分组排序取top

场景:   生产者消费者都分别使用多线程,生产者多个线程不断产生以下分学课数据,由消费者多个线程处理数据,并输出处理每条数据时的当前科目的平均分、top3的学生名和分数。//张1 数学 50//张1 语文 70//张1 英语 60//张2 数学 20//张2 语文 40//张2 英语 20//张3 数学 50//张3 语文 60//张3 英语 55//张4 数学 22//张4 语文 11//张4 英语 70//张4 **科 74//张5 **科

2021-09-01 19:29:14 262

原创 InnoDB 中锁的实际应用(KeyWord:MVCC / 一致性[非]锁定读)

DB中锁的概念:锁的存在,是为了保证数据的完整一致等特性;而加锁的方式将决定 DB 处理并发的能力。以下对锁的一些介绍,是为了在使用的 MySQL 时,避免出现重量级锁降低 DB 的并发性能。InnoDB下的锁(属于悲观锁):行级锁:排他锁(x)、共享锁(s)。如InnoDB存储引擎使用。页面锁。如BerkeleyDB存储引擎使用。表级锁:意向排他锁(ix)、意向共享锁(is)。如MyISAM,Memory等非事务性存储引擎在使用。允许行级、表级锁共存。在获取两种行级锁之前,必须

2021-08-30 21:31:37 190 1

原创 Kafka生产者、消费者的消息可靠性方案实现

以下代码基于SpringKafka 2.3.13.RELEASE 实现Producer 消息的可靠性Consumer 消息的可靠性实现方案:手动提交 offset + 重试机制(监控) + 死信队列(告警) + 死信队列人工处理#kafka配置,更多配置请参考:KafkaPropertiesspring.kafka:#消费者的配置,可参考:org.apache.kafka.clients.consumer.ConsumerConfig consumer: #暂不用提供clientId

2021-08-21 20:18:25 2272

原创 Spring MVC架构中的监听器,过滤器,拦截器

三者执行顺序如下:Listener(监听器):监听 web 服务器中某一个事件操作,并触发注册的回调函数。如application,session,request 对象的 创建/消亡 或者 增删改 属性时,自动触发对应的函数功能。在 Listener 中,可以通过 ServletContext 设置全局变量,并在后续的 HttpServletRequest 中获取对应的值。Filter(过滤器):过滤器是基于servlet容器实现的,先于拦截器执行,先于 SpringMVC.Dispa

2021-08-12 15:29:06 455

原创 分库分表、MySQL分区表

为什么需要分区   随着业务量的增长,数据量也会随之增加,进而影响 DQL (Data Query Language)、DDL(Data Definition Language),使其耗费更多,影响业务的可用性,同时导致从库延迟很大,如果业务做了读写分离,那么用户的一些重复操作将产生脏数据。什么时候进行分区   阿里开发手册建议,单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。如果预计三年后的数据量根本达不到这个级别,则不考虑该问题。   作为常见的InnoDB,其容量最大限

2021-07-21 17:22:49 645

原创 MySQL索引的数据结构、特点(Keywords:InnoDB、B+Tree、Hash)

B+树索引   在数据库中,B+树是高度平衡的,树的高度一般都在2 ~ 4层,所以查某一键值的行记录最多需要2 ~ 4次 IO。B+ 树索引种类分为聚集索引(clustered index)和辅助索引(secondary index)聚集索引(clustered index)   聚集索引按照每张表中的主键顺序构建B+树(每张表只能有一个主键,故每张表只能有一个聚集索引),其叶子节点存放所有的行数据,...

2021-07-04 21:43:51 642 1

原创 观察者模式的介绍与实操

定义   观察者模式又称为 发布订阅模式(这个名称更容易理解)。它指的是,当一个对象的内部状态发生改变时,通知登记过的对象,针对变化做出自己的操作。   通过这种方式来达到减少依赖关系,解耦合的作用。UMLSubject:表示某一个主题,定义了添加 / 删除 / 通知 Observe 的功能PublishSubject:消息发布实现类Observe:观察者接口,定义了观察者动作的方法,由 Subject 中的 notifyObserves() 方法来通知调用OneObserve:观察者实现类

2021-06-13 22:25:36 210

原创 MySQL/MariaDB 下的存储引擎与特点

什么是存储引擎:存储引擎可以完成数据存储,并为存储的数据操作索引文件、数据文件等功能。MySQL支持的引擎类型:InnoDB(5.5.8后默认使用该引擎)及其特点支持事务   隔离级别默认为为 Repeatable,但与普通的 Repeatable 模式不同的是,InnoDB 使用了 next-key-locking(间隙锁)避免了 phantom(幻读)问题支持外键支持 行/表 级锁使用 clustered 索引   每一个表都有一个聚簇索引,要么是主键,要么是拥有唯一索引(unique

2021-06-06 11:48:28 319 2

原创 事务 / 分布式事务的常见解决方案

分布式事务的实现方案XA 方案:两阶段提交。事务时间长,锁数据时间长,吞吐量低(实现方式 JTA)TCC 方案(Try Confirm Cancel):强一致性,吞吐量较方案一高SAGA 方案:保证最终一致性本地消息表可靠消息最终一致性方案最大努力通知方案...

2021-05-30 21:02:04 474 1

原创 多线程系列:附、LinkedBlockingQueue 引发的一次线上事故

总结:   空闲线程从 BlockingQueue 中获取任务时,是通过信号量的方式,每次唤醒一个线程去取任务,所以,当向线程池提交任务过快,每次唤醒一个线程去执行任务处理不过来时,便会执行任务拒绝策略。业务场景:   对账进程需要下载 某一时间段 的 n个账号 的第三方账单,第三方账单中数据量大,需要控速入库,入库完一组数据,再去下载第二组账单。线程池配置:@Beanpublic ThreadPoolTaskExecutor cpuThreadPool() { ThreadPoolTa

2021-03-22 20:47:57 1995

原创 Java 类的生命周期、ClassLoader的应用和演变(KeyWord:SpringBootClassLoader、委派模型)

类加载器:双亲委派模型下的类加载机制:​​JVM启动的时候,Java 开始使用如下三种类加载器:1. 根类加载器 Bootstrap负责装载最核心的Java类,比如Object、System、 String等,用 C++ 来实现的,不存在于 JVM 中。2. 扩展类加载器 Extension ClassLoader,JDK 9 及以后更换为Platform ClassLoader负责加载一些扩展的系统类,比如XML、加密、压缩相关的功能类等;3.系统类加载器 Application Clas

2021-03-15 23:25:46 1038

原创 Kafka 基础概念

重要概念功能与应用Kafka 作为一个分布式流式处理平台,提供了三个关键的功能:消息队列:发布和订阅消息流。容错的持久化记录消息流:把消息持久化到磁盘,避免了消息丢失的风险·。流式处理平台: 在消息发布的时候进行处理,Kafka 提供了一个完整的流式处理类库。其主要的应用场景:消息队列 :实时流数据管道,可靠地在系统或应用程序之间获取数据。数据处理: 构建实时的流数据处理程序来转换或处理数据流。broker \ topic \ partition \ offset每个 parti

2021-03-06 16:15:14 860

原创 MyBatis 进阶知识

基础定义:MyBatis 与 Hibernate 相似,都是持久层框架 ,而 MyBatis 是一款 半自动 ORM 工具(object relation mapping) ,其优点有:解除 SQL与程序代码的耦合支持编写动态 SQL 语句其缺点有:SQL 语句的编写工作量较大SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库MyBatis中 namespace 的作用namespace 实现了面向接口编程,通过 namespace 指定的接口,MyBatis自动找

2021-02-23 16:05:29 1272 7

原创 如何保证缓存与 DB 的“高”一致性

   无论是本地做缓存还是使用 Redis 做缓存,都会存在数据同步的问题,因为配置信息缓存在内存中,而内存无法感知到数据在数据库的修改。这样就会造成数据库中的数据与缓存中数据不一致的问题。先删除缓存,后更新数据库理想处理流程:可能出现的问题:B 用户可能会得到脏数据B 用户查询数据时,可能会把获取到的脏数据设置到缓存中,带来其他更加严重的影响。可以使用延时双删来解决对于使用主从复制的数据库而言,B 读取数据时可能会出现延迟的现象。实时性要求高的数据要走主库查询,避免延迟。延时双删在写

2021-01-18 11:21:52 443

原创 Linux 监控命令

系统资源监控vmstat (Virtual Meomory Statistics)   对操作系统的虚拟内存、内存、进程、CPU活动、IO情况等进行监控。常用 vmstat [-n] [delay] [count]:vmstat -n 2 3更多详细介绍

2021-01-04 15:24:08 337

原创 JVM系列:附、常用 JVM 参数含义与实际应用配置

在前几篇的 JVM系列 中,我们已经具备了 JVM 相关的基础知识,现在我们需要将学到的知识,在实际场景中运用起来,通过配置相关的

2020-12-06 17:10:17 1996

原创 JVM系列:二、不同 GC 的演变与差异

垃圾回收  目前垃圾收集器基本都是采用分代收集的方法,其思想是,针对堆中不同存活周期、不同内存大小的对象采取不同的垃圾回收策略。堆(Heap)中新生代、老年代的划分与垃圾回收算法常见的 垃圾回收算法 如下:引用计数(无法解决循环引用的问题,故 JVM 中没有使用)复制(会对类进行反复复制,带来资源的消耗)标记清除(Mark-Sweep,被标记的清除对象清除后,会带来内存碎片,导致内...

2020-11-28 14:42:20 1315 1

原创 多线程系列:二、线程池在 Spring 中的使用与关闭

  在 上一篇 中,我们了解了进程、线程、Java 线程池的一些基础概率,然后抛出了线程池在 Spring 中的使用与关闭两个问题,本篇将通过案例对这两个问题进行探讨。ThreadPool 在 Spring 中的使用1. 使用 JUC 下面的 ThreadPoolExecutor    Bean 默认为单例类型,所以只需要在 Spring IOC容器加载时,添加一个 Bean 即可 @Bean public ExecutorService IOThreadPool() { i

2020-11-22 23:12:35 2115 2

原创 SpringBean:创建、使用、生命周期、循环依赖问题

灵魂拷问环节Q1: Spring 中什么时候会出现循环依赖?不能完成 Bean 的实例化,导致无法放入缓存中,进而导致循环依赖中,无法获取到其他依赖对象的情况。如全构造器循环依赖(该场景无法解决,官方建议使用 setter 注入方式代替构造器注入)、获取不到实例后的构造器与 setter 的注入方式。部分类型 Bean 的循环注入,如全为 prototype 类型的循环、prototype 类型先去获取 singleton 的循环。循环依赖代码案例参考Q2: Spring 是如何解决 si

2020-10-24 18:21:12 2893

原创 Netty 中的 ByteBuf

所有的缓冲区,都是为了平衡了 数据产生方 和 数据消费方 的处理效率差异。零拷贝为什么需要零拷贝?  应用程序从磁盘或网卡上获取数据时,为了合规的在不同的缓冲区域操作数据,需要来回拷贝数据,在拷贝的过程中,会消耗一部分时间,还可能会占用 CPU ,进而影响系统的处理效率。为了提高应用的吞吐量,我们应该尽量避免数据拷贝的过程出现。  使用零拷贝方式,不仅仅带来更少的数据复制,还能带来其他的性能优势,例如更少的上下文切换,更少的 CPU 缓存伪共享以及无 CPU 校验和计算。网络数据拷贝流程的演变:

2020-10-08 22:58:29 974

原创 基于 Spring 构建应用的多环境感知方案

场景:  在一个实际的项目业务开发中,必定包含多个环境,如本地、开发、测试、预发布、正式、销售等等环境,不同的环境有需要连接不同的 DB 、请求不同的外部依赖等等。参考链接  ...

2020-09-29 16:50:57 739

原创 JVM系列:三、JVM 优化与问题排查思路

常用命令jpsjps -lvjmapjmap 命令用于生产堆转存快照。命令格式:jmap [ option ] pidjmap [ option ] executable corejmap [ option ] [server-id@]remote-hostname-or-IP参数选项:-dump:[live,]format=b,file=<filename> 使用 hprof 二进制形式,输出 jvm 的 heap 内容到文件. live子选项是可选的,假如指定 live

2020-08-15 18:45:04 1817

原创 SpringCloud 服务调用: Ribbon与OpenFeign

更多SpringCloud组件学习Ribbon 负载均衡与服务调用Ribbon 基础概念Ribbon 完成了那些功能?   Spring Cloud Ribbon是一个基于HTTP和TCP的 客户端负载均衡工具 ,主要提供客户端需要的负载均衡算法和服务调用 。(目前 Ribbon 也已经进入维护阶段)Ribbon 的本地 LB(Load Balance)与 Nginx 服务端 LB 的区别是?   Ribbon 是本地的 LB ,通过到注册中心获取服务列表缓存到本地,在调用接口时,选取对应服务器

2020-08-03 16:12:04 821

原创 SpringCloud 服务熔断、降级组件:Hystrix与Sentinel

a

2020-08-01 16:15:41 2196

空空如也

空空如也

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

TA关注的人

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