自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(2086)
  • 资源 (1)
  • 收藏
  • 关注

转载 服务端高并发分布式架构演进之路

1. 概述本文以淘宝作为例子,介绍从一百个到千万级并发情况下服务端的架构的演进过程,同时列举出每个演进阶段会遇到的相关技术,让大家对架构的演进有一个整体的认知,文章最后汇总了一些架构设计的原则。特别说明:本文以淘宝为例仅仅是为了便于说明演进过程可能遇到的问题,并非是淘宝真正的技术演进路径2. 基本概念在介绍架构之前,为了避免部分读者对架构设计中的一些概念不了解,下面对几个最基础的概念进行介绍:分布式 系统中的多个模块在不同服务器上部署,即可称为分布式系统,如Tomcat和数据库分别部署

2021-05-25 17:47:54 272

转载 警惕软件复杂度困局

简介:对于大型的软件系统如互联网分布式应用或企业级软件,为何我们常常会陷入复杂度陷阱?如何识别复杂度增长的因素?在代码开发以及演进的过程中需要遵循哪些原则?本文将分享阿里研究员谷朴关于软件复杂度的思考:什么是复杂度、复杂度是如何产生的以及解决的思路。较长,同学们可收藏后再看。写在前面软件设计和实现的本质是工程师相互通过“写作”来交流一些包含丰富细节的抽象概念并且不断迭代过程。另外,如果你的代码生存期一般不超过6个月,本文用处不大。一 软件架构的核心挑战是快速增长的复杂性越是...

2021-05-19 18:17:58 367

转载 常见代码重构技巧,非常实用

关于重构为什么要重构项目在不断演进过程中,代码不停地在堆砌。如果没有人为代码的质量负责,代码总是会往越来越混乱的方向演进。当混乱到一定程度之后,量变引起质变,项目的维护成本已经高过重新开发一套新代码的成本,想要再去重构,已经没有人能做到了。造成这样的原因往往有以下几点:编码之前缺乏有效的设计 成本上的考虑,在原功能堆砌式编程 缺乏有效代码质量监督机制对于此类问题,业界已有有很好的解决思路:通过持续不断的重构将代码中的“坏味道”清除掉。什么是重构重构一书的作者Martin..

2021-05-13 10:01:52 389

转载 JAVA线上故障排查全套路

线上故障主要会包括cpu、磁盘、内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍。同时例如jstack、jmap等工具也是不囿于一个方面的问题的,基本上出问题就是df、free、top 三连,然后依次jstack、jmap伺候,具体问题具体分析即可。一、CPU一般来讲我们首先会排查cpu方面的问题。cpu异常往往还是比较好定位的。原因包括业务逻辑问题(死循环)、频繁gc以及上下文切换过多。而最常见的往往是业务逻辑(或者框架逻辑)导致的,可以使用js

2020-09-22 17:45:24 264

转载 图解+代码|常见限流算法以及限流在单机分布式场景下的思考

大家好,我是 yes。今天来说说限流的相关内容,包括常见的限流算法、单机限流场景、分布式限流场景以及一些常见限流组件。当然在介绍限流算法和具体场景之前我们先得明确什么是限流,为什么要限流?。任何技术都要搞清它的来源,技术的产生来自痛点,明确痛点我们才能抓住关键对症下药。限流是什么?首先来解释下什么是限流?在日常生活中限流很常见,例如去有些景区玩,每天售卖的门票数是有限的,例如 2000 张,即每天最多只有 2000 个人能进去游玩。题外话:我之前看到个新闻,最不想卖门票的景区“

2020-09-22 13:06:08 316

转载 springboot实现定时任务,异步操作,统一结果返回,全局异常处理,拦截器及事务处理

本文都是springboot的常用和实用功能,话不多说开始吧定时任务1.启动类开启注解@EnableScheduling //开启基于注解的定时任务@MapperScan("com.pdzx.dao")@SpringBootApplicationpublic class VideoApplication { public static void main(String[] args) { SpringApplication.run(VideoApplicatio

2020-08-26 20:22:41 868

原创 聊聊微服务架构及分布式事务解决方案

