- 博客(93)
- 收藏
- 关注
转载 Kafka是支持百万级TPS的底层实现
谈到大数据传输都会想到 Kafka,Kafka 号称大数据的杀手锏,在业界有很多成熟的应用场景并且被主流公司认可。这款为大数据而生的消息中间件,以其百万级TPS的吞吐量名声大噪,迅速成为大数据领域的宠儿,在数据采集、传输、存储的过程中发挥着举足轻重的作用。在业界已经有很多成熟的消息中间件如:RabbitMQ, RocketMQ, ActiveMQ, ZeroMQ,为什么 Kafka 在众多的敌手中依然能有一席之地,当然靠的是其强悍的吞吐量。Kafka 如何做到支持百万级 TPS先用一张思维.
2021-11-04 18:05:34
376
原创 红黑树详解
红黑树的起源二叉树满足以下两个条件的树就是二叉树:本身是有序树(若将树中每个结点的各子树看成是从左到右有次序的(即不能互换),则称该树为有序树(Ordered Tree))。 树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2。简单地理解,二叉树(Binary tree)是每个节点最多只有两个分支(即不存在分支度大于 2 的节点)的树结构。通常分支被称作“左子树”或“右子树”。二叉树具有以下几个性质:二叉树中,第 i 层最多有 2i-1个结点。 如果二叉树的深度为.
2021-09-27 16:02:28
796
原创 MySQL的日志文件(bin log、redo log 、undo log)
构成MySQL数据库和InnoDB存储引擎表的各种类型文件有以下这些:参数文件:告诉MySQL实例启动时在哪里可以找到数据库文件,并且指定某些初始化参数,这些参数定义了某种内存结构的大小等设置,还会介绍各种参数的类型。日志文件:用来记录MySQL实例对某种条件做出响应时写人的文件,如错误日志文件、二进制日志文件、慢查询日志文件、查询日志文件等。socket文件:当用UNIX域套接字方式进行连接时需要的文件。pid文件:MySOL实例的进程ID文件。MySQL表结构文件:用来存放MySQL表结
2021-09-08 11:13:11
969
原创 MySQL的InnoDB存储引擎
InnoDB的版本在MySQL5.1版本中,MySQL数据库允许存储引擎以动态形式加载,存储引擎的更新不受MySQL数据库版本的限制,所有在MySQL5.1版本中存在两个版本的InnoDB,一个是静态的InnoDB,另外一个是动态加载的InnoDB,也称之为InnoDB Plugin,也称之为InnoDB1.0.X版本,随后MySQL5.5版本中InnoDB升级为InnoDB1.1.X版本;MySQL5.6版本中InnoDB升级为InnoDB1.2.X版本,主要不同如下:版本 功能 老版本
2021-05-11 11:05:01
2358
原创 AQS和ReentrantLock源码解析
谈到并发,我们不得不说AQS(AbstractQueuedSynchronizer),所谓的AQS即是抽象的队列式的同步器,内部定义了很多锁相关的方法,我们熟知的ReentrantLock、ReentrantReadWriteLock、CountDownLatch、Semaphore等都是基于AQS来实现的。AQS实现原理基本介绍AQS内部通过维护一个状态:volatile int state(共享资源),一个FIFO线程等待队列(多线程争用资源被阻塞时会进入此队列)来实现同步功能。使用vo
2021-04-26 14:14:51
178
原创 分布式ID
分布式IDUUID数据库自增时钟回拨问题在复杂的分布式系统中,往往需要对大量数据和消息进行唯一标识,要求全局唯一趋势递增(MYSQL InnoDB引擎使用聚集索引,Btree保证有序)单调递增信息安全(不连续,无规则)含时间戳UUIDUUID(Universally Unique IDentifier)是一个128位数字的唯一标识。RFC 4122描述了具体的规范实现。UUID使用16进制表示,共有36个字符(32个字母数字+4个连接符"-")..
2021-04-25 16:03:31
715
原创 ConcurrentHashMap的源码分析
ConcurrentHashMap是HashMap 的并发版本,它是线程安全的,并且在高并发的情境下,性能优于 HashMap 很多。jdk 1.7 采用分段锁技术,整个 Hash 表被分成多个段,每个段中会对应一个 Segment 段锁,段与段之间可以并发访问,但是多线程想要操作同一个段是需要获取锁的。所有的 put,get,remove 等方法都是根据键的 hash 值对应到相应的段中,然后尝试获取锁进行访问。jdk 1.8 取消了基于 Segment 的分段锁思想,改用 CAS + sync.
2021-04-12 11:43:06
205
1
原创 Mysql数据库的分区
Mysql分区Mysql从5.1版本开始支持分区的功能,分区是指根据一定的规则,数据库把一个表分解成多个更小的、更容易管理的部分,就访问数据库而言,逻辑上只有一个表或一个索引,但是实际上这个表可能由数个物理分区对象组成,每个分区都是一个独立的对象,可以作为表的一部分独立的处理。分区对应用来说完全透明的,不影响应用业务逻辑。Mysql分区的好处:和单个磁盘或者文件系统相比,分区可以存储更多数据 优化查询,在where子句中包含分区条件,可以只扫描必要的一个或者多个分区而非全表扫描,同时在涉及su
2021-03-10 22:24:01
695
原创 SpringBoot运行原理和自动配置
SpringBoot最简单的入口类:@SpringBootApplicationpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }}其中最重要的就是@SpringBootApplication注解,他是个组合注解,源码如下:@Target({ElementType.TYPE})@Reten
2021-03-03 14:56:34
831
2
原创 分布式事务解决方案Seata
分布式事务的引入:分布式事物:指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上,简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。当我们的单个数据库的性能产生瓶颈的时候,我们可能会对数据库进行分库或者分区,这个时候单个数据库的ACID已经不能适应这种情况了,引入了分布式事务单机单库没有分.
2021-02-24 17:58:41
497
1
原创 Spring Cloud Alibaba之Sentinel的使用
Sentinel: 分布式系统的流量防卫兵Sentinel 基本介绍随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。Sentinel 具有以下特征:丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。 完备的实时监控:Sentinel 同时提供实时
2021-02-14 23:25:47
1110
1
原创 Spring Cloud Alibaba之Nacos的使用
Spring Cloud Alibaba简介由于Spring Cloud Netflix进入维护模式,目前一直以后一段时间Spring Cloud Netfix提供的服务和功能就这么多,不会开发新的组件和功能,以后将以维护和Merge分支Full Request为主,所以Spring Cloud Alibaba应运而生。Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这
2020-11-02 18:06:30
1004
2
原创 基于Netty实现dubbo RPC调用
Dubbo底层使用Netty作为网络通讯框架,根据Netty手写简单的RPC框架具体步骤:定义一个接口和抽象方法,用于消费者和服务提供者之间的约定定义一个服务提供者,该类需要监听消费者的请求,并按照约定返回数据定义一个服务消费者,该类需要透明的调用自己不存在的方法,内部使用Netty请求提供者返回数据定义接口协议和抽象方法,如下的HelloService接口//提供给服务消息者和服务提供者使用public interface HelloService { publi.
2020-09-10 11:51:27
588
原创 Netty的多协议开发和粘包拆包
Bootstrap和ServerBootstrapBootstrap是引导的意思,一个Netty应用通常由一个Bootstrap开始,主要作用是配置整个Netty程序,串联各个组件,Netty中的Bootstrap是客户端程序的启动引导类,ServerBootstrap是服务端启动引导类常见API//应用于客户端,设置一个EventLoopGrouppublic B group(EventLoopGroup group)//应用于服务端,设置两个EventLoopGrouppublic
2020-08-18 11:48:57
1276
2
原创 Netty入门和原理架构解析
TCP中的粘包和拆包简述TCP的粘包和拆包TCP编程中无论是服务端还是客户端,读取和发送消息时都要考虑TCP底层的粘包和拆包机制,TCP是一个‘流’协议,数据是没有界限的,TCP底层不知道上层业务数据的含义,它会根据TCP缓冲区的实际情况进行包的划分,所以相对于业务来说,一个完整的包可能会被TCP拆分多个包进行发送 ,也有可能把许多小的包封装成一个大的数据包发送,这就是TCP的粘包和拆包的问题粘包、拆包问题说明现在假设客户端向服务端连续发送了两个数据包,用packet1和packet2来表示,
2020-06-02 11:16:13
438
原创 Java的BIO和NIO模型
Linux 网络I/O模型简介Linux的内核将所有外部设备都看做一个文件来操作,对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor (fd, 文件描述符)。 而对一个socket的读写也会有相应的描述符,称为socketfd (socket 描述符),描述符就是一个数字,它指向内核中的一个结构体(文件路径,数据区等一些属性)。根据UNIX网络编程对I/O模型的分类,UNIX提供了5种I/O模型
2020-04-07 21:36:04
473
1
原创 java常见的几种排序
常见的排序常见的排序方法有:冒泡排序、快速排序、选择排序、插入排序、希尔排序,甚至还有基数排序、鸡尾酒排序、桶排序、鸽巢排序、归并排序等。JAVA实现常见的排序冒泡排序(Bubble Sort):相邻的2个元素相互依次比较,大的往后放,经过一次循环就会拿到最大的,多次循环实现排序实现原理图代码实现: public static void bubbleSort(...
2020-03-26 22:25:56
241
原创 记录一次内存泄漏排查
问题说明 1. 网贷目前体系架构下,资金方进件审批结果,资金方放款结果,都需要跑批系统自动执行 拉取业务结果job来拉取, 该job执行间隔设置为1分钟 2. 在测试过程中发现,一段时间过后就发现跑批执行运来越慢,结果长期无法准时拉回网贷,查询hades日志发现 hades通过 order ex和loan ex 拉取5-6条省联社结果数据,竟然要花到6分钟 3. 重启hades...
2020-03-13 14:27:50
417
原创 面试总结
你们有没有做MySQL读写分离?如何实现mysql的读写分离?MySQL主从复制原理的是啥?如何解决mysql主从同步的延时问题?这个,高并发这个阶段,那肯定是需要做读写分离的,啥意思?因为实际上大部分的互联网公司,一些网站,或者是app,其实都是读多写少。所以针对这个情况,就是写一个主库,但是主库挂多个从库,然后从多个从库来读,那不就可以支撑更高的读并发压力了吗?面试题剖析(1)如何...
2020-03-12 21:39:11
159
原创 zookeeper
zookeeper的简介Apeche Zookeeper是由Apache Hadoop的子项目,起源于雅虎研究院的一个研究小组开发的一个无单点问题的分布式协同服务系统,这就是zookeeper,主要提供:统一命名服务、组成员管理、配置管理和分布式锁等分布式的基础服务(分布式应用程序可以基于zookeeper实现诸如数据发布和订阅、负载均衡、命名服务、分布式协调和通知、集群管理、Master选举...
2020-03-08 17:58:27
519
原创 分布式事务的理解
事务数据库事务:是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令。更简答的说就是:要么全部执行成功,要么撤销不执行。事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性...
2020-03-08 14:20:40
844
1
原创 Spring如何解决循环依赖
什么是循环依赖循环依赖就是循环引用,就是两个或者多个Bean相互之间持有对象最终反映为一个环,注意此处㐊循环调用,循环调用是方法之间的环调用,循环调用是无法解决的,除非有终结条件,否则就是死循环,最后导致栈内存溢出Spring如何解决循环依赖Spring容器循环依赖包括:构造器循环依赖和setter方法循环依赖1.构造器循环依赖表示通过构造器注入构成的循环依赖,此依赖是无...
2020-02-25 21:37:25
437
原创 一致性协议和paxos算法
集中式和分布式的架构所谓的集中式系统就是由由一台或多台主计算机组成中心节点,数据集中存储于这个中心节点,整个系统的所有业务单元都集中部署在这个中心节点上,系统的所有功能均由其集中处理。集中式系统最大的特点就是部署结构简单。由于集中式系统往往基于底层性能卓越的大型主机,因此无须考虑如何对服务进行多个节点的部署,也就不用考虑多个节点之间的分布式协作问题。分布式系统是一个硬件活软件组件分布在不同...
2020-01-07 14:25:01
485
原创 SpringRetry重试机制
前言Spring实现了一套重试机制,功能简单实用。Spring Retry是从Spring Batch 2.2.0版本中独立出来,变成了Spring Retry模块。,已经广泛应用于Spring Batch,Spring Integration, Spring for Apache Hadoop等Spring项目。使用Spring Retry(一)Maven依赖 <!--...
2019-12-31 19:36:57
4502
3
原创 SpringBoot整合Kafka
SpringBoot整合Kakfapom.xml文件引入kafka相关依赖<dependencies> </dependency> <dependency> <groupId>org.springframework.kafka</groupId> <artifactId...
2019-12-25 13:27:40
772
原创 Kafka消费者(四)
Kafka中的offset对于 Kafka 中的分区而言,它的每条消息都有唯一的 offset,用来表示消息在分区中对应的位置。对于消费者而言,它也有一个 offset 的概念,消费者使用 offset 来表示消费到分区中某个消息所在的位置。为了区分,对于消息在分区中的位置,我们将 offset 称为“偏移量”;对于消费者消费到的位置,将 offset 称为“位移”或者“消费位移”。...
2019-12-17 21:00:09
1276
原创 Kafka的消费者(三)
消费者和消费组消费者(Consumer)负责订阅 Kafka 中的主题(Topic),并且从订阅的主题上拉取消息。与其他一些消息中间件不同的是:在 Kafka 的消费理念中还有一层消费组(Consumer Group)的概念,每个消费者都有一个对应的消费组。当消息发布到主题后,只会被投递给订阅它的每个消费组中的一个消费者。消费者和消费组与分区的关系如上图,某个主题中共有4个分区(P...
2019-09-30 11:22:10
1127
原创 Kafka的生产者(二)
Kafka的历史变迁在 Kafka 的历史变迁中,一共有两个大版本的生产者客户端:第一个是于 Kafka 开源之初使用 Scala 语言编写的客户端,;第二个是从 Kafka 0.9.x 版本开始推出的使用 Java 语言编写的客户端,它弥补了旧版客户端中存在的诸多设计缺陷。虽然 Kafka 是用 Java/Scala 语言编写的,但这并不妨碍它对于多语言的支持,在 Kafka 官网中,...
2019-09-29 11:45:24
1700
原创 Kafka的介绍和安装(一)
初识KafkaKafka 起初是由 LinkedIn 公司采用 Scala 语言开发的一个多分区、多副本且基于 ZooKeeper 协调的分布式消息系统,现已被捐献给 Apache 基金会。目前 Kafka 已经定位为一个分布式流式处理平台,它以高吞吐、可持久化、可水平扩展、支持流数据处理等多种特性而被广泛使用。目前越来越多的开源分布式处理系统如 Cloudera、Storm、Spark...
2019-08-27 11:00:06
327
原创 RabbitMQ的总结(二)
使用Spring Boot整合RabbitMQ来演示hello word配置文件:application.propertiesspring.rabbitmq.host=119.65.182.47spring.rabbitmq.port=5672spring.rabbitmq.username=guestspring.rabbitmq.password=guestRabbitCo...
2019-08-25 20:49:22
1638
1
原创 RabbitMQ的总结(一)
安装RabbitMQ这里是基于docker安装的,非常的方便,拉取RabbitMQ镜像,运行即可RabbitMQ自带的管理页面:http://119.25.162.48:15672/#通过默认账户guest/guest 登录,如果能够登录,说明安装成功。了解一下消息中间件的应用场景异步处理场景说明:用户注册后,需要发注册邮件和注册短信,传统的做法有两种1.串行...
2019-08-25 20:48:54
5410
1
原创 HTTP协议和HTTPS
HTTPhttp协议:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。它是互联网交互的一种规则http的特点:1、默认端口是80(如果端口号是80,可以省略不写)2、http协议永远是客户端(浏览器或者手机等)发送请求,服务器回送响应...
2019-08-21 23:10:02
292
原创 理解OAuth 2.0
什么是OAuthOAuth是一个关于授权(authorization)的开放网络标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容,在全世界得到广泛应用,目前的版本是2.0版,OAuth2.0是OAuth协议的延续版本,但不向后兼容OAuth 1.0即完全废止了OAuth1.0。oauth是Open Aut...
2019-07-31 19:08:45
385
原创 数据库缓存一致性的讨论
引入在项目中,我们通常会适应缓存这个技术来避免巨大的数据库访问压力和提高获取数据的效率问题,在使用缓存中我们通常的模式是,第一次查询数据库,然后把结果放入缓存中,下次的查询会先访问缓存,当缓存不存在的时候才会访问数据库或者是其他的设置缓存策略,但是原理是一样的,在这种情况下会引发以下问题:问题:怎么保持缓存与数据库一致?也就是说在数据更新的时候,如何做到DB和缓存同时更新且保持一致?要...
2019-07-13 23:27:14
159
原创 HashMap源码深入分析(1.8和1.7)
hashMap源码解析数据结构:数组+链表,即hashMap里面是个数组,数组的每个元素都是一个单向链表 * 默认容量,必须是2的n次方 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 /** * 最大容量,桶的最大值,必须是2的n次方 */ s...
2019-07-12 10:27:19
193
原创 一致性哈希算法
我们在使用Redis的时候,为了保证Redis的高可用,提高Redis的读写性能,最简单的方式我们会做主从复制,组成Master-Master或者Master-Slave的形式,或者搭建Redis集群,进行数据的读写分离,类似于数据库的主从复制和读写分离比如现在有大概2000W左右的数据,按照我们约定的规则进行分库,规则就是随机分配,我们可以部署8台缓存服务器,每台服务器大概含有500W条数据...
2019-07-11 09:15:34
1973
转载 JAVA类加载器的理解
引入一般情况下,我们平时写的java类需要通过打包成.jar或者是.war的包,然后把打包好的jar包或者war包放到机器上部署,通过 java命令去运行一个jar包中的代码,这其中包含一个重要的步骤,就是编译,我们需要把写好的.java文件编译成.class字节码文件,字节码才是可以被运行起来的,一般我们需要使用诸如java-jar 之类的命令来运行,一旦使用java命令实际上相当于启动一个...
2019-07-08 15:59:04
264
原创 深入理解JAVA中的SPI机制
什么是SPISPI全名为Service Provider Interface是JDK内置的一种服务提供发现机制,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件,简单来说,它就是一种动态替换发现的机制。在面向的对象的设计里,一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现...
2019-07-08 13:55:42
845
原创 MySQL百万级数据分页查询及优化
MYSQL分页基础语法mysql使用查询语句的时候,经常要返回前几条或者中间某几行数据,也就是我们说的分页,语法如下:SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offsetLIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,...
2019-07-03 11:33:57
4427
3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人