自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Kiyra的博客

努力努力再努力!

  • 博客(25)
  • 收藏
  • 关注

原创 八股篇(1):LocalThread、CAS和AQS

变量内存地址,V表示旧的预期值,A表示准备设置的新值,B表示执行 CAS 操作的时候,只有当V=A时,才会去用B去更新V的值,否则不会执行更新操作。CAS 是一条 CPU 的原子指令(cmpxchg),不会造成数据不一致的问题。Java 的 Unsafe 提供的 CAS 操作()底层实现即为CPU指令cmpxchg。

2025-12-26 22:38:02 688

原创 ConcurrentHashMap 源码阅读

Java7 中使用的分段锁,也就是每一个Segment上同时只有一个线程可以操作,每一个Segment都是一个类似HashMap数组的结构,它可以扩容,它的冲突会转化为链表。但是Segment的个数一但初始化就不能改变。Java8 中的使用的锁加 CAS 的机制。结构也由 Java7 中的 Segment数组 +HashEntry数组 + 链表进化成了Node 数组 + 链表 / 红黑树,Node 是类似于一个 HashEntry 的结构。

2025-12-26 17:16:27 769

原创 HashMap 源码阅读

HashMap 主要用来存放键值对,它基于哈希表的 Map 接口实现,是常用的 Java 集合之一,是非线程安全的。HashMap可以存储 null 的 key 和 value,但 null 作为键只能有一个,null 作为值可以有多个JDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)。JDK1.8 以后的HashMap。

2025-12-25 23:40:15 788

原创 ArrayList 源码阅读

ArrayList的底层是数组队列,相当于一个动态数组。与 Java 中的数组相比,它的容量能动态增粘,并且支持随即插入。在添加大量元素前,可以使用操作来增加ArrayList实例的容量。这样可以减少递增式再分配的次数。ArrayList继承于,实现了ListCloneable这些接口。

2025-12-25 17:36:33 744

原创 线程池在 IM 系统中的应用:从 RocketMQ 到 AI 处理

高性能:RocketMQ 异步发送,响应时间从 50ms 降到 < 10ms高可用:AI 处理独立线程池,不阻塞其他消息资源控制:通过参数调优,合理利用系统资源优雅关闭:应用关闭时正确清理资源关键要点选择合适的线程池参数:根据实际场景计算和调优资源隔离:不同业务使用不同的线程池监控和调优:持续监控线程池状态,及时调整参数优雅关闭:确保应用关闭时资源正确释放适用场景高并发系统异步处理场景耗时操作(AI、IO 等)需要资源控制的场景。

2025-12-24 23:24:41 620

原创 Spring Boot Starter 自定义开发:封装中间件配置

配置统一管理:所有中间件配置集中在 framework 模块开箱即用:引入依赖即可使用,无需手动配置代码复用:多个项目共享同一套配置和工具类易于维护:配置变更只需修改 Starter,所有项目自动生效关键要点Spring Boot 3.x 使用替代使用进行配置绑定和验证合理使用条件装配注解,提高灵活性封装工具类,简化使用方式统一异常处理和日志输出适用场景多项目共享的中间件配置需要统一封装的工具类复杂的第三方服务集成需要条件装配的功能模块。

2025-12-24 13:21:08 629

原创 反射机制在 IM 系统中的应用:从消息识别到 Handler 自动注册

只在初始化时使用反射@Overrideinit();// 只在初始化时执行缓存反射结果异常处理try {// 反射操作LOGGER.error("反射操作失败: {}", ex.getMessage(), ex);// 不要忽略异常,记录日志便于排查性能监控init();LOGGER.info("初始化耗时: {}ms", endTime - startTime);反射机制在 IM 系统中发挥了重要作用:✅ 自动发现:无需手动配置,自动建立映射关系。

2025-12-23 22:33:01 749

原创 WebSocket vs HTTP:为什么 IM 系统选择长连接?

✅适合场景* 实时通讯(IM、游戏、协作工具)* 实时数据推送(股票、监控)* 双向通信频繁* 低延迟要求❌不适合场景* 简单的 CRUD 操作* 静态资源服务* 偶尔的查询请求核心优势✅ 实时性:消息延迟 < 10ms✅ 双向通信:服务端可以主动推送✅ 资源高效:连接复用,开销小✅ 用户体验好:即时响应,流畅交互关键要点WebSocket 适合实时通信场景心跳机制是长连接的必需品合理设计心跳间隔和超时时间混合使用 WebSocket 和 HTTP。

2025-12-23 14:33:47 882 1

原创 阿里云 OSS + STS:安全的文件上传方案

