本文实现一个基于 Go + Gin 的 AI 会话后端服务,核心目标是把大模型调用能力接入到标准 Web API 中,并提供完整的用户鉴权、会话管理、流式响应、异步持久化、历史恢复能力。项目的设计重点不是单点功能,而是通过分层架构把协议处理、业务编排、模型调用、存储与消息系统明确拆分,形成可扩展、可维护、可演进的工程结构。
整体架构架构图如图所示:
架构分层职责
接入层:负责应用生命周期与全局装配,完成配置加载、数据库连接、消息队列初始化、路由注册、服务启动与优雅退出。
路由层:负责路由编排和访问控制边界,将公开接口与受保护接口分组,并统一挂载鉴权中间件。
控制器层:负责 HTTP 协...
为了实现进程高可用,我们可以对进程进行备份,而实现进程的主从备份主要有两种方法:
State Transfer(状态转移):主服务器将完整的状态内容都传输给备份服务器
Replicated State Machine(备份状态机):将需要备份的服务器视为一个确定性状态机 —— 主备以相同的状态启动,以相同顺序导入相同的输入,最后它们就会进入相同的状态、给出相同的输出
其中 Replicated State Machine 是较为常用的主从备份实现方式。常见的 Replicated State Machine 架构如下:
客户端向服务发起请求,执行指定操作
共识模块将该操作以日志的...
Kafka是一个分布式的,支持多分区、多副本,基于Zookeeper的分布式消息流平台,同时也是一款开源的基于发布订阅模式的消息引擎系统
基本术语消息:kafka中是数据单元被称为消息,也被称为记录,可以把它看做数据库表中某一行记录
批次:为了提高效率,消息会分批次写入kafka,批次就代指一组消息
主题:消息的种类称为主题, 可以说一个主题代表了一类信息,相当于是对消息进行了分类,主题就像是数据库中的表
分区:主题可以被分为若干个分区(partition),同一个主题中的分区可以不在一个机器上,有可能会部署在多个机器上,由此来实现 kafka 的伸缩性,单一主题中的分区有序,但是无法保...
为什么需要协程池超大规模并发的场景下。不加限制的大规模的goroutine可能造成内存暴涨,给及其带来极大的压力,要解决这个问题就是要限制运行的goroutine食量,合理复用,节省资源,具体就是goroutine池化
设计思路启动服务之时先初始化一个 Goroutine Pool 池,这个 Pool 维护了一个类似栈的 LIFO 队列 ,里面存放负责处理任务的 Worker,然后在 client 端提交 task 到 Pool 中之后,在 Pool 内部,接收 task 之后的核心操作是:
检查当前 Worker 队列中是否有可用的 Worker,如果有,取出执行当前的 task;...
RoseDB是一个基于bitcast存储模型的单机kv存储引擎,基于bitcast存储模型设计的kv存储引擎,所有的写操作都是先构建一个entry,经过编码后写到active logfile文件中,只有active logfile才能进行写操作,其他都为归档logfile日志文件,只能读,不能写。
WALWAL作为RoseDB的一个单独结构,实现了预写日志功能,一个WAL文件包含多个SEG段文件。
12345678910111213type WAL struct { activeSegment *segment olderSegme...
单线程模型Redis 的 “单线程” 并非指服务器进程仅含一个线程,而是核心的命令执行逻辑由单个线程串行处理。多线程模型虽然在某些方面表现优异,但是它却引入了程序执行顺序的不确定性,带来了并发读写的一系列问题,增加了系统复杂度、同时可能存在线程切换、甚至加锁解锁、死锁造成的性能损耗。
Redis 服务器进程包含多个线程,核心逻辑与辅助操作完全分离:
核心线程(主线程):负责处理客户端命令请求(如get/set)、执行数据读写操作、解析命令语法 —— 这是 Redis “单线程模型”的核心载体,所有命令执行严格串行,不存在并发竞争。
辅助线程:负责耗时的非核心操作,不参与命令执...
体验地址:http://47.122.54.172/chat
NettyNetty 是一个 Java 开源框架。Netty 提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
Netty 是一个基于 NIO 的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty 相当简化和流线化了网络应用的编程开发过程。
实现思路通过Netty承载WebSocket长连接,用Spring管理业务Handler,用统一消息协议完成多类型消息路由,结合Redis+MySQL实现在...