分布式事务场景如何设计系统架构及解决数据一致性问题,个人理解最终方案把握以下原则就可以了,那就是:大事务=小事务(原子事务)+异步(消息通知),解决分布式事务的最好办法其实就是不考虑分布式事务,将一个大的业务进行拆分,整个大的业务流程,转化成若干个小的业务流程,然后通过设计补偿流程从而考虑最终一致性。什么是事务事务(Transaction)及其ACID属性事务是由一组SQL语句组成的逻...

2020-04-21 22:34:45 340

转载 Java线程池实现原理及其在美团业务中的实践

随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池ThreadPoolExecutor类,帮助开发人员管理线程并方便地执行并行任务。了解并合理使用线程池,是一个开发人员必修的基本功。本文开篇简述线程池概念和用途,接着结合线程池的源码,帮助读者领略线程池的设计思路,最后回归实践,通过案例讲述使用线程...

2020-04-03 14:58:43 438

转载 Synchronized 和 Lock 锁在JVM中的实现原理以及代码解析

一、深入JVM锁机制:synchronizedsynrhronized关键字简洁、清晰、语义明确,因此即使有了Lock接口,使用的还是非常广泛。其应用层的语义是可以把任何一个非null对象作为"锁",当synchronized作用在方法上时,锁住的便是对象实例(this);当作用在静态方法时锁住的便是对象对应的Class实例,因为Class数据存在于永久带,因此静态方法锁相当于该类的一个全局锁...

2020-04-01 16:00:25 340

转载 一文带你理解Java中Lock的实现原理

当多个线程需要访问某个公共资源的时候,我们知道需要通过加锁来保证资源的访问不会出问题。java提供了两种方式来加锁,一种是关键字:synchronized,一种是concurrent包下的lock锁。synchronized是java底层支持的,而concurrent包则是jdk实现。关于synchronized的原理可以阅读再有人问你synchronized是什么,就把这篇文章发给他。在这里...

2020-04-01 15:04:40 656

转载 业务复杂=if else?刚来的大神竟然用策略 工厂彻底干掉了他们!

对于业务开发来说,业务逻辑的复杂是必然的,随着业务发展,需求只会越来越复杂,为了考虑到各种各样的情况,代码中不可避免的会出现很多if-else。一旦代码中if-else过多,就会大大的影响其可读性和可维护性。首先可读性,不言而喻,过多的if-else代码和嵌套,会使阅读代码的人很难理解到底是什么意思。尤其是那些没有注释的代码。其次是可维护性,因为if-else特别多,想要新加一个分...

2019-10-24 13:41:06 512

转载 Nacos 集群部署3

这里只是测试,使用的单机版nginx为Nacos集群提供一个统一的入口并使用默认的轮询策略实现简单的负载均衡。准备四台网络互通并能上外网的主机,这里使用的是四台虚拟机,Nacos节点所需的JDK和Maven均已装好。挂载SLB模式(内网SLB,不可暴露到公网,以免带来安全风险),直连SLB即可,下面挂server真实ip,可读性不好。域名 + SLB模式(内网SLB,不可暴露到公网,以免带来安全风险),可读性好,而且换ip方便,推荐模式。在3个Nacos节点上都执行以下命令进入Nacos Server的。

2023-01-11 16:05:30 57

转载 Nacos 集群部署2

Nacos支持三种部署模式单机模式 - 用于测试和单机试用。集群模式 - 用于生产环境,确保高可用。多集群模式 - 用于多数据中心场景。注:本文以Linux CentOS7系统为讲述如何部署集群模式(cluster);(虚拟机使用VMware)老规矩环境准备,请确保是在环境中安装使用:64 bit OS Linux/Unix/Mac,推荐使用Linux系统。下载.配置。下载.配置。集群需要依赖mysql,单机可不必3个或3个以上Nacos节点才能构成集群。

2023-01-10 18:08:47 77

转载 Nacos 集群部署1

在所有 nacos目录的conf的目录下,有个文件 cluster.conf.example ,将其命名为 cluster.conf,并将每行配置成ip:port。(请配置3个或3个以上节点)在所有 nacos目录的conf的目录下,有个文件 application.properties ,并将修改端口和地址、配置数据库连接。

2023-01-10 17:40:34 62