安全性✅ 临时凭证,自动过期✅ 权限最小化,精确控制✅ 主账号密钥不暴露性能✅ 客户端直传,不经过服务端✅ 凭证缓存,减少 API 调用✅ 响应速度快,用户体验好可维护性✅ 路径组织清晰,便于管理✅ 日志完整,便于审计✅ 配置灵活,易于扩展关键要点使用 STS 而非永久密钥:保证安全性实现凭证缓存:提升性能和降低成本合理组织文件路径:便于管理和权限控制遵循安全最佳实践:多层防护,降低风险希望本文能帮助大家更好地理解和实现安全的文件上传方案。

2025-12-22 19:30:00 768

原创 从零到一:如何设计一个 IM 系统的消息协议?

简洁性(Simplicity)协议结构简单明了,易于理解和实现避免过度设计,只包含必要的字段命名规范统一,语义清晰可扩展性(Extensibility)支持新增消息类型,不影响现有功能支持字段扩展,向后兼容预留扩展空间,避免频繁重构性能优先(Performance)选择高效的序列化格式(如 Protobuf)减少消息体积,降低网络传输成本支持批量操作,提高吞吐量类型安全(Type Safety)使用强类型定义,避免运行时错误编译时检查,提前发现问题明确的字段类型和约束。

2025-12-22 12:31:19 618

原创 消息去重机制设计:如何保证幂等性?

先检查后处理:在处理消息前先检查是否已存在原子操作:使用 Redis 原子操作保证并发安全多层防护:Redis 去重 + 数据库唯一约束降级方案:Redis 故障时的降级处理定期清理:避免 Set 无限增长消息去重机制是保证 IM 系统幂等性的关键设计。通过使用 Redis Set 和SISMEMBER命令,我们可以以 O(1) 的时间复杂度高效地实现消息去重。同时,需要考虑并发场景、故障降级、数据清理等边界情况,才能构建一个健壮的去重系统。

2025-12-21 15:37:12 669

原创 IM 系统开发中的 5 个常见问题及解决方案

问题解决方案关键技术消息重复处理Redis 去重机制死连接内存泄漏心跳检测 + 连接清理消息丢失RocketMQ 持久化 + 重试消息持久化 + 自动重试高并发性能异步处理 + Redis 缓存AI 响应阻塞独立线程池幂等性设计:消息去重保证幂等性资源管理:及时清理无效连接,避免内存泄漏可靠性保障:多重保障机制,确保消息不丢失性能优化:异步处理 + 缓存,提升系统性能错误隔离:独立线程池,避免相互影响。

2025-12-21 12:32:44 556

原创 责任链模式实战:多 AI 助手的消息路由

使多个对象都有机会处理请求,从而避免请求的发送者与接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有对象处理它为止。责任链模式:每个 Handler 独立判断,不匹配则传递零配置扩展:新增 Handler 只需添加@Component注解统一接口:所有 Handler 实现方法支持复杂判断:每个 Handler 可以有独立的判断逻辑责任链模式适合:多个处理器、不同判断逻辑、需要灵活扩展的场景零配置扩展:利用 Spring 的自动发现机制,无需手动注册。

2025-12-20 16:44:31 634

原创 AI 流式响应实战:从同步等待到实时推送

关键点流式响应:使用回调函数模式,实时推送每个数据块IAiservice统一不同 AI 平台的接口WebSocket 推送:通过实时推送异步处理:使用 RocketMQ + 独立线程池,不阻塞主流程优化效果指标同步流式响应提升首字延迟10秒1-2秒5-10倍用户体验差好显著提升资源占用高低降低经验总结流式响应能显著提升性能统一接口便于多平台集成异步处理避免阻塞回调函数模式适合流式场景。

2025-12-20 14:00:37 743

原创 Netty 连接管理优化:如何支持 10万+ 并发连接?

/ 1. 在Pipeline中添加IdleStateHandler// 参数说明:// - readerIdleTime: 读空闲时间(0表示不检测)// - writerIdleTime: 写空闲时间(0表示不检测)// - allIdleTime: 读写空闲时间(10分钟)@Component@Resource@Resource@Override// 10分钟无读写,触发超时if (userId!= null) {

2025-12-19 16:03:17 1010

原创 从 50ms 到 < 10ms:IM 系统性能优化实战

优化策略总结1.异步化耗时操作通过 RocketMQ 异步处理立即返回响应,提升用户体验2.缓存化热点数据存入 Redis减少数据库查询,降低延迟3.序列化优化使用 Protobuf 替代 JSON减少体积,提升速度4.数据结构优化Redis Hash 存储房间信息Redis Set 实现消息去重优化效果响应时间:从 50ms 降到 < 10ms(实际 < 5ms)吞吐量:提升 10 倍以上数据库压力:降低 80%CPU 使用率:降低 40%

2025-12-19 14:58:38 988

原创 设计模式在 IM 系统中的应用:工厂模式、策略模式、责任链模式

