配置中心的长轮询 配置中心的长轮询配置中心是为了解决传统静态配置修改重启应用的问题,Nacos 和 Apollo 都是通过长轮询来实现动态推送的,而不是长连接 推拉模式数据交互有两种模式:【推模式 push】和【拉模式 pull】 推模式是客户端和服务器建立好长链接,服务器的数据推送到客户端 优点,及时,一旦有数据变更,客户端立马能感知到 缺点,不知道客户端消费能力,可能导致数据堆积 拉模式是客户端主动向服务 2024-07-23 #配置中心
MyBatis-step02 这是一个流程, 通过 SqlSessionFactory 开启一个 SqlSession SqlSession 里有成员变量 MapperRegistry MapperRegistry 里面通过包路径扫描,得到了一个 map 这个 map 封装了接口,跟它的代理类工厂 可以通过 get 的方式获得代理类工厂,用工厂的静态方法 new 出来一个代理对象 使用工厂模式可以屏蔽创建细节,延迟创建过 2024-07-22 #MyBatis
MyBatis-step01 InvocationHandlerInvocationHandler 接口是 Java 动态代理的核心部分,它里面有一个方法 invoke 当使用动态代理创建一个代理对象时,所有对代理对象的方法调用都会被路由到实现了 InvocationHandler 接口的 invoke 方法 1234567891011121314public class MapperProxy<T> imple 2024-07-21 #MyBatis
安全点 SafePoint 安全点HotSpot 虚拟机并非在代码指令流的任意位置都能停下来开始垃圾回收的,而是强制要求必须执行到安全点后才能够暂停 安全点的选定基本上是以“是否具有让程序长时间执行的特征” 为标准进行选定的,最明显的特征是指令系列的复用,所以只有具有这些功能的指令才会产生安全点 方法调用 循环跳转 异常跳转 循环HotSpot 虚拟机为了避免安全点过多带来过重的负担,对循环有一项优化措施,认为循环次数较 2024-07-17 #JVM
Redis 实现延迟队列 Redis 做延迟队列有两种方案: Redis 过期时间监听 Redisson 内置的延迟队列 Redis 过期事件监听实现延迟队列Redis 有发布订阅(pub/sub)功能,在 pub/sub,引入了 channel(频道),类似于消息队列的 topic (主题) pub/sub 涉及发布者publisher 和 订阅者 subscriber 两个角色 发布 2024-07-10 #Redis
Feed 流 —— Timeline Timeline本文介绍基于关注关系并按时间排列的 Feed 流 Feed 流有两种工作模式,推模式和拉模式 拉模式在用户查询时应该首先查询用户关注的所有博主的 uid 查询他们发布的作品,最后按照发布时间降序排列 拉模式用户每打开一次 “关注页” 系统就需要读取 N 个人的文章(N 为用户关注的博主数)所以拉模式又被称为读扩散 拉模式不需要额外存储数据 发布文章在 articles 表增加一条 2024-07-06 #系统设计
点赞业务设计 点赞内容点赞是一个非常高频的业务场景,功能本身复杂度不高,但是业务场景多,QPS 高,而且由于社区的用户体量,整体点赞的数据量非常大 点赞服务需要提供的接口有 对某个内容点赞(取消点赞)、点踩(取消点踩) 查询是否对 单个 或者 一批内容 点过赞(踩) - 即点赞状态查询 查询某个内容的点赞数 查询某个用户的点赞列表 查询某个内容的点赞人列表 查询用户收到的总点赞数 其中最核心的主要是 用户 2024-07-03 #系统设计
观察者模式 观察者模式是一种一对多的关系,当一个对象状态发生改变时,所有依赖于它的对象都得到通知并完成更新 被观察者(Observerable):目标对象,状态发生变化时,通知所有的观察者 观察者(Observer):接收被观察者状态变化通知 例如异步通知场景 定义被观察者 12345678910111213141516171819202122232425262728293031public clas 2024-06-29 #设计模式
枚举实现责任链 责任链允许请求沿着处理者链进行处理,类似于拦截器 责任链由三部分组成 抽象处理者(Handler):定义一个处理请求的抽象类,包含处理方法和一个 next 指针 具体处理者:实现抽象处理者方法 客户端 抽象处理者 123456789public abstract class GatewayHandler { protected GatewayHandler next; p 2024-06-26 #设计模式
模版方法模式 定义操作中的骨架流程,将一些步骤延迟加载到子类中,使子类可以不改变结构即可重新定义该流程的特定步骤 一个抽象类,定义骨架流程 例如一个请求经过流程分为如下步骤 解析请求头 封装数据 返回请求体 1234567891011121314public abstract class AbstractRequestService { abstract void resolveHead 2024-06-25 #设计模式