2024.12 期
2024.12 期
- 数仓建设保姆级5W字教程,离线实时一网打尽(理论+实战):dbaplus 园陌的 5 万字数仓建设大全——基本概念(面向主题 / 集成 / 非易失 / 时变)、四种主流数仓架构(数据集市 / Inmon 企业信息工厂 / Kimball 维度建模 / 混合型)、ODS / DWD / DWS / ADS 分层模型、维度建模与一致性维度、Lambda vs Kappa vs 流批一体,一篇覆盖离线 + 实时数仓建设理论与实战。
12.31
- 如何用 Redis 构建一个简单的聊天应用?:用 Redis 撑起聊天 App 全部状态——第 1 阶段连接初始化(用户在线 hash + 心跳过期);第 2 阶段消息处理用 Pub/Sub 做实时推送 + List 做历史消息 + Sorted Set 做消息已读位置,证明小聊天工具不用引入 IM 中间件也能跑得起来。
12.30
Redis Sets 使用场景有哪些?如何实现共同好友?:码哥版 Redis Set 用法盘点——元素全为 64 位整数且数量 ≤512 时底层用 intset 省内存,否则散列表 O(1) 操作;典型场景:共同关注(SINTERSTORE 求交集)、每日新增关注(SDIFFSTORE 求差集)、文章打标签(SADD + SMEMBERS);附三国题材的「刘备 ∩ 曹操 = 貂蝉」共同好友实现 demo。
四年匠心磨砺,快手系统软件技术创新与领域演进之路:快手系统软件团队四年技术演进总览——从内核优化、容器调度、存储引擎到稳定性建设的全栈系统软件创新路径,回顾踩过的坑与沉淀的能力。
12.29
- “四两拨千斤” —— 1.2MB 数据如何吃掉 10GB 内存:1.2 MB 输入吃掉 10 GB 内存的离奇 OOM 排查复盘——表面是数据量小但 JVM 堆爆,根因是 protobuf 嵌套字段被反序列化时触发深度展开导致对象数量级膨胀;通过堆 dump + MAT 定位到具体字段,最终改用懒解析或裁剪字段。
12.27
关于「日志采样」的一些思考及实践:京东零售的请求级日志采样实践——核心难点是「采样标识」如何跨主线程 / 子线程 / 线程池 / 嵌套线程池透传;对比三种方案(包装线程池 / 业务代码显式透传 / 抽象组件 + 扩展 API),选第三种把控制逻辑收敛成组件 +
XxxUtils.wrap(Runnable)的最小侵入改造;落地时还需考虑采样算法(随机 vs traceId 取模)、最小粒度、info / error 联动策略、磁盘 IO 与日志速率联动等细节。B站推荐模型数据流的一致性架构:B 站推荐模型在线 / 离线特征一致性架构——靠「特征快照 + 统一特征服务」让训练样本与在线打分使用同一份特征值,规避线上线下分布偏移导致模型效果衰减。
12.26
SQL 语句是怎么执行的?:MySQL SQL 执行链路图解——客户端 → 连接器 → 查询缓存 → 解析器 → 优化器 → 执行器 → 存储引擎,配合 Server 层与 InnoDB 引擎层的角色划分,把每条 SELECT / UPDATE 在 MySQL 内部走过的关卡讲透。
深入剖析SQL死锁 - 两条SQL之间的死锁原因:转转两条
INSERT ... ON DUPLICATE KEY UPDATE互锁的死锁深挖——通过SHOW ENGINE INNODB STATUS和performance_schema.data_locks拿到锁信息后,下载 MySQL 8.0 源码 Debug 出加锁链路row_ins_clust_index_entry → row_ins_sec_index_entry → row_mysql_handle_errors;结论:ON DUPLICATE KEY UPDATE在 MySQL 内是逐 value 加锁、且处理重复 key 时会加间隙锁,并发两个事务同时加间隙锁就会互相阻塞产生死锁。
12.24
干掉复杂的工具类,Hutool 工具库确实香!:Hutool 工具库实战——日期 / 字符串 / 集合 / 反射 / IO / 加密 / HTTP 等常用工具类的落地用法对比,替代项目里大量自造轮子(DateUtils / StringUtil / FileUtil 等),减少重复代码与潜在 bug。
大文件上传原理及实现方案:大文件上传方案——什么是大文件、跟普通上传的区别、原理与思路、具体实现方案;前端切片 + 并发上传 + 秒传(预先 hash 比对) + 断点续传(已上传分片记录) + 服务端合并校验。
SpringBoot 实现 License 认证(只校验有效期):SpringBoot 简易 License 认证——授权方生成 RSA 密钥对、用私钥对「主体 + 有效期」签名生成
license.lic;使用方启动时用公钥验签 + 校验过期时间,应付私有化部署场景的最小授权管控。
12.22
Java CompletableFuture 异步超时实现探索:CompletableFuture 异步超时控制深挖——
get(timeout, unit)是阻塞超时,orTimeout / completeOnTimeout(Java 9+)是非阻塞超时;自定义版用ScheduledExecutor在 N 秒后调用completeExceptionally,注意调度线程池要用 daemon 否则会阻塞 JVM 退出。详解MySQL字符集和Collation:MySQL 字符集 + Collation 全景——连接 / Server / 库 / 表 / 列 / 字面量六层精细化配置;字符集转换发生时机、不同 Collation 下字符串比较与排序规则;以 8.0.34 默认的 utf8mb4 + utf8mb4_0900_ai_ci 为例,演示「设错 set names 导致写入乱码」「ß = ss 命中两条数据」「同 ai_ci vs as_cs 排序大小写顺序不同」三类常见坑。
Java程序中的潜在危机: 深入探讨NullPointerException|得物技术:得物对 Java NPE 的系统化治理——常见 NPE 触发场景(自动拆箱 / 集合 stream / 多级链式调用 / Map.get),可选方案对比
Optionalvs 显式判空 vsObjects.requireNonNullvs IDEA@Nullable / @NotNull注解,落到团队级 NPE 排查与预防 SOP。
12.21
B站装机系统实践:从初创到规模化的演进:B 站机房装机系统从初创到规模化——PXE 网络引导 + Kickstart 自动化安装 + 配置管理工具一体化,把单机手动装系统升级为规模化批量装机,配合资产盘点与上架自动化对齐 IDC 运维。
什么?CPU消耗要压降80% ——《事件序列化CPU开销压降》揭榜:事件序列化 CPU 开销压降 80% 的实战——定位热点是反复反射 + JSON 字符串拼接;改为 byte buffer 零拷贝 + 字段元信息预编译,去掉运行时反射;配合对象池减少 GC,最终单条事件序列化 CPU 从毫秒级降到微秒级。
12.20
- 【述职黑话】ToB复杂业务状态的可复用的解决方案:ToB 业务复杂状态机的可复用方案——问题背景是状态分支爆炸 + 散落各业务方法;解法分两步:先解耦重构提取状态机模型 + 用设计模式(状态模式 / 策略模式 / 责任链)重构状态变迁,把「if/else 大杂烩」收敛成可声明、可复用的状态流转配置。
12.19
小红书MySQL数据一致性校验能力探索与实践:小红书 MySQL 主从 / 跨集群一致性校验体系——基于 binlog 增量对账 + 周期全量对账双轨;增量靠订阅 binlog 在下游异构存储(ES / TiDB / Redis)做实时比对;全量靠分片扫描 + 一致性快照避免长时间锁表,发现差异通知到告警平台。
Flink 2.0 存算分离状态存储 — ForSt DB:Flink 2.0 状态存储 ForSt DB——把传统 RocksDB 本地状态升级为存算分离架构(计算节点保留热数据,冷状态存到对象存储),让 Flink 作业无状态化、可秒级扩缩容,同时减小 checkpoint 压力。
12.18
- 小白也能看得懂!日志审计插件从入门到实战:日志审计插件入门到实战——背景与概览,核心模块设计与实现细节,从拦截切面(AOP / Filter / Interceptor)到敏感字段脱敏、用户操作上下文采集、审计日志落库,再到查询与导出。
12.17
线程池中线程异常后:销毁还是复用?:线程池中 Worker 抛异常后的真实行为——
execute提交时未捕获异常会让 Worker 退出(线程池补建一个新 Worker),而submit提交时异常被 FutureTask 吞掉只能在Future.get()才看见;结论:要么自己 try / catch、要么用Thread.UncaughtExceptionHandler、要么覆写afterExecute主动捕获,否则线上排查会很痛。系统监控数据该用推还是拉?:监控数据采集 push vs pull 取舍——拉模型(Prometheus)服务发现简单、可观测性好、对客户端零侵入,但短任务和无 IP 实例不友好;推模型(StatsD / OpenTelemetry Collector)适合短任务和高基数 metric,但需要服务端聚合 + 反压机制;给出按任务生命周期与基数选择的判定表。
12.13
MySQL核心揭秘:从查询到修改,彻底理解 Undo Log、Redo Log、Binlog 与 ACID 的关系:MySQL 三大 Log 与 ACID 的对应——Undo Log 实现原子性 + 一致性(事务回滚 + MVCC 快照读),Redo Log 实现持久性(WAL 先写日志再刷盘 + crash recovery),Binlog 实现主从复制(不是为了崩溃恢复);从 Server 架构 → SQL 执行流程 → 三 Log 协作的二阶段提交,串联 ACID 全貌。
从MySQL JOIN 算法角度看如何优化SQL:从 JOIN 算法角度看 SQL 优化——四种算法演进:Simple Nested-Loop(笛卡尔积式扫描,几乎不再使用)→ Block Nested-Loop(驱动表结果集进 Join Buffer 减少被驱动表扫描)→ Hash Join(MySQL 8.0 替换 BNL,关联列建哈希表降低比对次数)→ Index Nested-Loop(被驱动表关联列有索引,O(log n) 查找解决大表问题);优化思路:让驱动表小、给关联列加索引、必要时减少返回字段让 8.0 用 Hash Join。
MyBatis布尔字段映射陷阱全过程解析:MyBatis 布尔字段映射陷阱实录——「is_has_messages」字段在 POJO 用
boolean类型时一切正常,改成Boolean包装类后插入数据始终为 0;通过自定义拦截器打印实际 SQL 定位到 MyBatis 默认 TypeHandler 把 Boolean 转 0/1 时存在歧义,最终结论是「字段命名规范要远离 is_ 前缀」+「布尔字段统一用tinyint(1)+ 明确 TypeHandler」。Redis是如何建立连接和处理命令的:Redis 客户端到服务端的连接与命令处理链路——TCP 三次握手 → ae 事件循环 epoll_wait 接受新连接 → 创建 client 对象注册读事件 → 命令缓冲 + 解析 → 命令分发到 commandTable 对应处理器 → 写回客户端 buffer → beforesleep 真正发送,把 Redis 单线程网络模型完整跑通。
聚焦沟通:货拉拉自研客服IM系统:货拉拉自研客服 IM——围绕司机 / 货主 / 客服三方场景,自研 IM 解决长连接稳定性、消息保序、坐席分配、会话流转、智能机器人接入等定制需求,比直接用三方 IM 套件更贴合客服业务。
B站评论系统的多级存储架构:B 站评论系统从 TiDB 单点演进到多级存储——背景是 Redis 缓存 miss 时回源 TiDB 慢查询打爆数据库;引入自研 Taishan KV 存储承载排序索引,把「结构化 SQL」转「非结构化 NoSQL」,写场景换读场景性能;通过版本号 + 重试队列 + CAS 解决并发乱序与回退,配实时 / 离线对账兜底;降级走 Hedging 对冲策略(主存储超时后延迟 x ms 启动备份请求),TiKV 故障当夜评论服务无感切换到 Taishan。
12.11
火山引擎 ByteHouse:湖仓一体架构的创新与实践:ByteHouse 湖仓一体核心能力「快、通、全」——基于 ClickHouse 演进、自研优化器补齐复杂数据模型支持;自研 Native Reader 直读 Parquet / ORC 到 ByteHouse 内存格式避免 Arrow Table 中转;Multi Catalog 多元数据管理实现「仓 / 湖 / 数据集市」一图览全域;并提出 TP-AP 一体、湖仓一体、AP-AI 一体、数仓 - 数据集市一体四个一体化方向,把 ZeroETL 从理念推到现实。
转转数仓评估体系实践:转转数仓评估体系——评估稳定性 / 完备性 / 易用性 / 性能 / 成本五个维度,通过自动化指标采集 + 评估打分让数仓建设质量「可量化、可追踪、可复盘」。
MQ消息乱序问题解析与实战解决方案:MQ 消息乱序的两类场景与解法——同 topic 内乱序(多分区并行消费)靠 hash 分区让同业务实体的消息进同一分区 + 单线程消费;跨 topic 乱序(订单 / 支付 / 物流不同 topic)靠业务侧维护状态机 + 入库前校验前驱状态;附 Kafka / RocketMQ 顺序消息保障实践。
别再自己瞎写工具类了,Spring Boot 内置工具类应有尽有:Spring Boot 内置工具类速查——Assert(参数校验)、ObjectUtils / StringUtils / CollectionUtils(对象 / 字符串 / 集合判空与处理)、FileCopyUtils / ResourceUtils / StreamUtils(文件 / 资源 / IO 流)、ReflectionUtils / AopUtils / AopContext(反射与代理判断),告别项目里自造轮子的 MyStringUtil。
优雅掌握 SpringBoot 多租户架构,轻松驾驭复杂业务场景:SpringBoot 多租户架构落地——三种隔离方案对比:Database per Tenant(强隔离 / 高成本)、Schema per Tenant(中等)、Shared Schema with Tenant ID(弱隔离 / 低成本);技术实现走 ThreadLocal 维护租户上下文 + MyBatis Plus 拦截器自动注入 tenant_id + 数据源动态路由 AbstractRoutingDataSource。
12.10
- 【Calcite】Apache Calcite 框架初探及概念详解:Apache Calcite 概念详解——核心架构四阶段:SQL Parser(JavaCC 生成 AST)→ Validator(绑定元数据校验)→ Optimizer(基于 Volcano / Cascades 的 RBO + CBO 优化)→ Executor(物化执行计划);适配器机制让一套 SQL 引擎跑在 MySQL / Cassandra / ES / Druid 等异构数据源上,是 Flink / Hive / Drill / Beam 的 SQL 层底座。
12.9
- Presto简介、部署、原理和使用介绍:Presto 即席查询引擎全景——Facebook 2012 年开源(现 PrestoSQL / Trino),定位是「秒级响应的分布式 SQL 查询引擎」;典型用法:数据探索 / 实时仪表盘 / 数据湖查询 / ETL / 流式分析 / 多租户查询服务;可对接 Hive / MySQL / Oracle / Kafka 等,跨库 JOIN 一次完成。文章覆盖部署架构(Coordinator + Worker)、原理(Stage / Task / Split / Pipeline)和使用方法。
12.8
- 数据仓库之MPP架构&分布式架构:MPP vs 分布式架构选型——MPP(Massively Parallel Processing)走 Share Nothing,每节点独立磁盘内存通过专网协同,优先 Consistency,优点高性能 / 横向扩展,缺点存储不透明 / 单节点瓶颈 / 分布式事务难;分布式架构(Hadoop / Spark)走公共存储 + 计算下推,优先 Partition Tolerance,吞吐高但运算需减少数据移动;实际可组合用——HDFS 当公共存储,上层叠 MPP 的并行计算能力。
12.7
奇淫巧技,CompletableFuture 异步多线程是真的优雅:CompletableFuture 串接多线程任务——四种创建方式(runAsync / supplyAsync / 已有结果 completedFuture / 自定义 Executor)、链式 thenApply / thenCompose / thenAccept、组合 thenCombine / allOf / anyOf,让原本 Future + ExecutorService 的繁琐代码变成 fluent 风格。
深入 ReentrantLock 内部:公平锁与非公平锁之奥秘:ReentrantLock 公平 vs 非公平锁源码级对比——非公平锁
lock()直接 CAS state 0→1 抢锁,失败再走 AQS 队列,吞吐高但可能饥饿;公平锁lock()多一道hasQueuedPredecessors()检查,无前驱才尝试 CAS,保证 FIFO 但吞吐低;从tryAcquire实现细节展示「为什么默认是非公平」的工程权衡。
12.6
- 漫谈数仓『OLAP』:OLAP 漫谈——1993 年 Edgar F. Codd 提出 OLAP 12 条评估规则,从 1975 年 Express 到 1985 Excel 数据透视表再到 1992 Essbase / 1999 Microsoft OLAP;核心概念维度 / 层次 / 成员 / 度量;五种基本操作钻取 / 上卷 / 切片 / 切块 / 旋转;MOLAP / ROLAP / HOLAP 三类实现差异;开源组件 Apache Kylin / Druid / Presto 性能比较。
12.5
10分钟入门Flink -- 了解Flink:程序员烟斗的 Flink 入门篇——直接 idea 写 main 跑批 + 流的 WordCount 两段示例对比,证明 Flink 已实现「批流统一」同 API 同算子;Flink 五大特性:有状态计算、事件时间(Event Time + Watermark 处理乱序)、高可用(CheckPoint + 状态恢复)、高吞吐、不同层级 API;应用场景:事件驱动(反欺诈 / 异常检测)、数据分析、数据管道(持续 ETL)。
干货|在抖音集团,存储实时数仓这样建:抖音集团存储侧的实时数仓建设——实时数据数仓链路、Flink 数仓的问题与挑战(状态规模 / Exactly-Once / 维表 Join 性能)、目标与愿景,把存储类业务的实时数仓从 0 到 1 搭建起来。
货拉拉大数据元数据管理体系演进和实践:货拉拉大数据元数据管理体系演进——从最初分散在 Hive Metastore + Atlas + 自研脚本的多套体系,统一到一个跨引擎的元数据中心,把字段血缘、表血缘、口径治理、影响面分析做到一处可用。
12.4
OAuth 2.0 的一个简单解释:阮一峰对 OAuth 2.0 的极简解释——核心问题就是「快递员问题」:业主不想把门钥匙给快递员,但又要让快递员进门送货;OAuth 的解法是发一把临时、受限、可撤销的 token,授权机制最终变成「资源拥有者向资源服务器要 token,把 token 给第三方应用」三方协议。
OAuth 2.0 的四种方式:阮一峰续篇——RFC 6749 四种授权方式:授权码(最完整,适合 Web 应用,前端拿 code 后端换 token)、隐藏式(前端 SPA,token 直接回到前端)、密码式(用户高度信任的应用,直接给账密)、凭证式(机器对机器,client_id + secret 直拿 token);每种附流程图与适用场景。
12.3
逻辑数据平台的 NoETL 之道(内含Q&A):Aloudata 余俊讲逻辑数据平台 NoETL 的价值——传统数据架构靠 ETL 把数据搬到数仓再做分析,逻辑化平台用元数据虚拟化让数仓「不实际搬数」,跨源查询 + 物化视图自动改写 + 缓存让查询性能可控;附企业落地案例与 Q&A 答疑。
一文详解物化视图改写:阿里云 OLAP 产品部云曦讲查询优化器视角的物化视图改写——物化视图是预计算的特殊表(视图的缓存),数据仓库要解决「选择 / 维护 / 运用」三件事;查询改写让物化视图像索引一样透明加速 SQL 不改业务代码,集成到优化器规则中借列消除 / 谓词下推 / 解关联子查询扩大命中范围;改写检查两步——先比 Join Graph 验证物化视图 Join 关系与查询一致(Inner Join 无向边、Outer Join 有向边),再做 Output 检查确认视图含足够数据,含 GroupBy / Aggregation 时再做一轮聚合;最终所有候选改写进 CBO 与原查询一起选最优计划。
12.2
- 实战:单点登录(SSO)如此简单:SSO 实战手把手——三类 SSO 方案对比(同域 Cookie 共享 / 跨域 CAS Server 中央认证 / OAuth 2.0 / SAML),重点讲 CAS 流程:用户访问 App A 未登录 → 跳到 SSO Server → 登录后下发 ST → A 拿 ST 找 SSO Server 验证 → 拿到用户信息后建立 A 的会话;附配置示例与插件效果演示。
12.1
【点个赞吧】 - B站千亿级点赞系统服务架构设计:B 站千亿级点赞系统架构——存储用 TiDB / TiKV 写入 + Redis 多级缓存读,靠点赞 / 取消点赞的幂等性设计 + 异步消息消费扣减计数器,再配合用户级 / 资源级双维度索引支撑「我点过的」「谁点过这条」两类查询。
微博架构组面试:类微博点赞系统设计:微博架构组面试真题级点赞系统——分两幕:Part 1 代码 Review 环节考察候选人读懂面试官给的代码并指出问题;Part 2 类微博点赞系统设计,从需求估算、数据模型、缓存方案、热点 Key 处理、计数一致性到读写比 100:1 下的扩展策略。
