#

#后端

45篇文章

实时 OLAP:列存与预聚合的两条路线

系列目录 MySQL 索引与慢查询:B+ 树如何减少扫描 声明式事务之下:InnoDB 的 MVCC 与锁 接入层:Nginx 反向代理与 OpenResty 的边界 Web 容器与 Netty:线程模型之下的 IO 模型 Redis(上):缓存用法与单线程模型的限制 Redis…

链路追踪:Dapper 模型与埋点的取舍

系列目录 MySQL 索引与慢查询:B+ 树如何减少扫描 声明式事务之下:InnoDB 的 MVCC 与锁 接入层:Nginx 反向代理与 OpenResty 的边界 Web 容器与 Netty:线程模型之下的 IO 模型 Redis(上):缓存用法与单线程模型的限制 Redis…

Elasticsearch 的近实时模型与误用为数据库的后果

系列目录 MySQL 索引与慢查询:B+ 树如何减少扫描 声明式事务之下:InnoDB 的 MVCC 与锁 接入层:Nginx 反向代理与 OpenResty 的边界 Web 容器与 Netty:线程模型之下的 IO 模型 Redis(上):缓存用法与单线程模型的限制 Redis…

分布式事务:2PC 的代价与业务补偿模式

系列目录 MySQL 索引与慢查询:B+ 树如何减少扫描 声明式事务之下:InnoDB 的 MVCC 与锁 接入层:Nginx 反向代理与 OpenResty 的边界 Web 容器与 Netty:线程模型之下的 IO 模型 Redis(上):缓存用法与单线程模型的限制 Redis…

分库分表:用应用层复杂度换数据库容量

系列目录 MySQL 索引与慢查询:B+ 树如何减少扫描 声明式事务之下:InnoDB 的 MVCC 与锁 接入层:Nginx 反向代理与 OpenResty 的边界 Web 容器与 Netty:线程模型之下的 IO 模型 Redis(上):缓存用法与单线程模型的限制 Redis…

ZooKeeper/etcd:小数据强一致的协调服务

系列目录 MySQL 索引与慢查询:B+ 树如何减少扫描 声明式事务之下:InnoDB 的 MVCC 与锁 接入层:Nginx 反向代理与 OpenResty 的边界 Web 容器与 Netty:线程模型之下的 IO 模型 Redis(上):缓存用法与单线程模型的限制 Redis…

分布式任务调度:同一时刻只跑一份

系列目录 MySQL 索引与慢查询:B+ 树如何减少扫描 声明式事务之下:InnoDB 的 MVCC 与锁 接入层:Nginx 反向代理与 OpenResty 的边界 Web 容器与 Netty:线程模型之下的 IO 模型 Redis(上):缓存用法与单线程模型的限制 Redis…

RocketMQ 的事务消息与延迟消息

系列目录 MySQL 索引与慢查询:B+ 树如何减少扫描 声明式事务之下:InnoDB 的 MVCC 与锁 接入层:Nginx 反向代理与 OpenResty 的边界 Web 容器与 Netty:线程模型之下的 IO 模型 Redis(上):缓存用法与单线程模型的限制 Redis…

唯一 ID 中间件 Leaf:号段模式与雪花模式

系列目录 MySQL 索引与慢查询:B+ 树如何减少扫描 声明式事务之下:InnoDB 的 MVCC 与锁 接入层:Nginx 反向代理与 OpenResty 的边界 Web 容器与 Netty:线程模型之下的 IO 模型 Redis(上):缓存用法与单线程模型的限制 Redis…

小程序实时日志

背景 小程序开发中,真机调试时看不到日志。 如果只需要支持微信小程序,这个问题还能靠 vConsole 缓解——它会在页面上挂一个悬浮的调试面板,把 输出和网络请求都展示出来。同时支持美团小程序后,美团小程序的双线程架构带来了额外限制: 层(逻辑层)运行在独立的 JSCore 环境中,挂载在 WebView…

