1 概述
dify-api使用postgresql来存储数据,在dify控制台每新建一个聊天机器的聊天框,就会在conversations表里新插入一条记录,并且不断地更新字段updated_at,示例如下:
dify=# select * from conversations limit 1;
-[ RECORD 1 ]-------------+-------------------------------------
id | e880b32f-6aae-4191-890b-52f0ddbcb9b7
app_id | 7455b19d-85f2-42a0-b3cd-f1b5178ab2da
app_model_config_id | 5c1c9c78-2cd2-459d-9f77-9be329910fe0
model_provider | tongyi
override_model_configs |
model_id | qwen-vl-max-0809
mode | chat
name | Asking about the definition of k8s
summary |
inputs | {}
introduction |
system_instruction |
system_instruction_tokens | 0
status | normal
from_source | console
from_end_user_id |
from_account_id | 49de836a-9c2d-4f20-82bc-d00efd14893c
read_at |
read_account_id |
created_at | 2025-03-23 05:40:22
updated_at | 2025-03-23 12:10:44.410997
is_deleted | f
invoke_from | explore
dialogue_count | 0
因此可以依据updated_at字段来过滤最新活跃的聊天,就是一条SQL的事情,而keda具备Postgresql Scaler模块来对接Postgresql,通过SQL查询数据,将获取的数据转变成external metrics供HPA模块使用。
dify_34">2 部署dify
此处省略,可以参考我的文章:
https://blog.csdn.net/nangonghen/article/details/145917819
keda_43">3 部署keda
此处省略,可以参考我的文章:
https://blog.csdn.net/nangonghen/article/details/145601276
kedakubernetes_50">4 创建keda相关kubernetes资源
将ScaledObject和TriggerAuthentication资源提交到k8s集群可,以下示例仅供参考:
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:name: hpa-dify-apinamespace: dify
spec:scaleTargetRef: # 扩容目标对象name: dify-apikind: StatefulSetapiVersion: apps/v1minReplicaCount: 1 # 最小副本数,最小可以是0maxReplicaCount: 6 # 最大副本数pollingInterval: 10 # 轮询时间,单位是秒triggers: # 伸缩的触发规则- type: postgresqlauthenticationRef:name: keda-trigger-auth # pg密码存储在此对象,因此metadata中不必写密码参数passwordmetadata:userName: postgreshost: dify-pg-ha.difyport: "5432"dbName: difysslmode: disablequery: "select count(1) from conversations where updated_at > (NOW() - INTERVAL '1 minutes');"targetQueryValue: "3"
apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:name: keda-trigger-authnamespace: dify
spec:secretTargetRef:- parameter: password # 目标参数名称(根据Scaler类型而定。对于Postgresql Scaler,密码parameter是password)name: pg-secret # Secret 名称key: PG_PASSWORD # Secret 中的键名
5 测试
在dify控制台新增创建多个活跃聊天窗口:
从k8s event事件看出,keda operator会将dify-api服务的副本从1提升至2:
6 小结
本文介绍通过keda的pg scaler模块从数据库获取活跃的聊天窗口的记录数,基于此来伸缩dify api服务,如此一来在chat机器人聊天频繁的情况下,dify api的副本数量不会成为瓶颈。