使用FastAPI微服务在AWS EKS上实现AI会话历史的管理
架构概述
本文介绍如何使用FastAPI构建微服务架构,在AWS EKS上部署两个微服务:
- 服务A:接收用户提示
- 服务B:处理对话逻辑,与Redis缓存和MongoDB数据库交互
该架构利用AWS ElastiCache(Redis)实现快速响应,并通过MongoDB RDS持久化存储会话数据。
该架构提供了:
- 通过Kubernetes实现的可扩展性
- 通过Redis缓存实现的快速响应
- 通过MongoDB实现的持久化存储
- 通过微服务实现的模块化设计
这种架构非常适合需要处理大量会话数据并保证快速响应的对话式AI应用场景。
组件说明
AWS EKS (Elastic Kubernetes Service)
作为容器编排平台,托管所有微服务。
微服务A (Prompt Receiver)
- 基于FastAPI构建
- 通过REST API接收用户提示
- 将请求转发给微服务B
微服务B (Conversational Logic)
- 基于FastAPI构建
- 访问ElastiCache(Redis)缓存最近对话
- 使用MongoDB RDS持久化存储会话数据
AWS ElastiCache (Redis)
- 提供内存数据库服务
- 加速实时交互响应
- 缓存最近对话内容
MongoDB on RDS
- 关系型数据库服务
- 持久化存储完整聊天记录
- 支持元数据存储和长期检索
Kubernetes部署配置
Docker镜像构建
两个服务共享相同的Docker基础镜像:
FROM python:3.10-slim
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
依赖文件requirements.txt:
fastapi uvicorn httpx redis pymongo
微服务A部署配置(service-a-deployment.yaml)
apiVersion: apps/v1
kind: Deployment
metadata:name: service-a-deployment
spec:replicas: 2selector:matchLabels:app: service-atemplate:metadata:labels:app: service-aspec:containers:- name: service-aimage: your-docker-imageports:- containerPort: 8000env:- name: SERVICE_B_URLvalue: "http://service-b-service:8000/process"- name: REDIS_HOSTvalue: "redis-service"- name: REDIS_PORTvalue: "6379"- name: MONGODB_URIvalue: "mongodb://mongodb-service:27017"
---
apiVersion: v1
kind: Service
metadata:name: service-a-service
spec:ports:- port: 8000selector:app: service-a
微服务B部署配置(service-b-deployment.yaml)
apiVersion: apps/v1
kind: Deployment
metadata:name: service-b-deployment
spec:replicas: 2selector:matchLabels:app: service-btemplate:metadata:labels:app: service-bspec:containers:- name: service-bimage: your-docker-imageports:- containerPort: 8000env:- name: REDIS_HOSTvalue: "redis-service"- name: REDIS_PORTvalue: "6379"- name: MONGODB_URIvalue: "mongodb://mongodb-service:27017"
---
apiVersion: v1
kind: Service
metadata:name: service-b-service
spec:ports:- port: 8000selector:app: service-b
Redis部署配置(redis-deployment.yaml)
apiVersion: apps/v1
kind: Deployment
metadata:name: redis-deployment
spec:replicas: 1selector:matchLabels:app: redistemplate:metadata:labels:app: redisspec:containers:- name: redisimage: redis:6.2.5-alpineports:- containerPort: 6379env:- name: REDIS_PASSWORDvalueFrom:secretKeyRef:name: redis-secretkey: REDIS_PASSWORD
---
apiVersion: v1
kind: Service
metadata:name: redis-service
spec:ports:- port: 6379selector:app: redis
MongoDB部署配置(mongodb-deployment.yaml)
apiVersion: apps/v1
kind: Deployment
metadata:name: mongodb-deployment
spec:replicas: 1selector:matchLabels:app: mongodbtemplate:metadata:labels:app: mongodbspec:containers:- name: mongodbimage: mongo:5.0ports:- containerPort: 27017env:- name: MONGO_INITDB_ROOT_USERNAMEvalueFrom:secretKeyRef:name: mongodb-secretkey: MONGO_INITDB_ROOT_USERNAME- name: MONGO_INITDB_ROOT_PASSWORDvalueFrom:secretKeyRef:name: mongodb-secretkey: MONGO_INITDB_ROOT_PASSWORD
---
apiVersion: v1
kind: Service
metadata:name: mongodb-service
spec:ports:- port: 27017selector:app: mongodb
微服务实现细节
微服务A实现(service_a/main.py)
from fastapi import FastAPI, Request
import httpxapp = FastAPI()
SERVICE_B_URL = "http://service-b.default.svc.cluster.local/process"@app.post("/prompt")
async def receive_prompt(request: Request):data = await request.json()async with httpx.AsyncClient() as client:response = await client.post(SERVICE_B_URL, json=data)return response.json()
微服务B实现(service_b/main.py)
from fastapi import FastAPI, Request
from redis import Redis
from pymongo import MongoClient
import osapp = FastAPI()# 初始化Redis连接
redis_client = Redis(host=os.getenv("REDIS_HOST"),port=int(os.getenv("REDIS_PORT")),decode_responses=True
)# 初始化MongoDB连接
mongo_client = MongoClient(os.getenv("MONGODB_URI"))
db = mongo_client["chatbot"]
conversations = db["conversations"]@app.post("/process")
async def process_prompt(request: Request):data = await request.json()session_id = data["session_id"]prompt = data["prompt"]# 检查Redis缓存cached_response = redis_client.get(f"{session_id}:{prompt}")if cached_response:return {"response": cached_response, "cached": True}# 模拟AI处理(占位符)ai_response = f"Processed: {prompt}"# 缓存响应redis_client.set(f"{session_id}:{prompt}", ai_response, ex=3600)# 存储到MongoDBconversations.update_one({"session_id": session_id},{"$push": {"messages": {"prompt": prompt, "response": ai_response}}},upsert=True)return {"response": ai_response, "cached": False}
安全注意事项
-
环境变量管理
- 敏感信息如数据库凭证应存储在Kubernetes Secrets中
-
IAM角色配置
- 使用IAM角色服务账户(IRSA)为EKS Pod提供安全访问AWS服务的权限
-
网络配置
- 确保正确的VPC、子网和安全组规则
- 允许EKS与ElastiCache和RDS实例之间的通信
部署选项
-
Redis部署
- 推荐使用Bitnami Helm Chart快速部署Redis集群
helm repo add bitnami https://charts.bitnami.com/bitnami helm repo update helm install redis bitnami/redis
-
MongoDB部署
- AWS不提供原生MongoDB服务,可选择:
- Amazon DocumentDB(兼容MongoDB)
- 在EC2上手动部署MongoDB
- AWS不提供原生MongoDB服务,可选择:
相关文章:
使用FastAPI微服务在AWS EKS上实现AI会话历史的管理
架构概述 本文介绍如何使用FastAPI构建微服务架构,在AWS EKS上部署两个微服务: 服务A:接收用户提示服务B:处理对话逻辑,与Redis缓存和MongoDB数据库交互 该架构利用AWS ElastiCache(Redis)实现快速响应,…...

