本人的下一份工作是一个基于rust的agent saas平台,而目前毫无相关经验,只是会一些基础的rust使用,所以想要实现一个简单的rust分布式ai项目练手。
目标
本人曾经酷爱阅读网络小说,但是有些小说读着读着会忘记任务和物品的剧情。
目前的ai平台如果将小说交给ai解析,ai会阅读全文进行总结,可能会导致剧透等问题。
如果可以实现一个根据阅读进度进行总结的ai项目,对当前章节的物品和人物进行标注,就可以同时实现回忆剧情和避免剧透的问题。
还可以模拟其他用户对当前章节有意思的地方进行ai评论,突破正版app的评论垄断。
整体设计
对于一个最简化微服务系统来说,架构中需要包含服务发现,消息队列,缓存,数据库,对于理解小说的ai系统来说,还需要向量数据库和外部llm api,和存储小说的对象存储服务。
使用较为成熟的微服务组件,向量库和对象存储使用rust开发的。
- 服务发现:Nacos
- 消息队列:RabbitMQ
- 缓存:Redis
- 数据库:Postgre
- 向量数据库:qdrant
- 对象存储:garage
这些组件在云上是可以直接获取集群和的服务,本地测试开发就先使用单体部署的方式进行。
通过docker compose一键部署所有中间件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
| version: '3.8'
services: # Nacos - 服务发现与配置中心 nacos: image: nacos/nacos-server:v2.3.0 container_name: nacos environment: - MODE=standalone - PREFER_HOST_MODE=hostname - JVM_XMS=512m - JVM_XMX=512m - JVM_XMN=256m ports: - "8848:8848" - "9848:9848" - "9849:9849" volumes: - nacos_logs:/home/nacos/logs - nacos_data:/home/nacos/data healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8848/nacos/v1/console/health/readiness"] interval: 30s timeout: 10s retries: 5 start_period: 60s networks: - microservice-network
# RabbitMQ - 消息队列 rabbitmq: image: rabbitmq:3.12-management-alpine container_name: rabbitmq environment: - RABBITMQ_DEFAULT_USER=admin - RABBITMQ_DEFAULT_PASS=admin123 ports: - "5672:5672" # AMQP 协议端口 - "15672:15672" # 管理界面端口 volumes: - rabbitmq_data:/var/lib/rabbitmq healthcheck: test: ["CMD", "rabbitmq-diagnostics", "check_running"] interval: 30s timeout: 10s retries: 5 start_period: 40s networks: - microservice-network
# Redis - 缓存 redis: image: redis:7.2-alpine container_name: redis command: redis-server --requirepass redis123 --appendonly yes ports: - "6379:6379" volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "-a", "redis123", "ping"] interval: 30s timeout: 10s retries: 5 start_period: 20s networks: - microservice-network
# PostgreSQL - 数据库 postgres: image: postgres:16-alpine container_name: postgres environment: - POSTGRES_USER=admin - POSTGRES_PASSWORD=admin123 - POSTGRES_DB=microservice - PGDATA=/var/lib/postgresql/data/pgdata ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U admin -d microservice"] interval: 30s timeout: 10s retries: 5 start_period: 40s networks: - microservice-network
# Qdrant - 向量数据库 qdrant: image: qdrant/qdrant:v1.7.4 container_name: qdrant ports: - "6333:6333" # REST API - "6334:6334" # gRPC API volumes: - qdrant_data:/qdrant/storage healthcheck: test: ["CMD", "curl", "-f", "http://localhost:6333/health"] interval: 30s timeout: 10s retries: 5 start_period: 20s networks: - microservice-network
# Garage - 对象存储 (Rust 编写,S3 兼容) garage: image: dxflrs/garage:v0.9.0 container_name: garage ports: - "3900:3900" # S3 API 端口 - "3901:3901" # Admin API 端口 - "3902:3902" # Web UI 端口 volumes: - garage_data:/var/lib/garage - ./garage.toml:/etc/garage.toml:ro healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3901/health"] interval: 30s timeout: 10s retries: 5 start_period: 20s networks: - microservice-network
volumes: nacos_logs: nacos_data: rabbitmq_data: redis_data: postgres_data: qdrant_data: garage_data:
networks: microservice-network: driver: bridge
|
服务说明
Nacos (服务发现与配置中心)
RabbitMQ (消息队列)
Redis (缓存)
- 端口: 6379
- 密码: redis123
- 用途: 缓存、会话存储、分布式锁
PostgreSQL (数据库)
- 端口: 5432
- 账号: admin/admin123
- 数据库: microservice
- 用途: 业务数据持久化
Qdrant (向量数据库)
Garage (对象存储)
初始化 Garage
首次启动后需要创建 bucket 和 access key:
1 2 3 4 5 6 7 8 9 10 11
| docker exec -it garage /bin/sh
garage bucket create novels
garage key create --name my-key
garage bucket allow --read --write --key my-key --bucket novels
|
启动命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| docker-compose up -d
docker-compose ps
docker-compose logs -f [service_name]
docker-compose down
docker-compose down -v
|
至此准备工作已经完成,万事俱备,只欠东风。