- 博客(71)
- 收藏
- 关注
原创 生产环境WAS产生javacore、dmp、dump文件分析
Java dumps(有时称为Java 核心)是在 VM 因操作系统信号或用户启动的按键组合而意外结束时生成的。您还可以通过从应用程序中以编程方式调用 Dump API 或在命令行上OutOfMemoryError指定选项来生成 Java 转储
2024-10-24 21:25:43
1707
1
原创 ShardingProxy服务端分库分表
一、为什么要有服务端分库分表?ShardingProxy,定位为一个透明化的数据库代理,是ShardingSphere重要的服务端分库分表产品。目前提供MySQL和PostgreSQL协议,透明化数据库操作。简单理解就是,他会部署成一个MySQL或者PostgreSQL的数据库服务,应用程序只需要像操作单个数据库一样去访问ShardingProxy,由ShardingProxy去完成分库分表功能。
2024-10-22 22:41:32
1384
原创 ShardingSphere实现原理与内核解析
ShardingSphere的工作整体就分为这几个步骤:1、配置管控在进入ShardingSphere的内核之前,ShardingSphere做了大量的配置信息管控。不光是将应用的配置信息进行解析,同时ShardingSphere还支持将这些配置信息放到第三方的注册中心,从而可以实现应用层的水平扩展。对于使用ShardingJDBC开发来说,或许这不是一个多起眼的功能。因为应用完全可以自己管理配置,或者自行接入Nacos这样的配置中心。但是如果运维人员使用ShardingProxy的话,
2024-10-15 00:20:48
1113
原创 ShardingJDBC分库分表实战
ShardingSphere分库分表的核心概念虚拟库: ShardingSphere的核心就是提供一个具备分库分表功能的虚拟库,他是一个ShardingSphereDatasource实例。应用程序只需要像操作单数据源一样访问这个ShardingSphereDatasource即可。示例中,MyBatis框架并没有特殊指定DataSource,就是使用的ShardingSphere的DataSource数据源。真实库: 实际保存数据的数据库。这些数据库都被包含在ShardingSphereDatasou
2024-10-12 00:16:28
1420
原创 ShardingSphere分库分表产品介绍
ShardingSphere-JDBC 定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。适用于任何基于 JDBC 的 ORM 框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template 或直接使用 JDBC;支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Hi
2024-10-09 23:51:50
1105
原创 Logstash、FileBeat、ELK整合详解
2.ELK架构ELK架构分为两种,一种是经典的ELK,另外一种是加上消息队列(Redis或Kafka或RabbitMQ)和Nginx结构。2.1 经典的ELK经典的ELK主要是由Filebeat + Logstash + Elasticsearch + Kibana组成,如下图:(早期的ELK只有Logstash + Elasticsearch + Kibana)
2024-10-07 10:00:00
1472
原创 ElasticSearch高级功能详解与读写性能调优
Elasticsearch 5.0后,引入的一种新的节点类型。默认配置下,每个节点都是Ingest Node:具有预处理数据的能力,可拦截lndex或 Bulk API的请求对数据进行转换,并重新返回给Index或 Bulk APl无需Logstash,就可以进行数据的预处理,例如:为某个字段设置默认值;重命名某个字段的字段名;对字段值进行Split 操作支持设置Painless脚本,对数据进行更加复杂的加工
2024-10-05 00:13:41
1305
2
原创 ElasticSearch集群架构原理剖析
为什么要使用ES集群架构分布式系统的可用性与扩展性高可用性服务可用性——允许有节点停止服务数据可用性——部分节点丢失,不会丢失数据可扩展性请求量提升/数据的不断增长(将数据分布到所有节点上)ES集群架构的优势:提高系统的可用性,部分节点停止服务,整个集群的服务不受影响存储的水平扩容
2024-10-03 22:37:03
1581
原创 ElasticSearch分词器、相关性详解与聚合查询实战
Elasticsearch除搜索以外,提供了针对ES数据进行统计分析的功能。聚合查询的语法结构与其他查询相似,通常包含以下部分:查询条件:指定需要聚合的文档,可以使用标准的 Elasticsearch 查询语法,如 term、match、range 等等。聚合函数:指定要执行的聚合操作,如 sum、avg、min、max、terms、date_histogram 等等。每个聚合命令都会生成一个聚合结果。聚合嵌套:聚合命令可以嵌套,以便更细粒度地分析数据。
2024-10-01 08:45:00
1036
原创 ElasticSearch高级查询Query DSL
ES中提供了一种强大的检索数据方式,这种检索方式称之为Query DSL(Domain Specified Language 领域专用语言) , Query DSL是利用Rest API传递JSON格式的请求体(RequestBody)数据与ES进行交互,这种方式的丰富查询语法让ES检索变得更强大,更简洁。
2024-09-28 19:21:32
1127
转载 ElasticSearch快速入门实战
ElasticSearch(简称ES)是一个开源的分布式搜索和数据分析引擎,是用Java开发并且是当前最流行的开源的企业级搜索引擎,能够达到近实时搜索,它专门设计用于处理大规模的文本数据和实现高性能的全文检索。以下是一些 Elasticsearch 的特点和优势:分布式架构:Elasticsearch 是一个分布式系统,可以轻松地水平扩展,处理大规模的数据集和高并发的查询请求。全文检索功能:Elasticsearch 提供了强大的全文检索功能,包括分词、词项查询、模糊匹配、多字段搜索等,并支持丰富
2024-09-25 22:32:27
8429
2
原创 RocketMQ常见问题分析与总结
NameServer在RocketMQ中,是扮演的一个路由中心的角色,提供到Broker的路由功能。但是其实路由中心这样的功能,在所有的MQ中都是需要的。kafka是用zookeeper和一个作为Controller的Broker一起来提供路由服务,整个功能是相当复杂纠结的。而RabbitMQ是由每一个Broker来提供路由服务。而只有RocketMQ把这个路由中心单独抽取了出来,并独立部署。
2024-09-23 00:00:00
1277
原创 RocketMQ核心编程模型与最佳实践
消息确认机制RocketMQ要支持互联网金融场景,那么消息安全是必须优先保障的。而消息安全有两方面的要求,一方面是生产者要能确保将消息发送到Broker上。另一方面是消费者要能确保从Broker上争取获取到消息。1、消息生产端采用消息确认加多次重试的机制保证消息正常发送到RocketMQ针对消息发送的不确定性,封装了三种发送消息的方式。
2024-09-21 09:30:00
947
原创 RocketMQ实战与集群架构详解
RocketMQ是阿里巴巴开源的一个消息中间件,在阿里内部历经了双十一等很多高并发场景的考验,能够处理亿万级别的消息。2016年开源后捐赠给Apache,现在是Apache的一个顶级项目。早期阿里使用ActiveMQ,但是,当消息开始逐渐增多后,ActiveMQ的IO性能很快达到了瓶颈。于是,阿里开始关注Kafka。但是Kafka是针对日志收集场景设计的,它的高级功能并不是很贴合阿里的业务场景。尤其当它的Topic过多时,由于Partition文件也会过多,这就会加大文件索
2024-09-18 23:05:36
2411
原创 Kafka日志索引详解与常见问题分析
Kafka的Log日志梳理这一部分数据主要包含当前Broker节点的消息数据(在Kafka中称为Log日志)。这是一部分无状态的数据,也就是说每个Kafka的Broker节点都是以相同的逻辑运行。这种无状态的服务设计让Kafka集群能够比较容易的进行水平扩展。比如你需要用一个新的Broker服务来替换集群中一个旧的Broker服务,那么只需要将这部分无状态的数据从旧的Broker上转移到新的Broker上就可以了。当然,这里说的的数据转移,并不是复制,粘贴这么简单,因为底层的数据文件中的细节还是非常多
2024-09-16 19:49:44
2087
原创 kafka集群架构设计原理详解
Kafka依赖很多的存储数据,但是,总体上是有划分的。Kafka会将每个服务的不同之处,也就是状态信息,保存到Zookeeper中。通过Zookeeper中的数据,指导每个Kafka进行与其他Kafka节点不同的业务逻辑。而将状态信息抽离后,剩下的数据,就可以直接存在Kafka本地,所有Kafka服务都以相同的逻辑运行。这种状态信息分离的设计,让Kafka有非常好的集群扩展性。Kafka依赖很多的存储数据,但是,总体上是有划分的。Kafka会将每个服务的不同之处,也就是状态信息,保存到Zookeeper中。
2024-09-13 23:00:00
1599
原创 Kafka客户端核心参数详解
Kafka提供了两套客户端API,HighLevel API和LowLevel API。 HighLevel API封装了kafka的运行细节,使用起来比较简单,是企业开发过程中最常用的客户端API。 而LowLevel API则需要客户端自己管理Kafka的运行细节,Partition,Offset这些数据都由客户端自行管理。这层API功能更灵活,但是使用起来非常复杂,也更容易出错。只在极少数对性能要求非常极致的场景才会偶尔使用。重点是HighLeve API 。
2024-09-11 00:18:33
2624
原创 Kafka集群搭建与基本原理详解
为什么要用Kafka,业务场景决定了产品的特点。1、数据吞吐量很大: 需要能够快速收集各个渠道的海量日志。2、集群容错性高:允许集群中少量节点崩溃。3、功能不需要太复杂:Kafka的设计目标是高吞吐、低延迟和可扩展,主要关注消息传递而不是消息处理。所以,Kafka并没有支持死信队列、顺序消息等高级功能。4、允许少量数据丢失:Kafka本身也在不断优化数据安全问题,目前基本上可以认为Kafka可以做到不会丢数据。
2024-09-09 00:13:44
2883
原创 Netty核心线程模型
Netty线程模型图Netty线程模型源码图Netty高并发高性能架构设计精髓无锁串行化设计思想直接内存直接内存与堆内存的区别直接内存分配源码分析:使用直接内存的优缺点:Netty零拷贝ByteBuf内存池设计灵活的TCP参数配置能力并发优化ByteBuf扩容机制在大多数场景下,并行多线程处理可以提升系统的并发性能。但是,如果对于共享资源的并发访问处理不当,会带来严重的锁竞争,这最终会导致性能的下降。为了尽可能的避免锁竞争带来的性能损耗,可以通过串行化设计,即消息的处理尽可能在同一个线程内完成,期间不进
2024-09-07 23:15:31
1578
原创 [Netty]实现自己的通信框架与难点分析
通信框架功能设计功能描述通信框架承载了业务内部各模块之间的消息交互和服务调用,它的主要功能如下:基于Netty的NIO通信框架,提供高性能的异步通信能力;提供消息的编解码框架,可以实现POJO的序列化和反序列化;消息内容的防篡改机制提供基于IP地址的白名单接入认证机制;链路的有效性校验机制;链路的断连重连机制;
2024-09-04 23:12:13
1120
原创 Netty核心组件详解
Netty 的优势1、API 使用简单,开发门槛低;2、功能强大,预置了多种编解码功能,支持多种主流协议;3、定制能力强,可以通过 ChannelHandler 对通信框架进行灵活地扩展;4、性能高,通过与其他业界主流的 NIO 框架对比,Netty 的综合性能最优;5、成熟、稳定,Netty 修复了已经发现的所有 JDK NIO BUG,业务开发人员不需要再为NIO 的 BUG 而烦恼;6、社区活跃,版本迭代周期短,发现的 BUG 可以被及时修复,同时,更多的新功能会加入;
2024-09-02 23:59:08
2115
原创 [Linux] IO 复用编程、epoll事件轮询机制的理解
当某一进程调用 epoll_create 方法时,Linux 内核会创建一个 eventpoll 结构体,在内核 cache 里建了个红黑树用于存储以后 epoll_ctl 传来的 socket 外,还会再建立一个 rdllist 双向链表,用于存储准备就绪的事件,当 epoll_wait 调用时,仅仅观察这个 rdllist 双向链表里有没有数据即可。有数据就返回,没有数据就 sleep,等到 timeout 时间到后即使链表没数据也返回。
2024-08-31 22:39:28
1472
原创 BIO、NIO编程与直接内存、零拷贝详解
什么是 NIO?NIO 库是在 JDK 1.4 中引入的。NIO 弥补了原来的 BIO 的不足,它在标准 Java 代码中提供了高速的、面向块的 I/O。NIO 被称为 no-blocking io 或者 new io 都说得通。和BIO 的主要区别面向流与面向缓冲Java NIO 和 IO 之间第一个最大的区别是,IO 是面向流的,NIO 是面向缓冲区的。 Java IO 面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。
2024-08-28 23:27:30
1746
原创 网络通信和TCP/IP协议详解
计算机网络的标准定义是:利用通信线路将地理上分散的、具有独立功能的计算机系统和通信设备按不同的形式连接起来,以功能完善的网络软件及协议实现资源共享和信息传递的系统。计算机网络从覆盖范围上划分可以分为三类:局域网、城域网、广域网。局域网LAN(作用范围一般为几米到几十公里)、城域网MAN(界于WAN与LAN之间)、广域网WAN(作用范围一般为几十到几千公里)。
2024-08-26 00:03:32
2141
原创 Zookeeper分布式一致性协议ZAB介绍
ZAB 协议全称:Zookeeper Atomic Broadcast(Zookeeper 原子广播协议)。Zookeeper 是一个为分布式应用提供高效且可靠的分布式协调服务。在解决分布式一致性方面,Zookeeper 并没有使用 Paxos ,而是采用了 ZAB 协议,ZAB是Paxos算法的一种简化实现。ZAB 协议是为分布式协调服务 Zookeeper 专门设计的一种支持崩溃恢复和原子广播的协议。
2024-08-24 23:37:32
1691
原创 Zookeeper集群Leader选举源码
整个zookeeper选举底层可以分为选举应用层和消息传输层,应用层有自己的队列统一接收和发送选票,传输层也设计了自己的队列,但是按发送的机器分了队列,避免给每台机器发送消息时相互影响,比如某台机器如果出问题发送不成功则不会影响对正常机器的消息发送。1、将conf文件夹里的zoo_sample.cfg文件复制一份改名为zoo.cfg,将zoo.cfg文件位置配置到启动参数里。源码导入idea后,org.apache.zookeeper.Version类会报错,需要建一个辅助类。
2024-08-22 00:08:37
519
2
原创 Zookeeper应用场景实战二
在单体的应用开发场景中涉及并发同步的时候,大家往往采用Synchronized(同步)或者其他同一个JVM内Lock机制来解决多线程间的同步问题。在分布式集群工作的开发场景中,就需要一种更加高级的锁机制来处理跨机器的进程之间的数据同步问题,这种跨机器的锁就是分布式锁。(1)基于数据库的分布式锁。这种方案使用数据库的事务和锁机制来实现分布式锁。虽然在某些场景下可以实现简单的分布式锁,但由于数据库操作的性能相对较低,并且可能面临锁表的风险,所以一般不是首选方案。(2)基于Redis的分布式锁。
2024-08-20 00:00:00
1357
原创 Zookeeper应用场景实战一
1. Zookeeper Java客户端实战ZooKeeper应用的开发主要通过Java客户端API去连接和操作ZooKeeper集群。可供选择的Java客户端API有:ZooKeeper官方的Java客户端API。第三方的Java客户端API,比如Curator。ZooKeeper官方的客户端API提供了基本的操作。例如,创建会话、创建节点、读取节点、更新数据、删除节点和检查节点是否存在等。不过,对于实际开发来说,ZooKeeper官方API有一些不足之处,具体如下:
2024-08-18 13:09:30
33924
原创 Zookeeper数据结构与集群架构详解
ZooKeeper 是一个开源的分布式协调框架,是Apache Hadoop 的一个子项目,主要用来解决分布式集群中应用系统的一致性问题。Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。ZooKeeper本质上是一个分布式的小文件存储系统(Zookeeper=文件系统+监听机制)。提供基于类似于文件系统的目录树方式的数据存储,并且可以对树中的节点进行有效管理,从而用来维护和监控存储的数据的状态变化。
2024-08-16 23:33:13
1788
原创 Redis缓存架构设计与性能优化
缓存穿透是指查询一个根本不存在的数据, 缓存层和存储层都不会命中, 通常出于容错的考虑, 如果从存储层查不到数据则不写入缓存层。缓存穿透将导致不存在的数据每次请求都要到存储层去查询, 失去了缓存保护后端存储的意义。造成缓存穿透的基本原因有两个:第一, 自身业务代码或者数据出现问题。第二, 一些恶意攻击、 爬虫等造成大量空命中。
2024-08-14 23:02:33
1631
原创 [Redis] Redisson分布式锁原理及源码分析
使用 Redis 的 SETNX 命令(Set if Not Exists)来确保只有一个客户端可以成功创建一个锁键。使用 EXPIRE 命令设置键的过期时间,防止死锁。如果客户端成功设置了锁键,它就获得了锁;如果失败,则表示锁已被其他客户端占用。为了解决锁失效或客户端故障问题,可以使用 Redisson 或者实现 Redlock 算法来增强锁的可靠性。
2024-08-12 23:43:16
1148
1
原创 Redis集群搭建与原理分析
Redis Cluster 将所有数据划分为 16384 个 slots(槽位),每个节点负责其中一部分槽位。槽位的信息存储于每个节点中。当 Redis Cluster 的客户端来连接集群时,它也会得到一份集群的槽位配置信息并将其缓存在客户端本地。这样当客户端要查找某个 key 时,可以直接定位到目标节点。同时因为槽位的信息可能会存在客户端与服务器不一致的情况,还需要纠正机制来实现槽位信息的校验调整。
2024-08-11 16:22:27
1470
原创 Redis持久化机制,主从与哨兵架构详解
1. Redis持久化1.1 RDB快照(snapshot)在默认情况下, Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。可以对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时, 自动保存一次数据集。比如说, 以下设置会让 Redis 在满足“ 60 秒内有至少有 1000 个键被改动”这一条件时, 自动保存一次数据集:#save 60 1000 //关闭RDB只需要将所有的save保存策略注释掉即可
2024-08-09 21:00:00
1102
原创 Redis数据结构与原理解析
5.1 Redis是单线程吗?Redis 的单线程主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。5.2 Redis 单线程为什么还能这么快?因为它所有的数据都在内存中,所有的运算都是内存级别的运算,而且单线程避免了多线程的切换性能损耗问题。正因为 Redis 是单线程,所以要小心使用 Redis 指令,对于那些耗时的指令(比如key
2024-08-07 23:43:38
1337
原创 Spring事务源码解析
开启Spring事务本质上就是增加了一个Advisor,但我们使用@EnableTransactionManagement注解来开启Spring事务,该注解代理的功能就是向Spring容器中添加了两个Bean:AutoProxyRegistrarProxyTransactionManagementConfigurationAutoProxyRegistrar主要的作用是向Spring容器中注册了一个InfrastructureAdvisorAutoProxyCreator的Bean。
2024-08-05 21:30:43
1079
原创 SpringAOP-底层实现源码解析
OOP表示面向对象编程,是一种编程思想,AOP表示面向切面编程,也是一种编程思想,而我们上面所描述的就是Spring为了让程序员更加方便的做到面向切面编程所提供的技术支持,换句话说,就是Spring提供了一套机制,可以让我们更加容易的来进行AOP,所以这套机制我们也可以称之为Spring AOP。
2024-08-04 18:29:39
1354
原创 SpringIoC-循环依赖源码解析
1. 什么是循环依赖?很简单,就是A对象依赖了B对象,B对象依赖了A对象。那么循环依赖是个问题吗?如果不考虑Spring,循环依赖并不是问题,因为对象之间相互依赖是很正常的事情。这样,A,B就依赖上了。但是,在Spring中循环依赖就是一个问题了,为什么?因为,在Spring中,一个对象并不是简单new出来了,而是会经过一系列的Bean的生命周期,就是因为Bean的生命周期所以才会出现循环依赖问题。当然,在Spring中,出现循环依赖的场景很多,有的场景Spring自动帮我们解决了,而有的场景
2024-08-02 00:01:02
1442
原创 SpringIoC-依赖注入源码解析
2. Spring中到底有几种依赖注入的方式?2.1 手动注入在XML中定义Bean时,就是手动注入,因为是程序员手动给某个属性指定了值。2.2 自动注入2.2.1 XML的autowire自动注入2.2.2 @Autowired注解的自动注入
2024-07-31 00:00:58
1381
原创 SpringIoC-Bean源码解析
Spring最重要的功能就是帮助程序员创建对象(也就是IOC),而启动Spring就是为创建Bean对象做准备,所以我们先明白Spring到底是怎么去创建Bean的,也就是先弄明白Bean的生命周期。Bean的生命周期就是指:在Spring中,一个Bean是如何生成的,如何销毁的。
2024-07-29 00:03:39
1194
原创 Spring源码架构-核心概念解析
BeanDefinition表示Bean定义,BeanDefinition中存在很多属性用来描述一个Bean的特点。比如:class,表示Bean类型scope,表示Bean作用域,单例或原型等lazyInit:表示Bean是否是懒加载initMethodName:表示Bean初始化时要执行的方法destroyMethodName:表示Bean销毁时要执行的方法
2024-07-27 17:22:10
1326
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人