[模型选择与调优]机器学习-part4
七 模型选择与调优 1 交叉验证 (1) 保留交叉验证HoldOut HoldOut Cross-validation(Train-Test Split) 在这种交叉验证技术中,整个数据集被随机地划分为训练集和验证集。根据经验法则,整个数据集的近70%被用作训练集ÿ…...

【计算机网络-数据链路层】以太网、MAC地址、MTU与ARP协议
📚 博主的专栏 🐧 Linux | 🖥️ C | 📊 数据结构 | 💡C 算法 | 🅒 C 语言 | 🌐 计算机网络 上篇文章:传输层-TCP协议TCP核心机制与可靠性保障 下篇文章: 网络…...
学习适应对智能软件对对象的属性进行表征、计算的影响
下面的链接是我新发表的文章。这篇文章是关于智能软件对对象进行标志、表征的问题,这是所有智能实体都无法回避的基本问题。 我最近写了一篇关于奖惩系统的文章。并开始写智能是如何在基础编程的基础上涌现出来的文章。 https://www.oalib.com/articles/6857382 …...
vue 组件函数式调用实战:以身份验证弹窗为例
通常我们在 Vue 中使用组件,是像这样在模板中写标签: <MyComponent :prop"value" event"handleEvent" />而函数式调用,则是让我们像调用一个普通 JavaScript 函数一样来使用这个组件,例如:…...
多线程面试题总结
基础概念 进程与线程的区别 进程:操作系统资源分配的基本单位,有独立内存空间线程:CPU调度的基本单位,共享进程资源对比: 创建开销:进程 > 线程通信方式:进程(IPC)、线程(共享内存)安全性:进程更安全(隔离),线程需要同步线程的生命周期与状态转换 NEW → RUNNABLE …...