转载 EasyExcel 遭遇 java.io.IOException: Zip bomb detected

在报错代码上一行加上,问题得以解决(阅读报错信息,发现 ratio: 0.009999633802473054,而Limits: MIN_INFLATE_RATIO: 0.01,setMinInflateRatio() if you need to work with files which exceed this limit)在网上搜索其他两种设置: 代表将接受所有可能的比率。

2022-12-19 16:12:19 165

转载 Kafka如何处理大量积压消息

1. 如果是Kafka消费能力不足,则可以考虑增加 topic 的 partition 的个数,1. 消费kafka消息时,应该尽量减少每次消费时间,可通过减少调用三方接口、读库等操作,Kafka分区数是Kafka并行度调优的最小单元,如果Kafka分区数设置的太少,产生消息堆积,消费不及时,kafka数据有过期时间,一些数据就丢失了,主要是消费不及时。(拉取数据/处理时间 < 生产速度),使处理的数据小于生产的数据,也会造成数据积压。3. 每次接受kafka消息时,先打印出日志,包括消息产生的时间戳。

2022-12-15 15:00:02 321

转载 Kafka消息积压

本次出现的问题是由于客户端的消息消费逻辑耗时太长,如果生产端出现消息发送增多,消费端每次都拉取了 500 条消息进行消费,这时就很容易导致消费时间过长,如果超过了 max.poll.interval.ms 所设置的时间,就会被消费组所在的 coordinator 剔除掉,从而导致重平衡,Kafka 重平衡过程中是不能消费的,会导致消费组处于类似 stop the world 的状态下,重平衡过程中也不能提交位移,这会导致消息重复消费从而使得消费组的消费速度下降,导致消息堆积。

2022-12-13 12:14:54 53

转载 平时只会用Kafka发消息,昨天突然遇到一次Kafka消息堆积生产事故!

线上kafka消息堆积,所有consumer全部掉线,到底怎么回事?最近处理了一次线上故障,具体故障表现就是kafka某个topic消息堆积,这个topic的相关consumer全部掉线。整体排查过程和事后的复盘都很有意思,并且结合本次故障,对kafka使用的最佳实践有了更深刻的理解。好了,一起来回顾下这次线上故障吧,最佳实践总结放在最后,千万不要错过。1、现象线上kafka消息突然开始堆积消费者应用反馈没有收到消息(没有处理消息的日志)kafka的consumer group上看没有消费者注册。

2022-12-13 12:10:08 69

转载 kafka消息积压解决

Kafka分区数是Kafka并行度调优的最小单元,如果Kafka分区数设置的太少,会影响Kafka Consumer消费的吞吐量。如果数据量很大,Kafka消费能力不足,则可以考虑增加Topic的Partition的个数,同时提升消费者组的消费者数量。使用Kafka Producer消息时,可以为消息指定key,但是要求key要均匀,否则会出现Kafka分区间数据不均衡。如果消费任务宕机时间过长导致积压数据量很大,除了重新启动消费任务、排查问题原因,还需要解决消息积压问题。解决消息积压可以采用下面方法。

2022-12-13 11:51:32 51

转载 Kafka消息积压的原因和处理的方法

作为目前主流的消息中间件,被广泛的应用在了生产环境中。消息积压是日常生产经常遇到的问题,下面我们来展开了说一下。

2022-12-13 11:48:57 27

转载 Kafka-消息积压处理方案

如果现在资源不够了,简单啊,给topic增加partition,然后做数据迁移,增加机器,不就可以存放更多数据,提供更高的吞吐量了?那落磁盘的时候怎么落啊?首先,临时写个程序,连接到mq里面消费数据,收到消息之后直接将其丢弃,快速消费掉积压的消息,降低MQ的压力,然后走第二种方案,在晚上夜深人静时去手动查询重导丢失的这部分数据。其实回答这类问题,说白了,起码不求你看过那技术的源码,起码你大概知道那个技术的基本原理,核心组成部分,基本架构构成,然后参照一些开源的技术把一个系统设计出来的思路说一下就好。

2022-12-13 11:45:01 50

转载 如何解决Kafka消息积压问题