熔断与限流中间件:把失败当作正常状态管理

系列目录 MySQL 索引与慢查询:B+ 树如何减少扫描 声明式事务之下:InnoDB 的 MVCC 与锁 接入层:Nginx 反向代理与 OpenResty 的边界 Web 容器与 Netty:线程模型之下的 IO 模型 Redis(上):缓存用法与单线程模型的限制 Redis…

消息语义:按 at-least-once 设计业务代码

系列目录 MySQL 索引与慢查询:B+ 树如何减少扫描 声明式事务之下:InnoDB 的 MVCC 与锁 接入层:Nginx 反向代理与 OpenResty 的边界 Web 容器与 Netty:线程模型之下的 IO 模型 Redis(上):缓存用法与单线程模型的限制 Redis…

RPC 框架:像本地调用一样调远程的代价

系列目录 MySQL 索引与慢查询:B+ 树如何减少扫描 声明式事务之下:InnoDB 的 MVCC 与锁 接入层:Nginx 反向代理与 OpenResty 的边界 Web 容器与 Netty:线程模型之下的 IO 模型 Redis(上):缓存用法与单线程模型的限制 Redis…

Kafka(下):生产端、broker 与消费端的可靠性配置

系列目录 MySQL 索引与慢查询:B+ 树如何减少扫描 声明式事务之下:InnoDB 的 MVCC 与锁 接入层:Nginx 反向代理与 OpenResty 的边界 Web 容器与 Netty:线程模型之下的 IO 模型 Redis(上):缓存用法与单线程模型的限制 Redis…

DI&IOC基本概念

DI 和 IOC 的关系 DI(依赖注入)和 IOC(控制反转)相关,但含义不同。 控制反转(IOC)是一种设计原则:组件不在自身代码中解析和管理依赖,而由外部容器或框架负责这些工作。组件因此可以替换依赖实现、复用,并在测试中注入替代依赖。 依赖注入(DI)是实现 IOC…

Kafka(上):吞吐的来源是顺序 IO

系列目录 MySQL 索引与慢查询:B+ 树如何减少扫描 声明式事务之下:InnoDB 的 MVCC 与锁 接入层:Nginx 反向代理与 OpenResty 的边界 Web 容器与 Netty:线程模型之下的 IO 模型 Redis(上):缓存用法与单线程模型的限制 Redis…

数据库访问层:连接池与 MyBatis 的显式 SQL

系列目录 MySQL 索引与慢查询:B+ 树如何减少扫描 声明式事务之下:InnoDB 的 MVCC 与锁 接入层:Nginx 反向代理与 OpenResty 的边界 Web 容器与 Netty:线程模型之下的 IO 模型 Redis(上):缓存用法与单线程模型的限制 Redis…

Redis(上):缓存用法与单线程模型的限制

