您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

clean_messages.py 3.3KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import datetime
  2. import logging
  3. import time
  4. import click
  5. from sqlalchemy.exc import SQLAlchemyError
  6. import app
  7. from configs import dify_config
  8. from extensions.ext_database import db
  9. from extensions.ext_redis import redis_client
  10. from models.model import (
  11. App,
  12. Message,
  13. MessageAgentThought,
  14. MessageAnnotation,
  15. MessageChain,
  16. MessageFeedback,
  17. MessageFile,
  18. )
  19. from models.web import SavedMessage
  20. from services.feature_service import FeatureService
  21. logger = logging.getLogger(__name__)
  22. @app.celery.task(queue="dataset")
  23. def clean_messages():
  24. click.echo(click.style("Start clean messages.", fg="green"))
  25. start_at = time.perf_counter()
  26. plan_sandbox_clean_message_day = datetime.datetime.now() - datetime.timedelta(
  27. days=dify_config.PLAN_SANDBOX_CLEAN_MESSAGE_DAY_SETTING
  28. )
  29. while True:
  30. try:
  31. # Main query with join and filter
  32. messages = (
  33. db.session.query(Message)
  34. .where(Message.created_at < plan_sandbox_clean_message_day)
  35. .order_by(Message.created_at.desc())
  36. .limit(100)
  37. .all()
  38. )
  39. except SQLAlchemyError:
  40. raise
  41. if not messages:
  42. break
  43. for message in messages:
  44. app = db.session.query(App).filter_by(id=message.app_id).first()
  45. if not app:
  46. logger.warning(
  47. "Expected App record to exist, but none was found, app_id=%s, message_id=%s",
  48. message.app_id,
  49. message.id,
  50. )
  51. continue
  52. features_cache_key = f"features:{app.tenant_id}"
  53. plan_cache = redis_client.get(features_cache_key)
  54. if plan_cache is None:
  55. features = FeatureService.get_features(app.tenant_id)
  56. redis_client.setex(features_cache_key, 600, features.billing.subscription.plan)
  57. plan = features.billing.subscription.plan
  58. else:
  59. plan = plan_cache.decode()
  60. if plan == "sandbox":
  61. # clean related message
  62. db.session.query(MessageFeedback).where(MessageFeedback.message_id == message.id).delete(
  63. synchronize_session=False
  64. )
  65. db.session.query(MessageAnnotation).where(MessageAnnotation.message_id == message.id).delete(
  66. synchronize_session=False
  67. )
  68. db.session.query(MessageChain).where(MessageChain.message_id == message.id).delete(
  69. synchronize_session=False
  70. )
  71. db.session.query(MessageAgentThought).where(MessageAgentThought.message_id == message.id).delete(
  72. synchronize_session=False
  73. )
  74. db.session.query(MessageFile).where(MessageFile.message_id == message.id).delete(
  75. synchronize_session=False
  76. )
  77. db.session.query(SavedMessage).where(SavedMessage.message_id == message.id).delete(
  78. synchronize_session=False
  79. )
  80. db.session.query(Message).where(Message.id == message.id).delete()
  81. db.session.commit()
  82. end_at = time.perf_counter()
  83. click.echo(click.style(f"Cleaned messages from db success latency: {end_at - start_at}", fg="green"))