通常情况下,企业中会采取轮询或者随机的方式,通过Kafka的producer向Kafka集群生产数据,来尽可能保证Kafk分区之间的数据是均匀分布的。如果对Kafka不了解的话,可以先看这篇博客《》。

2022-12-13 11:37:52 64

转载 Kafka消息数据积压如何处理

1、如果是Kafka消费能力不足,则可以考虑增加Topic的分区数(一般一个Topic分区数为3-10个),并且同时提升消费组的消费者数量,消费者数==分区数。2、如果是下游的数据处理不及时:则提高每批次拉取的数量。批次拉取数据过少(拉取数据/处理时间

2022-12-13 11:25:06 40

转载 Kafka消息数据积压如何处理

消费能力不足,则可以考虑增加Topic的分区数(一般一个Topic分区数为3-10个),并且同时提升消费组的消费者数量,消费者数==分区数。2、如果是下游的数据处理不及时:则提高每批次拉取的数量。批次拉取数据过少(拉取数据/处理时间

2022-12-13 11:18:15 15

转载 Kafka消息数据积压如何处理

消费能力不足,则可以考虑增加Topic的分区数(一般一个Topic分区数为3-10个),并且同时提升消费组的消费者数量,消费者数==分区数。2、如果是下游的数据处理不及时:则提高每批次拉取的数量。批次拉取数据过少(拉取数据/处理时间

2022-12-13 11:16:54 20

转载 Kafka消息数据积压如何处理

消费能力不足,则可以考虑增加Topic的分区数(一般一个Topic分区数为3-10个),并且同时提升消费组的消费者数量,消费者数==分区数。2、如果是下游的数据处理不及时:则提高每批次拉取的数量。批次拉取数据过少(拉取数据/处理时间

2022-12-13 11:16:43 37

转载 利用redis生成流水号

利用redis生成流水号

2022-12-06 10:14:06 41

转载 使用 Redis 实现自增流水号

项目上有个场景是客餐申请审核以后需要生成一个流水号,规则为:202202150001,202202150002,前几位为年月日,后四位依次递增。想到 Redis 是基于内存操作的,而且速度比较快,也不占用数据库资源。于是便采用 Redis 实现的方式。形成规则工具类:获取递增:具体实现:输出结果:本地 Redis 库中的数据: Redis 序列化的策略有两种,分别是 StringRedisTemplate 和 RedisTemplate,其中StringRedisTemplate 用

2022-12-06 10:12:52 126

转载 java中日志打印规范

根据不同的日志级别,打印在不同的日志文件中,例如debug、info、warn、error日志级别的日志分别创建一个日志文件debug.log、info.log、warn.log、error.log进行日志打印;使用log来打印日志会记录到日志文件中,占用的是磁盘内存,一般不会经常出现卡(运行极慢)的现象,但如果磁盘内存占用比较高时,需要对日志进行备份处理,然后清理日志;业务系统中,核心功能的代码,尽可能打印日志完整,核心代码执行频率极高,出问题时,根据日志信息能快速定位。

2022-12-01 15:34:50 321

原创 关于架构师的一点思考

但是,这个程序还是被推倒了,当然也有其公司派系斗争的因素在里面。但是,不得不引起我们的注意,这个程序败就败在了太拘泥于细节,而忽略了顶层设计被客户牵着鼻子走,想知道客户自己说什么吗?某公司,建立的程序又被推倒,外人觉得很奇怪,这个程序的主管非常敬业,关注到了程序每一个细节,甚至包括每一个按钮的文字和位置。可以从看似复杂的东西中找到共性,抽象出共性的东西,以最直接和最简洁的方案通过逻辑构造出千奇百怪的应用结构!这个主管很委屈,他说,他完全是按照客户需求制作的,客户怎么说的,他就怎么做了,难道有错?

2022-11-29 07:18:18 18

转载 RestTemplateUtil工具类

【代码】RestTemplateUtil工具类。

2022-11-28 20:49:39 20

原创 SDK和API的区别

SDK的封装是在客户端层面的一个library(也叫做“包”或者“库”),这个library提供一些客户端API接口,类似于已经写好了的函数,你只需要调用它就好了。SDK暴露出来的接口都是和语言相关的,如果SDK是用Java写的,就需要用Java去调用那个函数;API是封装在服务端层面的library,从网络服务的层面暴露出一些API接口,提供给使用这些服务的人去调用。因为封装在服务的层面,传输数据用的是网络协议(常用HTTP/TCP),就不需要管他是用什么语言实现的;

2022-11-28 15:50:10 50

原创 MybatisPlusConfig

自定义ISqlInjector sql注入器,添加通用方法。2、自定义配置见下面文章。1、详细说明见下面文章。

2022-11-22 16:14:16 237

转载 Mybatis Plus 自定义SqlInjector sql注入器

3、MybatisPlus自定义SQL方法枚举类GeneralMybatisPlusSqlMethod。然后所有的mapper和servcie继承我们自定义扩展的基础mapper和service。2、方法对应的实现类UpdateAllColumnById。参考其他基本方法的实现类源码如:UpdateById等等。4、MybatisPlus配置类,加载自定义sql注入器。6、自定义基础service继承IService及实现类。5、自定义基础Mapper继承BaseMapper。

2022-11-22 16:11:03 250

转载 Mybatis Plus分页查询超过最大页码的自定义处理

之前在很长一度按时间内,因为我做的项目不会这么多的使用分页,所以一直都是手动的判断页码是否溢出,如果溢出就将page的当前页码设置为查询得到的页面数量,再次进行查询。分页用的少还好,一旦像是现在这个项目这样大量的用到分页,就比较头疼了,所以,今天便打算自己封装一个Helper类。最近在做一个管理后台的项目,有很多分页查询,Mybatis Plus提供了非常优秀的分页插件,但是当查询页码大于最大页码的时候,就会出现结果空白。但是这样产生的效果是溢出后按照第一页查询,而笔者现想要在页码溢出时展示最后一页。

2022-11-22 15:58:56 73

转载 Mybatis-plus 分页查询超过最大页数返回空数据问题

其中的paginationInnerInterceptor.setOverflow(true) 这个就是针对此问题的解决方案,意思就是-溢出总页数的时候默认是跳到第一页。类com/baomidou/mybatisplus/extension/plugins/inner/PaginationInnerInterceptor.java。即:total/pageSize = 40/10 = 4(页数) < 5(要访问的页)从上面源码中可以看出,如果溢出总页数的时候默认是跳到第一页。数据库查询返回的数据为空。

2022-11-22 15:49:29 327

原创 RedisConfig

【代码】RedisConfig。

2022-11-21 19:51:41 25

转载 蓝绿发布、滚动发布、灰度发布(金丝雀发布)、A/B测试

验证新版本符合预期后,逐步调整流量权重比例,使得流量慢慢从老版本迁移至新版本,期间可以根据设置的流量比例,对新版本服务进行扩容,同时对老版本服务进行缩容,使得底层资源得到最大化利用。所谓滚动升级,就是在升级过程中,并不一下子启动所有新版本,是先启动一台新版本,再停止一台老版本,然后再启动一台新版本,再停止一台老版本,直到升级完成,这样的话,如果日常需要10台服务器,那么升级过程中也就只需要11台就行了。相比于前两种发布策略,灰度发布的思想则是将少量的请求引流到新版本上,因此部署新版本服务只需极小数的机器。

2022-11-17 10:57:28 109

转载 MySQL 常用高可用方案

在使用 MGR 时,如果要实现完整的高可用方案,就需要用到 InnoDB Cluster。MHA(Master High Avaliable) 是一款 MySQL 开源高可用程序,MHA 在监测到主实例无响应后,可以自动将同步最靠前的 Slave 提升为 Master,然后将其他所有的 Slave 重新指向新的 Master。其大致原理是:在主实例的 Keepalived 中,增加监测本机 MySQL 是否存活的脚本,如果监测 MySQL 挂了,就会重启 Keepalived,从而使 VIP 飘到从实例。

2022-11-14 17:28:03 298

转载 idea更改git地址

这里可能是access key出了问题,可能是本地和远程仓库的密钥对不匹配,请检查密钥或者换用http地址拉取代码。

2022-10-26 14:19:31 1588

Java8 新特性.rar

Java8新特性,包含代码实例与技术文档。

2020-03-29

空空如也

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

TA关注的人

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