- 博客(135)
- 收藏
- 关注
原创 保证Kafka消息有序性
(3)既没有 partition 值又没有 key 值的情况下,第一次调用时随机生成一个整数(后面每次调用在这个整数上自增),将这个值与 topic 可用的 partition 总数取余得到 partition值,也就是常说的 round-robin 算法。,并且设置参数max.in.flight.requests.per.connection=1,也即同一个链接只能发送一条消息,如此便可严格保证Kafka消息的顺序。可以在消费者中,消息分发至不同的线程时,加一个队列,消费者去做hash分发,将。
2024-01-17 16:10:04 717 1
原创 分布式系统幂等解决方案
幂等操作的特点是任意多次执行所产生的影响与一次执行的影响相同。幂等函数是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数或方法不会影响系统状态,使用者无需担心重复执行会对系统造成改变避免非预期重复请求产生副作用,如重复扣款、重复退款支持服务调用方主动发起重复请求以获得确定性结果,如失败重试、超时重试。对于可重试失败,其结果具有不确定性,最终可能成功,也可能失败,因此对于可重复请求的响应可以不一致,但必须保证不产生副作用。
2023-09-26 16:02:48 170
原创 缓存和数据库数据一致性解决方案
读操作在写操作完成数据库更新前读取了旧数据,且在写操作删除缓存后更新了缓存,从而导致数据库中的为最新数据,而缓存中的仍为旧数据。在前文缓存更新中讲到,更新缓存较好的一种方式是使用 Cache Aside 模式,即先更新数据库,再失效缓存。使用缓存最主要的原因是追求数据访问速度,而如果要追求强一致性,按照目前的技术,必然会损失访问速度这一优势,因此在需要保证数据强一致性的场景下,根本不适合使用缓存。最终一致性强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一致的状态。
2023-09-25 16:09:47 407
原创 MySQL表结构设计规范
一、表设计1. 命名规范表名由小写英文字母和下划线组成表必须填写描述信息表名中的英文单词应该使用单数形式临时表以 tmp 为前缀,以日期为后缀备份表以 bak 为前缀,以日期为后缀使用hash、md5 进行散表,表名后缀使用16进制2. 设计规范必须定义主键,一般默认为id,整型自增主键不允许修改,一般采用业务无关字段表必须包含 gmt_create 和 gmt_modified 字段记录创建时间和修改时间禁止使用外键慎用触发器和存储过程。将业务逻辑放到应用层更合适单条记录
2023-09-08 16:40:14 352
原创 PostgreSQL知识点总结
表空间参数 tablespace_option :如果在比 I/O子系统更快或更慢的磁盘上存储表空间,则配置项会变得很有意义。decimal(6,2):表示总共位数6位,小数部分位数2位。:real 6位精度、 double precision 15位精度、float(n) 指定精度。使用in ,sql语句是先执行子查询,也就是先查询b表,在查a表,在创建数据库、表时可以指定表空间,以便将对象存储在特定的表空间上。删除表时如果该表被其他表引用(外键),直接删除会报错,需。,所以会选择使用索引,性能非常好!
2023-07-17 15:15:02 381 1
原创 PostgreSQL
表空间参数 tablespace_option :如果在比 I/O子系统更快或更慢的磁盘上存储表空间,则配置项会变得很有意义。在创建数据库、表时可以指定表空间,以便。TABLESPACE:表空间。ENCODING:编码。
2023-07-17 14:00:53 998
原创 领域驱动设计:软件核心复杂性应对之道
很多应用程序最主要的复杂性并不在技术上,而是来自领域本身、用户的活动或业务。领域驱动设计是一种设计方法,试图解决软件难以理解、难以演化的问题。领域驱动设计试图用围绕业务概念来构建领域模型的方式来控制业务的复杂性。
2023-01-29 19:27:01 1397
原创 【Hadoop学习笔记】(四)——Flume
Flume是一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。
2022-10-27 17:24:18 757
原创 【Hadoop学习笔记】(三)——Sqoop
Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(例如 :MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。其原理和 Hive 类似,本质就是通过命令生成 MapReduce 任务,进而去执行数据迁移任务。
2022-10-27 15:35:23 949
原创 【Hadoop学习笔记】(二)——Hive的原理及使用
Hive是一个在Hadoop中用来处理结构化数据的数据仓库基础工具。它架构在Hadoop之上,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。Hive数据仓库工具能为HDFS上的数据提供类似SQL的查询语言(HiveQL),并将SQL语句转变成MapReduce任务来执行。Hive 明显降低了 Hadoop 的使用门槛,任何熟悉 SQL 的用户都可以使用 Hive。Hive 经常用于业务和数据分析,并对存储在 HDFS 上的数据执行特殊查询。
2022-10-27 11:29:15 872
原创 【Hadoop学习笔记】(一)——MapReduce的原理及使用
MapReduce是大数据离线计算的一种处理范式。它的基本概念就是“分而治之”:将单个问题分解成多个独立的子任务,再将子任务的结果汇聚成最终结果。在 MapReduce 中,它会先把样本分成一段段能够令单台计算机处理的规模,然后让多台计算机同时进行各段样本的整理和统计,每执行完一次统计就对映射统计结果进行规约处理,最终完成大规模的数据规约。MapReduce 的含义分为两步:Map 和 Reduce (映射和规约)。上述过程第一阶段的整理工作就是"映射",把数据进行分类和整理,
2022-10-25 11:40:51 1176
原创 Kafka过期时间TTL、延时队列、死信队列实现方案
这里提供一种实现方案:将消息的 TTL 的设定值以键值对的形式保存在消息的 header 字段中,在消费者端配置拦截器,消费者在消费消息时判断此条消息是否超时。解决方式,提前记录这一批消息的最大偏移量,或在过滤之后的消息集中的头部或尾部设置一个状态消息,专门用来存放这一批消息的最大偏移量。Kafka 和 RabbitMQ 不同,Kafka的消息并没有TTL这一概念,因此想要实现消息的过期功能,需要作额外的处理。需要注意 RecordHeader 的值是 byte[]类型,因此需要进行转换。
2022-10-18 10:14:19 2234
原创 Kafka高可用性原理
leader epoch 代表 leader 的纪元信息,初始值为0,每当 leader 变更一次, leader epoch 的值就会加1,相当于为 leader 增设了一个版本号。数据在主从复制的过程中难免会遇到某一节点宕机的情况,如何确保在类似特殊情况下依旧保持各副本数据的一致性,是分布式系统必须要解决的问题。前面提到了,Kafka采用了主写主读的方式,副本仅仅提供了数据容错功能,为什么 Kafka 不采用读写分离的方式呢。读写分离的主要作用是分摊负载,而 Kafka 本身就能很好的做到负载均衡,
2022-10-09 16:09:41 1380
原创 Kafka事务消息详解
如果消费者先处理消息后提交位移,那么如果在消息处理之后在位移提交之前消费者宕机了,那么重新上线后,会从上一次位移提交的位置拉取,这就导致了重复消息,对应 at least once。反过来,如果先提交位移后处理消息,就有可能会造成消息的丢失,对应 at most once。设置为 true即可(默认为false),开启后生产者就会幂等的发送消息。Kafka提供了幂等机制,只需显式地将生产者客户端参数。注意:序列号实现幂等只是针对每一对,即。Kafka消费者消息保障主要。
2022-10-08 11:39:48 4329
原创 时间轮算法
且通过 DelayQueue推进时间又显著减少了时间的“空推进”,减少无故空耗机器的性能资源,通过以少量空间换时间做到“时间轮按照上述的方式运转,但是可以看到该时间轮的时间范围(interval)是有限的(tickMs*wheelSize),如果任务的延时超过了该时间范围(interval),如此时要插入一个延时为350ms的任务,则涉及到了。,而每一层时间轮的 wheelSize 是固定的,都是20,因此第二层时间轮的时间跨度为 400ms,以此类推,第三层时间轮的时间跨度为8000ms。
2022-09-30 15:32:18 1455
原创 Kafka消费者的线程安全问题和多线程实现
那么就会有越来越多的消息得不到及时的消费造成延迟。因此,可以采用多线程的方式来提高消费者的整体消费能力。使用该方式实现,一般所有的消费线程都属于同一个消费者组,一个消费线程可以消费一个或多个分区中的消息,因此。KafkaConsumer 非线程安全不意味着在消费消息的时候只能以单线程的方式执行,如果。的方式来获取当前 KafkaConsumer 的使用权,如果获取不到则抛异常。此外,如果需要手动提交,该种方式的实现也更加困难,有可能会有数据丢失的风险。与线程安全的 KafkaProducer 不同,
2022-09-30 10:18:48 2289 1
原创 Zookeeper分布式锁源码分析
使用Zookeeper分布式锁时,一般会使用Curator中的实现。本文主要分析一下Curator中的可重入锁 InterProcessMutex 的源码实现。这么一来,锁的获取就可以一个一个传递下去,并且一次只唤醒一个,不会导致羊群效应。......
2022-08-31 16:02:51 386
原创 Curator使用手册
Curator是netflix公司开源的一套zookeeper客户端。与Zookeeper提供的原生客户端相比,Curator的抽象层次更高,简化了Zookeeper客户端的开发量。Curator,包括连接重连、反复注册wathcer和NodeExistsException 异常等。Curator由一系列的模块构成,对于一般开发者而言,常用的是和。curator-framework只是对zookeeper客户端做了简单的封装,提供基本的连接和重试功能。...
2022-08-31 14:35:32 1010
原创 线程池源码分析
线程池中有一个interruptIdleWorkers() ,该方法会中断线程池中的空闲线程(没有在执行任务而是阻塞在getTask方法中),可以看到该方法在中断线程前会先去尝试获取worker的lock,如果该worker正在执行任务那么就会被上锁,进而不会被该方法中断。可以看到进入回收方法后,加锁地在 workers(一个存放Workers的HashSet)中移除该Worker,从而完成线程的回收。上面启动了 Worker 内部的线程,线程启动后会去调用 Worker 的 run()方法。
2022-08-24 16:58:49 306
原创 Kafka调优策略
例如:producer 吞吐量 = 20m/s;consumer 吞吐量 = 50m/s,期望吞吐量 100m/s;• ISR 里应答的最小副本数量大于等于 2(min.insync.replicas = 2)参考文献:https://zhuanlan.zhihu.com/p/371361083。• 幂等性(enable.idempotence = true) + 事务。• 区副本大于等于 2 (–replication-factor 2)分区数 = 100 / 20 = 5 分区。
2022-08-22 10:25:35 1777
原创 【Kafka源码分析】三、消费者Consumer
选择策略是 根据groupId的hashcode值与offsets的分区数量求模 (如XXX主题的默认分区数是50,groupid的hashcode值 = 1,1% 50 = 1,那么XXX主题的1号分区,在哪个broker上,就选择这个节点的coordinator作为协调者)的放置分区到消费者上面,例如说7个分区,交给3个消费者进行消费,他的分配策略也是3,2,2的格式,和range类似,但不同的是黏性分区中的3不一定是第一个,而是随机的,尽可能的均衡。1 号消费者:消费到 2、5、3 号分区数据。
2022-08-22 10:17:19 862
原创 Shell编程
Shell是一个命令行解释器,也是一个强大的编程语言,通过Shell可以直接调用Linux系统命令1. Shell脚本的格式Shell脚本最好以.sh结尾,Linux会知道这是一个Shell脚本并通过颜色标识Shell脚本的第一行必须为 #!/bin/bash, 用来标识这是一个Shell脚本后面遍写Shell代码即可2. 特殊符号Shell中有一些特殊的符号具有特殊的含义:$:调用变量的值$(命令):返回命令执行的结果 (如 d=$(date),d会赋值为当前时间;若不加括号,d的值就是
2021-05-28 16:03:36 77
原创 《阿里巴巴开发手册》学习总结(二)——异常日志、单元测试、安全规约、MySQL
二. 异常日志1. 错误码错误码为字符串类型,共 5 位,分成两个部分:错误产生来源+四位数字编号错误产生来源分为 A/B/C,A 表示错误来源于用户,比如参数错误,用户安装版本过低,用户支付超时等问题;B 表示错误来源于当前系统,往往是业务逻辑出错,或程序健壮性差等问题;C 表示错误来源于第三方服务,比如 CDN 服务出错,消息投递超时等问题;2. 异常处理事务场景中,抛出异常被 catch 后,如果需要回滚,一定要注意手动回滚事务。不要在 finally 块中使用 return。
2021-05-18 16:45:12 360 1
原创 《阿里巴巴开发手册》学习总结(一)——编程规约
一. 编程规约1. 命名风格类名使用 UpperCamelCase 风格,但以下情形例外:DO / BO / DTO / VO / AO /PO / UID 等 (如UserDO / HtmlDTO是正确的)常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。(如MAX_STOCK_COUNT)POJO 类中的任何布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列化错误。MySQL 规约中的建表约定第一条,表达是与否的变量采用 is_xxx 的命名方式,所
2021-05-17 18:36:05 241
原创 Git学习总结
一. Git原理1. Git中数据的保存方式Git 像是把数据看作是对小型文件系统的一系列快照。 在 Git 中,每当你提交更新或保存项目状态时,它基本上就会对当时的全部文件创建一个快照并保存这个快照的索引。为了效率,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。2. Git的数据状态Git存在3种数据状态:已修改(modified):修改了文件,但还没保存到数据库中。已暂存(staged):对一个已修改文件的当前版本做了标记,使之包含在下次提交的
2021-05-15 19:15:01 153 1
原创 Elasticsearch面试题总结
一. 概述1. 为什么要使用 Elasticsearch?在网络应用中,搜索功能十分常见。而在查询海量数据时, 如果使用传统的关系型数据库进行搜索,往往需要采用模糊查询。而模糊查询会导致查询引擎放弃索引,导致系统查询数据时都是全表扫描,在百万级别的数据库中,查询效率是非常低下的,而Elasticsearch是专业的全文搜索引擎,使用 ES可以大大提升搜索的效率。通过将经常查询的系统功能的某些字段,比如说电商系统的商品表中商品名,描述、价格还有 id 这些字段我们放入 ES 索引库里,可以大大提高查询
2021-05-12 20:59:31 592
原创 SpringCloud与SpringCloudAlibaba的比较
一. SpringCloud组件的升级与替换过去两年里,由于SpringCloud Netflix原先的一些组件进入停更维护状态,因此这些组件逐渐被一些新技术所替代项目替换前替换后服务注册中心EurekaZookeeper、Consul、Nacos(推荐)配置中心ConfigNacos服务总线BusNacos负载均衡RibbonLoadBalancer服务调用FeignOpenFeign、Dubbo服务网关Zuulgateway
2021-04-28 18:41:34 6662
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人