- 博客(74)
- 收藏
- 关注
原创 Kafka 性能为什么比 RocketMQ 好
而 RocketMQ 的一些功能,却需要了解具体这个消息内容,方便二次投递等,比如将消费失败的消息重新投递到死信队列中,如果 RocketMQ 使用 sendfile,那根本没机会获取到消息内容长什么样子,也就没办法实现一些好用的功能了。除了零拷贝以外,kafka 高性能的原因还有很多,比如什么批处理,数据压缩啥的,但那些优化手段 rocketMQ 也都能借鉴一波,唯独这个零拷贝,那是毫无办法。我们可以看到注释里写的是两个函数的用法,注释里写的是两个函数的用法,,应用层能获取到消息内容并进行一些逻辑处理。
2024-08-21 21:17:04
442
原创 RocketMQ消息堆积了怎么解决?
总的来说,处理 RocketMQ 的消息堆积需要根据具体情况进行分析和调整,可能需要结合多种方法来共同解决。同时,也需要持续监控 RocketMQ 的运行状态,及时发现并处理消息堆积的问题。RocketMQ 的消息堆积,一般都是因为客户端本地消费过程中,由于消费耗时过长或消费并发度较小等原因,导致客户端消费能力不足,出现消息堆积的问题。
2024-08-21 20:26:32
139
原创 RocketMQ 如何保证消息不丢失?
在消费者端,需要确保在消息拉取并消费成功之后再给 Broker 返回 ACK,就可以保证消息不丢失了,如果这个过程中 Broker 一直没收到 ACK,那么就可以重试。默认 16 次。
2024-08-20 21:01:24
640
原创 RocketMQ 如何保证消息的顺序性
顺序消费需要由两个阶段消息发送和消息消费协同配合,底层支撑依靠的是 RocketMQ 的存储模型;顺序消费服务启动后,通过三把锁的机制,使得消费者实例单线程的消费重平衡分配的消费队列;假如发生扩容,消费者重启,或者 Broker 宕机 ,顺序消费也会有一定几率较短时间内乱序,所以消费者的业务逻辑还是要保障幂等。
2024-08-20 08:10:33
870
原创 RocketMQ的事务消息是如何实现的
分布式事务解决的是问题。事务消息是 Apache RocketMQ 提供的一种高级消息类型,支持在分布式场景下保障消息生产和本地事务的最终一致性。
2024-08-16 22:31:09
720
原创 什么是 TCC,和 2PC 有什么区别?
TCC 是 Try-Confirm-Cancel 的缩写,它是一种分布式事务解决方案,采用了基于业务逻辑的补偿机制,将整个分布式事务分解为若干个子事务,每个子事务都有一个 try、confirm 和 cancel 三个操作,通过这些操作来实现分布式事务的执行和回滚。
2024-08-15 20:39:06
878
原创 分布式事务和 XA、2PC、3PC
无论是二阶段提交还是三阶段提交都从不同程度地解决了分布式数据一致性问题,使用范围非常广泛,但都无法彻底解决分布式的一致性问题。还有一种一致性协议 Raft、ZAB、Paxos 算法,解决了无限期等待问题,也解决了“脑裂”问题。
2024-08-14 23:46:52
933
原创 分布式事务和一致性
分布式事务是指在分布式系统中涉及到或的事务处理,这些数据库或应用程序可能布在不同的物理节点上,甚至可能位于不同的地理位置,在分布式事务中,需要确保所有参与者的事务操作都能保持一致性,即所有参与者的事务。举个例子,假设一个电商系统,用户下单后需要扣减库存、扣减账户余额、生成订单等操作。在单机环境下,可将这些操作放在同一个事务中,保证原子性、一致性和持久性。但在分布式环境下,可能存在多个服务(如库存。
2024-08-13 21:00:29
985
原创 Kafka 的 ISR 机制
在 0.9.x 之前的版本,Kafka 有一个核心的参数 :replica.lag.max.messages 表示如果 Follower 落后 Leader 的消息数量超过了这个参数值,就认为 Follower 就会从 ISR 列表里移除。由于 ISR 中的副本与之前的领导副本保持同步,新的领导副本能够继续提供服务,而不会丢失数据。当追随者副本追上了领导副本的日志进度(即达到了与领导副本相同的日志偏移量),领导副本会将其重新加入ISR。具体的 ISR 列表维护机制在不同的 Kafka 版本中有所变化。
2024-08-11 16:03:42
424
原创 Kafka 高水位了解过吗?为什么 Kafka 需要 Leader Epoch ?
介绍了 kafka 的高水位的作用和副本同步流程,同时引出 Leader Epoch 解决副本同步产生的数据一致性的问题
2024-08-10 17:40:05
565
原创 零拷贝详解
拷贝”:就是指数据从一个存储区域转移到另一个存储区域。“零” :表示次数为0,它表示拷贝数据的次数为0。合起来,那零拷贝就是不需要将数据从一个存储区域复制到另一个存储区域咯。零拷贝是指计算机执行IO操作时,CPU不需要将数据从一个存储区域复制到另一个存储区域,从而可以减少上下文切换以及CPU的拷贝时间。它是一种I/O操作优化技术。如果进程运行于内核空间,被称为进程的内核态如果进程运行于用户空间,被称为进程的用户态。什么是CPU上下文?CPU 寄存器,是CPU内置的容量小、但速度极快的内存。
2024-08-07 22:41:17
966
原创 设计模式七大原则(七)合成复用原则
合成复用原则(Composite/Aggregate Reuse Principle,CARP)是指尽量使用对象组合(has-a)/ 聚合(contanis-a),而不是继承关系达到软件复用的目的类的复用一般分为两种:一种是组合/聚合,另一种则是继承。继承复用的优点在于扩展性较好,子类继承父类,父类的大部分功能都可以提供给子类使用,修改和扩展相对比较容易。继承复用的缺点在于这种方式会破坏包装,继承会将父类的实现细节暴露给子类。继承复用也叫白箱复用,组合聚合复用也叫黑箱复用。
2024-07-19 22:24:57
494
原创 设计模式七大原则(六)里氏替换原则
里氏替换原则(Liskov Substitution Principle,LSP):如果对每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都替换成o2时,程序P的行为没有变化,那么类型T2是类型T1的子类型。简单来说,替换原则的目的是确保继承关系中的子类能够在不改变程序正确性的前提下,扩展父类的功能。
2024-07-19 21:42:46
781
原创 设计模式七大原则(五)迪米特法则
迪米特原则(Law of Demeter LoD)是指一个对象应该对其他对象保持最少的了解,又叫最少知 道原则(Least Knowledge Principle,LKP),尽量降低类与类之间的耦合。以上代码,Leader 只需要联系 employee 去统计课本数量得到结果,不需要与 book 建立联系。
2024-07-19 18:29:53
413
原创 kafka 副本数据同步原理和数据丢失解决方案
副本的协同机制请移步:kafka 消息分发机制、分区和副本机制(三、分区的副本机制)副本还有一个重要的机制,就是数据同步过程,它需要解决怎么传播消息在向消息发送端返回 ack 之前需要保证多少个 Replica 已经接收到这个消息一、 副本的结构深红色部分表示 test_replica 分区的 leader 副本,另外两个节点上浅色部分表示 follower 副本二、 数据的处理过程Producer 在发布消息到某个 Partition 时:先通过 ZooKeeper 找到该 Pa
2022-04-20 23:38:31
3993
1
原创 kafka 消息分发机制、分区和副本机制
一、消息分发机制1.1 kafka 消息分发策略消息是 kafka 中最基本的数据单元,在 kafka 中,一条消息由key、value两部分构成,在发送一条消息 时,我们可以指定这个key,那么 producer 会根据 key 和partition 机制来判断当前这条消息应该发送并 存储到哪个 partition 中。我们可以根据需要进行扩展 producer 的 partition 机制。代码示例可移步:kafka 应用实战的第五点自定义分区(Partitioner)1.2、消息默认的分发机制
2022-04-17 17:58:26
5790
原创 kafka 应用实战
一、Java 中使用 kafka 进行通信依赖<dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>2.0.0</version></dependency>发送端代码public class MyKafkaProducer extends Thread{
2022-04-14 00:41:54
5047
原创 kafka 集群搭建
三台服务器分别是192.168.10.150192.168.10.151192.168.10.152然后在三台服务器分别安装 kafka。下载 kafkawget --no-check-certificate https://dlcdn.apache.org/kafka/3.1.0/kafka_2.13-3.1.0.tgz解压tar -xzf kafka_2.13-3.1.0.tgz修改配置vim kafka_2.13-3.1.0/config/server.properties
2022-04-12 08:42:53
1521
原创 zookeeper 集群搭建及常见问题解决(虚拟机)
本次搭建集群,Zookeeper节点个数(奇数)为3个。默认对外提供服务的端口号2181 ,集群内部3个节点之间通信默认使用 2888:3888。节点 IP 如下(虚拟机):192.168.10.150192.168.10.151192.168.10.152然后在三台服务器分别安装zookeeper进入安装位置cd /usr/local/soft/zookeeper下载 zookeeperwget https://dlcdn.apache.org/zookeeper/zookeepe
2022-04-12 06:38:27
2470
原创 kafka 入门概念和架构,以及应用场景
一、Kafka 简介Kafka 是 linkedin 使用 Scala 编写具有高水平扩展和高吞吐量的分布式消息系统。Kafka 对消息保存时根据 Topic 进行归类,发送消息者成为 Producer ,消息接受者成为 Consumer ,此外 kafka 集群有多个 kafka 实例组成,每个实例(server)称为 broker。无论是 Kafka集群,还是 producer 和 consumer 都依赖于 zookeeper 来保证系统可用性,为集群保存一些 meta 信息。二、mq 对比
2022-04-10 22:55:21
3168
1
原创 面试题:SpringBoot 的自动装配是怎样实现的?
一、SringBoot 的自动装配实现:自动装配的入口是复合注解 @SpringBootApplication ,它主要是由以下三个注解组成:@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan装配步骤如下:@SpringBootConfiguration 里面是封装了一个@Configuration,作用就是将配置这个注解的类加载到 IOC 容器里面,主要是替换到 xml 配置文件@ComponentScan 他的
2022-04-08 00:49:41
2447
原创 RabbitMQ 消息可靠性投递分析
可靠性投递可靠性只是问题的一个方面,发送消息的效率同样是我们需要考虑的问题,而这两个因素是无法兼得的。如果在发送消息的每一个环节都采取相关措施来保证可靠性,势必会对消息的收发效率造成影响。例如:一些业务实时一致性要求不是特别高的场合,可以牺牲一些可靠性来换取效率。比如发送通知或者记录日志的这种场景,如果用户没有收到通知,不会造成很大的影响,就不需要严格保证所有的消息都发送成功。如果失败了,只要再次发送就可以了。在代码里面一定是先操作数据库再发送消息。避免因为数据库回滚导致的数据不一致。但是如果先操作数
2022-04-02 04:37:03
332
原创 Rabbit MQ入门及消息分发机制
一、消息队列简介1.1 什么是 MQ消息队列,又叫做消息中间件。是只用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型,可以在分布式环境下拓展进程的通信。1.2 为什么要使用 MQ1.2.1 异步同步通信:发出一个调用请求之后,在没有得到结果之前,就不返回。由调用者主动等待这个调用的结果。异步通信:调用在发出之后,这个调用就直接返回了,所以没有返回结果。也就是说,当一个异步过程调用发出后,调用者不会马上得到结果。而是在调用发出后
2022-03-30 02:49:14
2170
3
原创 MySQL 性能优化总结
一、优化思路我们说到性能调优,大部分时候想要实现的目标是让我们的査询更快。一个査询的流程又是由很多个环节组成的,每个环节都会消耗时间。二、连接-配置优化第一个环节是客户端连接到服务端,这一块有可能会出现性能问题可能是服务端连接数不够导致应用程序获取不到连接。比如我们遇到过的错误:---这个是超过了服务端设置的最大并发连接数Mysql: error 1040: Too many connections我们可以从两个方面来解决连接数不够的问题:1、从服务端来说,我们可以增加服务端的可用连接数
2022-03-27 19:22:13
590
原创 MySQL 事务与锁详解
一、什么是事务1.1 事务的定义维基百科的定义:事务是数据库管理系统(DBMS)执行过程中的一个逻辑单位,由 一个有限的数据库操作序列构成。这里面有两个关键点:第一个,所谓的逻辑单位,意味着它是数据库最小的工作单 元,是不可以再分的第二个,它可能包含了一个或者一系列的 DML 语句,包括 insert delete update1.2 哪些存储引擎支持事务mysql 中的 InnoDB1.3 事务的四大特性1)原子性(Atomicity):意味着我们对数据库的一系列的操作,要么都
2022-03-27 03:51:05
1199
原创 MySQL 索引原理深入剖析
一、什么是索引1.1 索引是什么维基百科上对数据库索引的定义:数据库索引,是数据库管理系统(DBMS)中一个排序的数据结构,以协助快速查询、 更新数据库表中数据。据是以文件的形式存放在磁盘上面的,每一行数据都有它的磁盘地址。如果没有索引的话,我们要从表的全部行数据里面检索一条数据,只能依次遍历这张表的全部数据, 直到找到这条数据。1.2 索引的类型在 InnoDB 里面,索引类型有三种,普通索引、唯一索引(主键索引是特殊的唯一 索引)、全文索引。普通(Normal):也叫非唯一索引,是最
2022-03-26 05:14:48
696
原创 一条 SQL 的执行流程
一条查询的语句是如何执行的?MySQL的逻辑架构图,基于5.7版本,8.0的版本去除了查询缓存。大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎
2022-03-25 03:01:36
1886
原创 高并发下如何保证接口的幂等性?
一、什么是幂等性所谓幂等,简单地说,就是对接口的多次调用所产生的结果和调用一次是一致的。那么我们为什么需要接口具有幂等性呢?设想一下以下情形:支付接口,重复支付会导致多次扣钱 订单接口,同一个订单可能会多次创建。在接收消息的时候,消息推送重复。如果处理消息的接口无法保证幂等,那么重复消费消息产生的影响可能会非常大。二、幂等性的解决方案(1)唯一索引使用唯一索引可以避免脏数据的添加,当插入重复数据时数据库会抛异常,保证了数据的唯一性。(2)乐观锁这里的乐观锁指的是用乐观锁的原理去实现
2022-03-24 02:17:18
3208
原创 Redis 保证数据一致性方案解析
谈谈一致性一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中数据的值是一致的。强一致性:这种一致性级别是最符合用户直觉的,它要求系统写入什么,读出来的也会是什么,用户体验好,但实现起来往往对系统的性能影响大弱一致性:这种一致性级别约束了系统在写入成功后,不承诺立即可以读到写入的值,也不承诺多久之后数据能够达到一致,但会尽可能地保证到某个时间级别(比如秒级别)后,数据能够达到一致状态最终一致性:最终一致性是弱一致性的一个特例,系统会保证在一定时间内,能够达到一个数据一致的状态。这里之所以将
2022-03-22 23:04:03
16607
4
原创 Redis 分布式锁实现
一、什么是分布式锁分布式锁是控制分布式系统或不同系统之间共同访问共享资源的一种锁实现,如果不同的系统或同一个系统的不同主机之间共享了某个资源时,往往需要互斥来防止彼此干扰来保证一致性。二、分布式锁需要具备哪些条件在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行高可用、高性能的获取锁与释放锁具备可重入特性具备锁失效机制、防止死锁具备非阻塞锁特性,即没有获取到锁直接返回获取锁失败三、分布式锁的实现有哪些数据库Redis(setnx命令)Zookeeper(临时节点)
2022-03-21 21:28:14
699
原创 Redis 两种持久化机制 RDB 和 AOF
Redis 是一个内存数据库,数据保存在内存中,但是我们都知道内存的数据变化是很快的,也容易发生丢失。幸好Redis还为我们提供了持久化的机制,分别是RDB(Redis DataBase) 和 AOF(Append Only File)。一、持久化流程既然 Redis 的数据可以保存在磁盘上,那么这个流程是什么样的呢?要有下面五个过程:(1)客户端向服务端发送写操作(数据在客户端的内存中)。(2)数据库服务端接收到写请求的数据(数据在服务端的内存中)。(3)服务端调用write这个系统调用,将数
2022-03-19 23:37:48
257
原创 Redis 缓存穿透和缓存雪崩解决方案
一、缓存穿透什么是穿透?前提:模拟一个不存在的订单号xxx1、Resi 中无此值2、MySQL 中也我也此值,但是一直被查询缓存层和持久层都不会命中,在日常工作中出于容错的考虑,如果从持久层查不到数据则不写入缓存层,缓存穿透将导致不存在的数据每次请求都要到持久层去查询,失去了缓存保护后端持久的意义。解决方案:1. 缓存空对象缓存空对象:是指在持久层没有命中的情况下,对key进行set (key,null)缓存空对象会有两个问题:第一,value为null 不代表不占用内存空间,空值做了缓
2022-03-19 20:16:26
936
原创 Redis 过期策略和内存淘汰机制
过期删除假如Redis 只能存 5G 数据,可是你写了 10G,那会删 5G 的数据。怎么删的,这个问题思考过么?还有,你的数据已经设置了过期时间,但是时间到了,内存占用率还是比较高,有思考过原因么?答案是:定期删除+惰性删除为什么不用定时删除策略?定时删除,用一个定时器来负责监视 key ,过期则自动删除。虽然内存及时释放,但是十分消耗 CPU 资源。在大并发请求下,CPU 要将时间应用在处理请求,而不是删除 key ,因此没有采用这一策略。定期删除+惰性删除是如何工作的呢?定期删除 是指 R
2022-03-18 23:53:00
696
原创 Redis 介绍及 SpringBoot中 的简单使用
一、Redis 是什么Redis 是一款内存高速缓存数据库。Redis全称为:Remote Dictionary Server (远程数据服务),使用C语言编写,Redis是一个key-value存储系统(键值存储系统),支持丰富的数据类型,如:String、list、set、zset、hash。Redis 是一种支持 key-value 等多种数据结构的存储系统。可用于缓存,事件发布或订阅,高速队列等场景。使用C语言编写,支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存,可持久
2022-03-18 00:32:42
1473
原创 Spring 事务总结
一、事务是什么事务是逻辑处理原子性的保证手段,通过使用事务控制,可以极大的避免出现逻辑处理失败导致的脏数据等问题。事务最重要的两个特性,是事务的传播级别和数据隔离级别。传播级别定义的是事务的控制范围,事务隔离级别定义的是事务在数据库读写方面的控制范围。二、事务的四大特性(ACID)原子性(Atomicity): 一个事务(transaction)中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务
2022-03-16 23:07:42
1153
原创 Java集合- HashMap 的7种遍历方式
HashMap 遍历从大的方向来说,可分为以下 4 类:迭代器(Iterator)方式遍历;For Each 方式遍历;Lambda 表达式遍历(JDK 1.8+);Streams API 遍历(JDK 1.8+)。但每种类型下又有不同的实现方式,因此具体的遍历方式又可以分为以下 7 种:使用迭代器(Iterator)EntrySet 的方式进行遍历;使用迭代器(Iterator)KeySet 的方式进行遍历;使用 For Each EntrySet 的方式进行遍历;
2022-03-13 23:21:35
1788
原创 Java集合- HashMap 的底层数据结构实现原理
一、HashMap 的数据结构JDK1.8 之前JDK1.8 之前 HashMap 底层是 数组和链表 结合在一起使用也就是 链表散列。HashMap 通过 key 的 hashCode 经过扰动函数处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突。所谓扰动函数指的就是 Has
2022-03-13 05:46:15
2478
原创 String 常见面试题和解析
1、String为什么是不可变字符串?但是我们在实际应用中 String是可以被改变的,能详细说一下嘛?不可变字符串主要是:保存字符串的数组被final修饰并且是私有的,并且 String 类没有提供和暴露修改这个字符串的方法。String 类被 final修饰不能被子类继承,进而避免了子类破坏 String不可变。实际中可变的原因:其实并不是改变 String ,是新创建了一个 String 对象指向改变后的值,原本的 String 成为副本字符串对象存留在内存中。2、String str
2022-03-11 23:22:57
4764
6
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人