- 博客(144)
- 收藏
- 关注
原创 Rasa学习笔记
flows:description:必填,描述流程为用户做了什么。编写清晰的描述很重要,因为对话理解组件使用它来决定何时开始此流程always_include_in_prompt:如果always_include_in_prompt字段设置为true,并且If字段中定义的流保护计算结果为true,则该流将始终包含在提示中nlu_trigger:可以启动该流的意图。persisted_slots:默认情况下,当流程结束时,在collect和set_slot步骤中设置的插槽将被重置。
2025-02-13 11:39:58
662
原创 分布式系统知识点总结
客户端发起请求时,如果使用的是四层协议(TCP/UDP),则LVS集群直接将流量转发给后端服务器,如果使用七层协议(HTTP/HTTPS),LVS会将服务请求转发给Tengine集群,Tengine集群再根据自身的调度算法选择相应的后端服务器建立连接。原理:初始由几个节点发起消息,这几个节点会将消息的更新内容告诉自己周围的节点,收到消息的节点再将这些信息告诉周围的节点。依照这种方式,获得消息的节点会越来越多,总体消息的传输规模会越来越大,消息的传播速度也越来越快。确保的是分布式集群的最终一致性。
2025-02-12 15:52:20
949
原创 Kafka知识点总结
pull(拉)模式:consumer采用从broker中主动拉取数据,不足之处是如果没有数据,消费者可能会陷入循环中,一直返回空数据。push(推)模式:由broker主动向消费者主动推送消息,缺点是由broker决定消息发送速率,很难适应所有消费者的消费速率Kafka采用 pull(拉)模式!控制消费速率:消费者可以根据自己的处理能力决定拉取数据的频率和数量,从而避免被过多的数据淹没。简化系统复杂性:推模式需要复杂的流量控制机制来防止生产者发送数据过快导致消费者无法处理。
2025-02-11 14:19:14
1109
原创 GMP原理
假定 G2 唤醒了 M2,M2 绑定了 P2,并运行 G0,但 P2 本地队列没有 G,M2 此时为自旋线程(没有 G 但为运行状态的线程,不断寻找 G)。至少从全局队列取 1 个 g,但每次不要从全局队列移动太多的 g 到 p 本地队列,给其他 p 留点。在 Go 中,线程是运行 goroutine 的实体,调度器的功能是把可运行的 goroutine 分配到工作线程上。全局 G 队列:在新的调度器中依然有全局 G 队列,但功能已经被弱化了,:避免频繁的创建、销毁线程,而是对线程的复用。
2025-02-06 16:27:17
748
原创 记一个Timestamp时区问题的坑
如果该Timestamp不是UTC时区的,Timestamp.toInstant().atZone(ZoneId.of(“UTC”))会把Timestamp转成UTC时区。resultSet.getTimestamp(“kpi_collect_time”)查出来的Timestamp居然是带时区的,使用Timestamp.toLocalDateTime()可以直接把时区信息抹除。
2025-01-22 18:54:36
101
原创 Go学习笔记
iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)。,特殊常量,可以认为是一个可以被编译器修改的常量。
2025-01-21 15:03:57
340
原创 leetcode刷题笔记
题目思路1.两数之和哈希表2.两数相加链表操作3. 无重复字符的最长子串滑动窗口,特别注意数组越界情况!4. 寻找两个正序数组的中位数5.最长回文子串从中间向两边扩展,注意整个字符串都是回文串的边界情况
2025-01-04 19:24:24
208
转载 RPC 的序列化方式
https://blog.youkuaiyun.com/qq_43103529/article/details/127607551
2024-12-26 16:33:27
37
原创 高可用系统设计
软件可用性是指软件系统在给定的时间间隔内处在可工作状态的时间比例。高可用(HA)用于描述软件系统的可用性程度,对于转账、支付等金融服务通常要求做到99.99%以上。
2024-08-17 16:56:07
422
原创 保证Kafka消息有序性
(3)既没有 partition 值又没有 key 值的情况下,第一次调用时随机生成一个整数(后面每次调用在这个整数上自增),将这个值与 topic 可用的 partition 总数取余得到 partition值,也就是常说的 round-robin 算法。,并且设置参数max.in.flight.requests.per.connection=1,也即同一个链接只能发送一条消息,如此便可严格保证Kafka消息的顺序。可以在消费者中,消息分发至不同的线程时,加一个队列,消费者去做hash分发,将。
2024-01-17 16:10:04
926
1
原创 分布式系统幂等解决方案
幂等操作的特点是任意多次执行所产生的影响与一次执行的影响相同。幂等函数是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数或方法不会影响系统状态,使用者无需担心重复执行会对系统造成改变避免非预期重复请求产生副作用,如重复扣款、重复退款支持服务调用方主动发起重复请求以获得确定性结果,如失败重试、超时重试。对于可重试失败,其结果具有不确定性,最终可能成功,也可能失败,因此对于可重复请求的响应可以不一致,但必须保证不产生副作用。
2023-09-26 16:02:48
326
原创 缓存和数据库数据一致性解决方案
读操作在写操作完成数据库更新前读取了旧数据,且在写操作删除缓存后更新了缓存,从而导致数据库中的为最新数据,而缓存中的仍为旧数据。在前文缓存更新中讲到,更新缓存较好的一种方式是使用 Cache Aside 模式,即先更新数据库,再失效缓存。使用缓存最主要的原因是追求数据访问速度,而如果要追求强一致性,按照目前的技术,必然会损失访问速度这一优势,因此在需要保证数据强一致性的场景下,根本不适合使用缓存。最终一致性强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一致的状态。
2023-09-25 16:09:47
544
原创 MySQL表结构设计规范
一、表设计1. 命名规范表名由小写英文字母和下划线组成表必须填写描述信息表名中的英文单词应该使用单数形式临时表以 tmp 为前缀,以日期为后缀备份表以 bak 为前缀,以日期为后缀使用hash、md5 进行散表,表名后缀使用16进制2. 设计规范必须定义主键,一般默认为id,整型自增主键不允许修改,一般采用业务无关字段表必须包含 gmt_create 和 gmt_modified 字段记录创建时间和修改时间禁止使用外键慎用触发器和存储过程。将业务逻辑放到应用层更合适单条记录
2023-09-08 16:40:14
446
原创 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
696
1
原创 PostgreSQL
表空间参数 tablespace_option :如果在比 I/O子系统更快或更慢的磁盘上存储表空间,则配置项会变得很有意义。在创建数据库、表时可以指定表空间,以便。TABLESPACE:表空间。ENCODING:编码。
2023-07-17 14:00:53
1053
原创 领域驱动设计:软件核心复杂性应对之道
很多应用程序最主要的复杂性并不在技术上,而是来自领域本身、用户的活动或业务。领域驱动设计是一种设计方法,试图解决软件难以理解、难以演化的问题。领域驱动设计试图用围绕业务概念来构建领域模型的方式来控制业务的复杂性。
2023-01-29 19:27:01
1942
原创 【Hadoop学习笔记】(四)——Flume
Flume是一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。
2022-10-27 17:24:18
876
原创 【Hadoop学习笔记】(三)——Sqoop
Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(例如 :MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。其原理和 Hive 类似,本质就是通过命令生成 MapReduce 任务,进而去执行数据迁移任务。
2022-10-27 15:35:23
1030
原创 【Hadoop学习笔记】(二)——Hive的原理及使用
Hive是一个在Hadoop中用来处理结构化数据的数据仓库基础工具。它架构在Hadoop之上,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。Hive数据仓库工具能为HDFS上的数据提供类似SQL的查询语言(HiveQL),并将SQL语句转变成MapReduce任务来执行。Hive 明显降低了 Hadoop 的使用门槛,任何熟悉 SQL 的用户都可以使用 Hive。Hive 经常用于业务和数据分析,并对存储在 HDFS 上的数据执行特殊查询。
2022-10-27 11:29:15
1116
原创 【Hadoop学习笔记】(一)——MapReduce的原理及使用
MapReduce是大数据离线计算的一种处理范式。它的基本概念就是“分而治之”:将单个问题分解成多个独立的子任务,再将子任务的结果汇聚成最终结果。在 MapReduce 中,它会先把样本分成一段段能够令单台计算机处理的规模,然后让多台计算机同时进行各段样本的整理和统计,每执行完一次统计就对映射统计结果进行规约处理,最终完成大规模的数据规约。MapReduce 的含义分为两步:Map 和 Reduce (映射和规约)。上述过程第一阶段的整理工作就是"映射",把数据进行分类和整理,
2022-10-25 11:40:51
1351
原创 Kafka过期时间TTL、延时队列、死信队列实现方案
这里提供一种实现方案:将消息的 TTL 的设定值以键值对的形式保存在消息的 header 字段中,在消费者端配置拦截器,消费者在消费消息时判断此条消息是否超时。解决方式,提前记录这一批消息的最大偏移量,或在过滤之后的消息集中的头部或尾部设置一个状态消息,专门用来存放这一批消息的最大偏移量。Kafka 和 RabbitMQ 不同,Kafka的消息并没有TTL这一概念,因此想要实现消息的过期功能,需要作额外的处理。需要注意 RecordHeader 的值是 byte[]类型,因此需要进行转换。
2022-10-18 10:14:19
2913
原创 Kafka高可用性原理
leader epoch 代表 leader 的纪元信息,初始值为0,每当 leader 变更一次, leader epoch 的值就会加1,相当于为 leader 增设了一个版本号。数据在主从复制的过程中难免会遇到某一节点宕机的情况,如何确保在类似特殊情况下依旧保持各副本数据的一致性,是分布式系统必须要解决的问题。前面提到了,Kafka采用了主写主读的方式,副本仅仅提供了数据容错功能,为什么 Kafka 不采用读写分离的方式呢。读写分离的主要作用是分摊负载,而 Kafka 本身就能很好的做到负载均衡,
2022-10-09 16:09:41
1510
原创 Kafka事务消息详解
如果消费者先处理消息后提交位移,那么如果在消息处理之后在位移提交之前消费者宕机了,那么重新上线后,会从上一次位移提交的位置拉取,这就导致了重复消息,对应 at least once。反过来,如果先提交位移后处理消息,就有可能会造成消息的丢失,对应 at most once。设置为 true即可(默认为false),开启后生产者就会幂等的发送消息。Kafka提供了幂等机制,只需显式地将生产者客户端参数。注意:序列号实现幂等只是针对每一对,即。Kafka消费者消息保障主要。
2022-10-08 11:39:48
4865
原创 时间轮算法
且通过 DelayQueue推进时间又显著减少了时间的“空推进”,减少无故空耗机器的性能资源,通过以少量空间换时间做到“时间轮按照上述的方式运转,但是可以看到该时间轮的时间范围(interval)是有限的(tickMs*wheelSize),如果任务的延时超过了该时间范围(interval),如此时要插入一个延时为350ms的任务,则涉及到了。,而每一层时间轮的 wheelSize 是固定的,都是20,因此第二层时间轮的时间跨度为 400ms,以此类推,第三层时间轮的时间跨度为8000ms。
2022-09-30 15:32:18
1597
原创 Kafka消费者的线程安全问题和多线程实现
那么就会有越来越多的消息得不到及时的消费造成延迟。因此,可以采用多线程的方式来提高消费者的整体消费能力。使用该方式实现,一般所有的消费线程都属于同一个消费者组,一个消费线程可以消费一个或多个分区中的消息,因此。KafkaConsumer 非线程安全不意味着在消费消息的时候只能以单线程的方式执行,如果。的方式来获取当前 KafkaConsumer 的使用权,如果获取不到则抛异常。此外,如果需要手动提交,该种方式的实现也更加困难,有可能会有数据丢失的风险。与线程安全的 KafkaProducer 不同,
2022-09-30 10:18:48
2739
1
原创 Zookeeper分布式锁源码分析
使用Zookeeper分布式锁时,一般会使用Curator中的实现。本文主要分析一下Curator中的可重入锁 InterProcessMutex 的源码实现。这么一来,锁的获取就可以一个一个传递下去,并且一次只唤醒一个,不会导致羊群效应。......
2022-08-31 16:02:51
435
原创 Curator使用手册
Curator是netflix公司开源的一套zookeeper客户端。与Zookeeper提供的原生客户端相比,Curator的抽象层次更高,简化了Zookeeper客户端的开发量。Curator,包括连接重连、反复注册wathcer和NodeExistsException 异常等。Curator由一系列的模块构成,对于一般开发者而言,常用的是和。curator-framework只是对zookeeper客户端做了简单的封装,提供基本的连接和重试功能。...
2022-08-31 14:35:32
1275
原创 线程池源码分析
线程池中有一个interruptIdleWorkers() ,该方法会中断线程池中的空闲线程(没有在执行任务而是阻塞在getTask方法中),可以看到该方法在中断线程前会先去尝试获取worker的lock,如果该worker正在执行任务那么就会被上锁,进而不会被该方法中断。可以看到进入回收方法后,加锁地在 workers(一个存放Workers的HashSet)中移除该Worker,从而完成线程的回收。上面启动了 Worker 内部的线程,线程启动后会去调用 Worker 的 run()方法。
2022-08-24 16:58:49
366
原创 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
2136
原创 【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
1019
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人