工厂模式:解决对象创建问题,实现命令处理器的自动注册策略模式:解决算法选择问题,不同命令使用不同处理策略责任链模式:解决请求传递问题,AI 消息按优先级依次处理实际使用建议1.工厂模式:适用于需要根据类型创建对象的情景2.策略模式:适用于有多种处理方式且需要动态选择的场景3.责任链模式:适用于需要按优先级一次处理请求的场景注意事项避免过度设计:简单场景不需要引入复杂模式性能考虑:反射和责任链遍历有开销,需权衡代码可读性:模式应提升可读性,而非增加复杂度。

2025-12-19 09:30:00 577

原创 IM 系统架构设计:从单机到分布式的演进思考

1.Channel 路由:通过 Redis 路由表 + MQ 转发实现跨机器消息推送2.状态共享:Redis 存储路由信息,所有服务器共享3.消息路由:RocketMQ Tag 路由,支持精确路由到目标服务器4.负载均衡:通过网关和负载均衡器分配用户到不同服务器5.状态同步:事件驱动 + 定期同步,保证最终一致性。

2025-12-18 09:30:00 709

原创 Protobuf vs JSON:为什么 IM 系统选择二进制协议?

Protobuf 相比 JSON 的优势:1.性能:体积小 30-50%,序列化速度快 3-5 倍2.类型安全:编译时检查,避免运行时错误3.向后兼容:支持字段扩展,不影响旧版本4.代码生成:自动生成代码,减少手写代码在 IM 系统这种高并发、低延迟的场景下,Protobuf 是更好的选择。虽然 JSON 更易读、更简单,但在性能要求高的场景下,Protobuf 的优势更明显。选择建议高并发、低延迟场景:选择 Protobuf简单场景、可读性要求高:选择 JSON。

2025-12-16 15:20:35 778

原创 Redis 在 IM 系统中的 5 种应用场景:从缓存到去重

Redis 在 IM 系统中的 5 种应用场景:1.用户信息缓存:String 结构,30 分钟过期,提升查询性能 20-30 倍2.房间信息存储:Hash 结构,减少 Key 数量,支持部分更新3.消息去重:List 结构(可优化为 Set),保证消息幂等性4.OSS 凭证缓存:String 结构,1 小时过期,减少 API 调用成本5.房间号映射:String 结构,永久存储,快速查询房间ID场景数据库查询Redis 查询性能提升用户信息20-30ms< 1ms。

2025-12-15 09:30:00 519

原创 RocketMQ 在即时通讯系统中的应用:异步解耦与性能优化

RocketMQ 在 IM 系统中的价值:1.性能优化:响应时间从 50-60ms 降到 < 10ms,性能提升 5-6 倍2.系统解耦:广播和持久化通过不同消费者处理,互不影响3.可靠性保障:消息持久化到 MQ,支持重试,保证不丢失4.灵活扩展:轻松增加新的消费者处理消息5.延迟消息:支持延迟消息,实现定时任务功能通过 RocketMQ 的异步处理,IM 系统在保证功能完整性的同时,大幅提升了性能和可扩展性。

2025-12-14 09:30:00 1626

原创 详解 TCP 中的粘包半包问题,以及在 netty 中的解决方案

每次发送数据前,将数据的长度也带上,但是存放数据长度的位置一定要定好,否则服务端无法识别哪个字节代表的是数据长度Server代码示例4 // initialBytesToStrip 跳过长度字段));// 发送时自动加上长度字段(客户端也要加)Client代码示例@Override// 自动加长度效果演示自定义协议服务器启动成功 8080... 使用 length(4字节) + body 结构【收到完整自定义协议消息】长度=19 内容: 床前明月光。

2025-12-13 09:30:00 294 1

原创 Netty 自定义编码器实战:从粘包半包到 Protubuf 消息识别

在.proto文件中定义消息类型和指令// 消息指令枚举// 用户登录请求// 用户登录响应// 发送消息请求// 发送消息响应// 消息广播// ... 更多指令// 用户登录请求消息// 用户登录响应消息请求消息:XxxCmd(如响应消息:XxxAck(如通知消息:XxxNotify(如固定头部:长度 + 指令,用于识别消息边界和类型可变体:Protobuf 消息体,灵活扩展半包处理:通过实现自动识别:通过反射自动建立消息类型与指令的映射。

2025-12-12 09:30:00 312

原创 AQChat 即时通讯系统 - 技术深度分析文档

AQChat是一个基于 Netty 的高性能即时通讯系统,支持文本、图片、文件、音频、视频等多种消息类型,并集成了 AI 大模型能力(支持多轮对话、文本转语音、文本转图片等功能)。

2025-12-11 09:30:00 1611

原创 AQChat:从服务启动到消息处理全流程

AQChat 是一个基于 Netty + WebSocket 的高性能即时通讯系统,采用 Protobuf 二进制协议实现消息编解码,支持文本、图片、文件、音频、视频等多种消息类型,具备消息提醒、消息撤回重新编辑、艾特成员/AI助手等功能。集成阿里百炼、Gitee AI 等多个 AI平台,支持多轮对话、文本转语音、文本转图片等功能。

2025-12-10 18:24:28 247 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除