Kafka 与 RabbitMQ、RocketMQ 有何不同?
一、不同的诞生背景,塑造了不同的“性格” 名称 背景与目标 产品定位 Kafka 为了解决 LinkedIn 的日志收集瓶颈,强调吞吐与持久化 更像一个“可持久化的分布式日志系统” RabbitMQ 出自金融通信协议 AMQP 的实现,强调协议标准与广泛适…...
【比赛真题解析】篮球迷
本次给大家分享一道比赛的题目:篮球迷。 洛谷链接:U561543 篮球迷 题目如下: 【题目描述】 众所周知,jimmy是个篮球迷。众所周知,Jimmy非常爱看NBA。 众所周知,Jimmy对NBA冠军球队的获奖年份和队名了如指掌。 所以,Jimmy要告诉你n个冠军球队的名字和获奖年份,并要求你…...

【MATLAB源码-第277期】基于matlab的AF中继系统仿真,AF和直传误码率对比、不同中继位置误码率对比、信道容量、中继功率分配以及终端概率。
操作环境: MATLAB 2022a 1、算法描述 在AF(放大转发)中继通信系统中,信号的传输质量和效率受到多个因素的影响,理解这些因素对于系统的优化至关重要。AF中继通信的基本架构由发射端、中继节点和接收端组成。发射端负…...

webRtc之指定摄像头设备绿屏问题
摘要:最近发现,在使用navigator.mediaDevices.getUserMedia({ deviceId: ‘xxx’}),指定设备的时候,video播放总是绿屏,发现关闭浏览器硬件加速不会出现,但显然这不是一个最好的方案; 播放后张这样 修复后 上代码 指定…...

2023年03月青少年软件编程(图形化)等级考试四级编程题
求和 1.准备工作 (1)保留舞台中的小猫角色和白色背景。 2.功能实现 (1)计算1~100中,可以被3整除的数之和; (2)说出被3整除的数之和。 标准答案: 参考程序&…...

ensp的华为小实验
1.先进行子网划分 2.进行接口的IP地址配置和ospf的简易配置,先做到全网小通 3.进行ospf优化 对区域所有区域域间路由器进行一个汇总 对区域1进行优化 对区域2.3进行nssa设置 4.对ISP的路由进行协议配置 最后ping通5.5.5.5...

ragflow报错:KeyError: ‘\n “序号“‘
环境: ragflowv 0.17.2 问题描述: ragflow报错:KeyError: ‘\n “序号”’ **1. 推荐表(输出json格式)** [{"},{},{"},{} ]raceback (most recent call last): May 08 20:06:09 VM-0-2-ubuntu ragflow-s…...
Java大数据可视化在城市空气质量监测与污染溯源中的应用:GIS与实时数据流的技术融合
随着城市化进程加速,空气质量监测与污染溯源成为智慧城市建设的核心议题。传统监测手段受限于数据离散性、分析滞后性及可视化能力不足,难以支撑实时决策。2025年4月27日发布的《Java大数据可视化在城市空气质量监测与污染溯源中的应用》一文,…...

