0

0

使用 AWS ECS 和 EFS 扩展有状态 Streamlit 聊天机器人

聖光之護

聖光之護

发布时间:2025-01-21 08:14:00

|

397人浏览过

|

来源于php中文网

原创

您开发了一个出色的streamlit应用程序,但将其部署到公司内部却遇到了服务器过载和数据丢失的问题。本文将指导您如何在aws上部署一个可扩展且具有状态保持功能的streamlit应用,避免类似问题。

引言

Streamlit是Python开发者构建交互式Web应用的优秀框架。随着生成式AI的兴起,Streamlit的流行度也显著提升:

使用 AWS ECS 和 EFS 扩展有状态 Streamlit 聊天机器人

Streamlit简化了前端开发,让您专注于应用的核心功能。然而,云端部署则需要解决状态保持和可扩展性问题。Streamlit默认情况下使用内存状态,页面刷新或服务器重启会导致状态丢失。本文将提供在AWS上部署一个可扩展且具有状态保持功能的Streamlit聊天机器人的详细指南。

Streamlit的状态性和可扩展性

将Streamlit应用从本地环境迁移到云端,主要挑战在于状态保持和可扩展性。Streamlit的内存中状态机制在多实例扩展或服务器重启时会丢失数据。本文将提供一种解决方案,解决在将本地POC GenAI应用共享给同事时遇到的问题。

架构

本文介绍的架构利用以下AWS服务:

  • 应用程序负载均衡器 (ALB): 均衡分配传入流量到多个目标实例。
  • Fargate上的弹性容器服务 (ECS): 简化Docker容器管理,实现轻松扩展,无需管理服务器。使用arm64和0.25vcpu/0.5gb ram ECS任务以优化成本效益。
  • 弹性文件系统 (EFS): 提供可扩展的文件系统,可挂载到多个ECS节点,确保跨可用区的数据持久性和冗余。
  • CloudFront (可选): 作为CDN,提升性能并减少延迟,并提供HTTPS支持。

使用 AWS ECS 和 EFS 扩展有状态 Streamlit 聊天机器人

为什么不使用Lambda?

Lambda最初被考虑用于Python或Docker执行环境。然而,Streamlit依赖websocket资源/_stcore/stream,而Amazon API Gateway虽然支持websocket,但需要为连接/数据/断开事件定义多个Lambda处理程序,这与传统HTTP端点使用Lambda Web Adaptor的方式不同。更重要的是,Streamlit客户端将数据作为二进制帧发送到websocket API,而Amazon API Gateway仅支持文本帧,因此无法使用Lambda作为Streamlit后端。

为什么选择EFS而不是其他?

RDS、DynamoDB、ElasticCache和S3等服务也用于状态管理,但各有其复杂性和成本:

选项 优点 缺点
RDS 可靠,健壮 设置复杂,成本高,项目限制
DynamoDB 可扩展,快速 设置复杂,成本高,项目限制,需要手动二进制序列化
ElasticCache 高效缓存 设置复杂,重启时状态丢失,需要本地隧道
S3 成本效益高 网络延迟(除非付费使用S3 VPC网关端点)
EFS 易于设置,可扩展,持久,成本效益高 大规模扩展时成本/延迟会成为问题

EFS提供更简单且更具成本效益的解决方案。它易于设置且相对便宜,适合持久化状态存储。

负载均衡器并非免费的

ALB确实会产生固定成本,但其提供的可扩展性和可靠性对于生产环境至关重要,其优势超过了成本。

萝卜简历
萝卜简历

免费在线AI简历制作工具,帮助求职者轻松完成简历制作。

下载

为什么选择这种方法?

部署Streamlit应用到云端需要考虑可扩展性和状态性。Streamlit的内存状态管理不适用于生产环境的多用户场景。仅仅扩展虚拟机是不够的,需要一个能够在刷新和服务器重启时保持用户会话的解决方案。

本方案使用streamlit-local-storage包将会话密钥存储在本地存储中,每个会话的数据保存到已安装的EFS存储中的一个文件夹中,文件夹路径由会话密钥构建。本地存储不适合存储大量二进制数据。这确保会话数据在多个ECS节点之间持久且同步。

无需使用复杂且昂贵的数据库解决方案,EFS提供了一种简单高效的替代方案。其易于设置、可扩展且成本效益高。最重要的是,代码在云端和本地环境中的运行方式相同,无需费力设置本地数据库。

可扩展有状态Streamlit应用程序的项目模板

这是一个基于Amazon Bedrock的LLM聊天机器人,提供基本的模型切换和对话重置。左侧面板显示服务的ECS任务主机名和会话ID。

使用 AWS ECS 和 EFS 扩展有状态 Streamlit 聊天机器人

Streamlit Python脚本伪代码

以下是管理会话数据的Streamlit Python脚本简化伪代码:

import uuid
import pickle
import streamlit as st
from streamlit_local_storage import LocalStorage
... other imports ...

session_data = {}
session_id = local_storage.getItem('session_id') or str(uuid.uuid4())
if session_id:
    with open(f'/session_data/{session_id}.json', 'r') as f:
        for key, value in pickle.load(f):
            session_data[key] = value

session_data['some-key'] = st.some_input(label='Enter some input here')
... main chatbot logic here ...

with open(f'/session_data/{session_id}.json', 'w') as f:
    pickle.dump(session_data, f)

此脚本使用本地单例字典session_data存储会话数据,session_id从本地存储生成或检索。会话数据在脚本初始化时加载,并在脚本结束时保存。由于EFS已安装到所有ECS节点,会话数据在所有ECS任务实例之间共享。Streamlit的原生session_state未使用,因为它存储在内存中,不跨多个ECS节点共享。

在您的组织中部署

在AWS上部署此可扩展且具有状态保持功能的Streamlit聊天机器人,请按照以下步骤操作:

  1. 克隆仓库: 克隆仓库https://github.com/gabrielkoo/scalable-stateful-streamlit-chatbot-on-aws/tree/main。
  2. 部署CloudFormation堆栈: 使用template.yml文件部署AWS基础设施。建议使用AWS管理控制台。
  3. 构建并部署Docker镜像: 运行./deployment.sh:构建Docker镜像,推送到Amazon ECR,并使用新镜像扩展ECS服务。
  4. 访问聊天机器人: 通过ALB提供的URL或CloudFront URL访问聊天机器人。
  5. 启用自动扩展: 为ECS服务配置自动扩展,以有效处理不同负载。(此步骤未在仓库中涵盖)

通过这些步骤,您可以在AWS上部署一个强大、可扩展且具有状态保持功能的Streamlit应用,即使在高负载下也能确保无缝的用户体验。 这比简单的虚拟机扩展更经济高效。 您可以专注于本地开发,然后轻松扩展到AWS!

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

751

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

636

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

758

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

618

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1262

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

577

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

706

2023.08.11

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Django 教程
Django 教程

共28课时 | 3.1万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号