系列目录 MySQL 索引与慢查询:B+ 树如何减少扫描 声明式事务之下:InnoDB 的 MVCC 与锁 接入层:Nginx 反向代理与 OpenResty 的边界 Web 容器与 Netty:线程模型之下的 IO 模型 Redis(上):缓存用法与单线程模型的限制(本篇) 缓存整体变慢的那次排查 (Tair…

Web 容器与 Netty:线程模型之下的 IO 模型

系列目录 MySQL 索引与慢查询:B+ 树如何减少扫描 声明式事务之下:InnoDB 的 MVCC 与锁 接入层:Nginx 反向代理与 OpenResty 的边界 Web 容器与 Netty:线程模型之下的 IO 模型(本篇) 容器怎么处理连接 云盘服务端内嵌 Jetty 9 提供 HTTP…

接入层:Nginx 反向代理与 OpenResty 的边界

系列目录 MySQL 索引与慢查询:B+ 树如何减少扫描 声明式事务之下:InnoDB 的 MVCC 与锁 接入层:Nginx 反向代理与 OpenResty 的边界(本篇) 把文件传输从业务进程里挪出去 2016 年做 IM 文件转发时,Java 流对流方案被否决了。方案二的链路是 ,Java 服务从 MSS…

声明式事务之下:InnoDB 的 MVCC 与锁

系列目录 MySQL 索引与慢查询:B+ 树如何减少扫描 声明式事务之下:InnoDB 的 MVCC 与锁(本篇) 回滚后读到中间值的原因 2016 年写一个涉及状态流转的接口时,一个事务把某条记录的状态从 A 改成 B,随后因异常回滚。紧接着我用数据库客户端查询,看到状态还是 B…

高可用的四件兵器:超时、重试、限流与降级

系列目录 从单线程到线程池:云盘转 Java 后的第一堂并发课 线程池参数、队列与快慢接口隔离 数据库连接池与 Spring 声明式事务:把 Node.js 的坑填上 ConcurrentHashMap 与锁:文件元数据的并发读写 Future 与 CountDownLatch:一个接口聚合一堆下游 用 Kafka…

分布式锁与唯一 ID:多实例部署后的新问题

系列目录 从单线程到线程池:云盘转 Java 后的第一堂并发课 线程池不是 new 出来就完事:参数、队列与快慢接口隔离 数据库连接池与 Spring 声明式事务:把 Node.js 的坑填上 ConcurrentHashMap 与锁:文件元数据的并发读写 Future 与 CountDownLatch…

Tair 缓存的穿透、雪崩与可用性

系列目录 从单线程到线程池:云盘转 Java 后的第一堂并发课 线程池不是 new 出来就完事:参数、队列与快慢接口隔离 数据库连接池与 Spring 声明式事务:把 Node.js 的坑填上 ConcurrentHashMap 与锁:文件元数据的并发读写 Future 与 CountDownLatch…

压测与容量评估:IM 融合前的流量需求

系列目录 从单线程到线程池:云盘转 Java 后的第一堂并发课 线程池不是 new 出来就完事:参数、队列与快慢接口隔离 数据库连接池与 Spring 声明式事务:把 Node.js 的坑填上 ConcurrentHashMap 与锁:文件元数据的并发读写 Future 与 CountDownLatch…

流对流的失败率、NIO 与零拷贝

系列目录 从单线程到线程池:云盘转 Java 后的第一堂并发课 线程池不是 new 出来就完事:参数、队列与快慢接口隔离 数据库连接池与 Spring 声明式事务:把 Node.js 的坑填上 ConcurrentHashMap 与锁:文件元数据的并发读写 Future 与 CountDownLatch…

logback 日志规范与线上问题定位

系列目录 从单线程到线程池:云盘转 Java 后的第一堂并发课 线程池不是 new 出来就完事:参数、队列与快慢接口隔离 数据库连接池与 Spring 声明式事务:把 Node.js 的坑填上 ConcurrentHashMap 与锁:文件元数据的并发读写 Future 与 CountDownLatch…

JVM 内存与 GC:线上 Full GC 排查记录

系列目录 从单线程到线程池:云盘转 Java 后的第一堂并发课 线程池不是 new 出来就完事:参数、队列与快慢接口隔离 数据库连接池与 Spring 声明式事务:把 Node.js 的坑填上 ConcurrentHashMap 与锁:文件元数据的并发读写 Future 与 CountDownLatch…

IM 消息文件实现

背景 云盘业务需要与内部使用的大象 IM 融合,云盘负责大象 IM 的文件流转。大象原有协议中的文件消息包含静态链接,当时还没有鉴权。云盘设计为使用带鉴权信息和时效的动态链接。因此,需要设计一个同时包含鉴权信息并满足大象 IM 协议要求的 URL。 初始方案 方案一是让链接只包含必要的 IM ID 和 Cookie…

Kafka 异步化与削峰:热点上报和最终一致性

系列目录 从单线程到线程池:云盘转 Java 后的第一堂并发课 线程池不是 new 出来就完事:参数、队列与快慢接口隔离 数据库连接池与 Spring 声明式事务:把 Node.js 的坑填上 ConcurrentHashMap 与锁:文件元数据的并发读写 Future 与 CountDownLatch…

Future 与 CountDownLatch:一个接口聚合一堆下游

系列目录 从单线程到线程池:云盘转 Java 后的第一堂并发课 线程池不是 new 出来就完事:参数、队列与快慢接口隔离 数据库连接池与 Spring 声明式事务:把 Node.js 的坑填上 ConcurrentHashMap 与锁:文件元数据的并发读写 Future 与 CountDownLatch…

ConcurrentHashMap 与锁:文件元数据的并发读写

系列目录 从单线程到线程池:云盘转 Java 后的第一堂并发课 线程池不是 new 出来就完事:参数、队列与快慢接口隔离 数据库连接池与 Spring 声明式事务:把 Node.js 的坑填上 ConcurrentHashMap 与锁:文件元数据的并发读写(本篇) 项目开始前需要确认的并发边界 第…

数据库连接池与 Spring 声明式事务:把 Node.js 的坑填上

系列目录 从单线程到线程池:云盘转 Java 后的第一堂并发课 线程池不是 new 出来就完事:参数、队列与快慢接口隔离 数据库连接池与 Spring 声明式事务:把 Node.js 的坑填上(本篇) 从 Node.js 的事务写法开始准备 做 Java 版云盘前,我已有 Node.js、C# 等后端开发经验。Node…

nodejs addon 结合 libuv 使用经验

基于 electron 开发客户端时,需要通过 nodejs addon 扩展 electron 相关功能。本文记录 libuv 异步 addon 的线程与数据传递方式。 asynchronous addons C++ 中的耗时任务应使用异步 addon。同步调用会阻塞 JavaScript…

线程池参数、队列与快慢接口隔离

系列目录 从单线程到线程池:云盘转 Java 后的第一堂并发课 线程池参数、队列与快慢接口隔离(本篇) 数据库连接池与 Spring 声明式事务:把 Node.js 的坑填上 上一篇讨论了 Node.js 单事件循环与 Java 请求线程池的差异。此前写过 Node.js、C…

MySQL 索引与慢查询:B+ 树如何减少扫描

系列目录 MySQL 索引与慢查询:B+ 树如何减少扫描(本篇) 文件列表越来越慢 云盘 Java 版上线后,文件列表接口随单用户文件数增长越来越慢。页面打开要等好几秒,监控里这条接口的 RT 明显高于其他接口。慢查询日志定位到一条 SQL…

云盘服务端从nodejs 专项 java 相关复盘

说明 本文总结云盘服务端从 Node.js 转向 Java 的过程。我平时也使用 nodejs、go、python、C#、java 开发,本文只讨论当时的项目约束和工具链。 云盘 Web 前后端和服务端开发在 5 月由我接手。此前基础终端负责各端,云计算组负责服务化;云计算组已使用 Python Tornado…

spring aop 权限拦截

云盘服务端 Java 化后,权限校验通过 HTTP header 中的认证信息完成。请求 body 包含业务数据时,签名计算还需要读取 body。最初实现了一个 ,并在 中从 读取 body 后计算签名;但 Spring MVC 向 handler 参数注入 body 前,请求流已被读取,导致下列 function…

dozer使用

云盘项目中需要在领域模型、业务模型和 JSON 表示之间转换数据,因此有大量 Java Bean 到 Java Bean…

使用 V8 与 JavaScript 交互:Node.js 的基本原理

全栈开发需要掌握的深度取决于具体工作。使用 Node.js 时,为了理解其运行方式,我阅读了部分源码并尝试直接使用 V8 执行 JavaScript。 当时网上资料大多集中于开发 addons,而且 V8 经历过一次较大的 API 升级,部分旧资料已经不适用。本文记录基于当时 V8 API 的实验过程。 Node.js…