FHE与后量子密码学
1. 引言 近年来,关于 后量子密码学(PQC, Post-Quantum Cryptography) 的讨论愈发热烈。这是因为安全专家担心,一旦有人成功研发出量子计算机,会发生什么可怕的事情。由于 Shor 算法的存在,量子计算机将能够…...
Flask 调试的时候进入main函数两次
在 Flask 开启 Debug 模式时,程序会因为自动重载(reloader)的机制而启动两个进程,导致if __name__ __main__底层的程序代码被执行两次。以下说明其原理与常见解法。 Flask Debug 模式下自动重载机制 Flask 使用的底层服务器 Wer…...
cv_area_center()
主题 用opencv实现了halcon中area_center算子的功能, 返回region的面积,中心的行坐标和中心的列坐标 代码很简单 def cv_area_center(region):area[]row []col []for re in region:retval cv2.moments(re)area.append(retval[m00])row.append(int(r…...

CSS: 选择器与三大特性
标签选择器 标签选择器就是选择一些HTML的不同标签,由于它们的标签需求不同,所以CSS需要设置标签去选择它们,为满足它们的需求给予对应的属性 基础选择器 标签选择器 <!DOCTYPE html> <head><title>HOME</title>…...
2505d,d的借用检查器
void func(scope ref int*) {}unique(int*) a ...; assert(a !is null);unique(int*) b a; assert(a is null); assert(b !is null);func(b); // ok用live作为检查器,不必有断定了. int* a ...; int* b a; // 所有权转至b *a 3; // 不能再用a.编译器保证约束指针. live…...
力扣-2.两数相加
题目描述 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都…...

M0基础篇之ADC
本节课使用到的例程 一、Single模式例程基本配置的解释 在例程中我们只使用到了PA25这一个通道,因此我们使用的是Single这个模式,也就是我们在配置模式的时候使用的是单一转换。 进行多个通道的测量我们可以使用Sequence这个模式。 二、Single模式例程基…...
Nginx安全防护与HTTPS部署
一、安全防护与HTTPS概念 一、安全防护与HTTPS概念 为什么要隐藏版本号? 当访问网站时,能从响应标头查看到server的信息,这里面就包含了是什么web应用及其版本为你提供的服务。如果不隐藏server的版本,会导致别有用心的人知晓…...
C语言_程序的段
在 C 语言程序中,内存通常被分为多个逻辑段,每个段存储不同类型的数据。理解这些段的结构和功能,有助于你更高效地编写、调试和优化程序。以下是 C 语言程序中主要的内存段及其特点: 1. 代码段(Text Segment) 存储内容:编译后的机器指令(程序代码)。特性: 只读:防止…...

OSPF综合实验实验报告
OSPF综合实验实验报告 一、实验拓扑 二、实验要求 1.R5为ISP,其上只能配置IP地址;R4作为企业边界路由器, 出口公网地址需要通过PPP协议获取,并进行chap认证 2,整个OSPF环境IP基于172.16.0.0/16划分; 3&…...

vue3+ant design vue + Sortable实现多级表格列拖动
1、最近遇到个需求,需使用vue3ant design vue Sortable实现多级表格的表头允许用户拖拽移动。即当用户拖拽一级表头时,其对应的子级表头及数据应同步移动,并且只允许一级非固定表头允许拖拽。 2、代码 <a-table:data-source"rowDat…...

基于开源链动2+1模式AI智能名片S2B2C商城小程序的分销价格管控机制研究
摘要:本文聚焦开源链动21模式AI智能名片S2B2C商城小程序在分销体系中的价格管控机制,通过解析其技术架构与商业模式,揭示平台如何通过"去中心化裂变中心化管控"双轨机制实现价格统一。研究显示,该模式通过区块链存证技术…...

阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化
作者:裘文成(翊韬) 摘要 随着企业全球化业务的扩展,如何高效、经济且可靠地将分布在海外各地的应用与基础设施日志统一采集至阿里云日志服务 (SLS) 进行分析与监控,已成为关键挑战。 本文聚焦于阿里云高性能日志采集…...

体育培训的实验室管理痛点 质检LIMS如何重构体育检测价值链
在竞技体育与全民健身并行的时代背景下,体育培训机构正面临双重挑战:既要通过科学训练提升学员竞技水平,又需严格把控运动安全风险。作为实验室数字化管理的核心工具,质检LIMS系统凭借其标准化流程管控与智能化数据分析能力&#…...
第二节:Vben Admin 最新 v5.0 对接后端登录接口(上)
文章目录 前言一、登录页面调整二、登录表单调整三、后端接口(Python)对接对接准备1. Flask项目介绍2. User模型创建3. 迁移模型4. Token创建5. 编写蓝图6. 注册蓝图四、测试登录总结前言 这里是Vben Admin V5版本实战体验,上一节我们前端已正常运行,但是没有实现登录。本节…...

设计模式【cpp实现版本】
文章目录 设计模式1.单例模式代码设计1.饿汉式单例模式2.懒汉式单例模式 2.简单工厂和工厂方法1.简单工厂2.工厂方法 3.抽象工厂模式4.代理模式5.装饰器模式6.适配器模式7.观察者模式 设计模式 1.单例模式代码设计 为什么需要单例模式,在我们的项目设计中&…...