lib.py 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. # coding=utf-8
  2. """
  3. @project: MaxKB
  4. @Author:虎
  5. @file: lib.py
  6. @date:2024/8/16 17:12
  7. @desc:
  8. """
  9. import os
  10. from redis.sentinel import Sentinel
  11. from maxkb.const import CONFIG, PROJECT_DIR, LOG_DIR
  12. # celery相关配置
  13. celery_data_dir = os.path.join(PROJECT_DIR, 'data', 'celery_task')
  14. if not os.path.exists(celery_data_dir) or not os.path.isdir(celery_data_dir):
  15. os.makedirs(celery_data_dir, 0o700, exist_ok=True)
  16. os.chmod(os.path.dirname(celery_data_dir), 0o700)
  17. # Celery using redis as broker
  18. redis_celery_once_db = CONFIG.get("REDIS_DB")
  19. redis_celery_db = CONFIG.get('REDIS_DB')
  20. CELERY_BROKER_URL_FORMAT = '%(protocol)s://:%(password)s@%(host)s:%(port)s/%(db)s'
  21. if CONFIG.get('REDIS_SENTINEL_MASTER') and CONFIG.get('REDIS_SENTINEL_SENTINELS'):
  22. sentinels_str = CONFIG.get('REDIS_SENTINEL_SENTINELS')
  23. sentinels = [
  24. (host.strip(), int(port))
  25. for hostport in sentinels_str.split(',')
  26. for host, port in [hostport.strip().split(':')]
  27. ]
  28. CELERY_BROKER_URL = ';'.join([CELERY_BROKER_URL_FORMAT % {
  29. 'protocol': 'sentinel', 'password': CONFIG.get('REDIS_PASSWORD'),
  30. 'host': item[0], 'port': item[1], 'db': redis_celery_db
  31. } for item in sentinels])
  32. SENTINEL_OPTIONS = {
  33. 'master_name': CONFIG.get('REDIS_SENTINEL_MASTER'),
  34. }
  35. CELERY_BROKER_TRANSPORT_OPTIONS = CELERY_RESULT_BACKEND_TRANSPORT_OPTIONS = SENTINEL_OPTIONS
  36. # celery-once 哨兵模式配置
  37. sentinel = Sentinel(
  38. sentinels,
  39. socket_timeout=5,
  40. password=CONFIG.get('REDIS_SENTINEL_PASSWORD', CONFIG.get('REDIS_PASSWORD'))
  41. )
  42. master_host, master_port = sentinel.discover_master(CONFIG.get('REDIS_SENTINEL_MASTER'))
  43. celery_once_settings = {
  44. 'url': f"redis://:{CONFIG.get('REDIS_PASSWORD')}@{master_host}:{master_port}/{redis_celery_once_db}",
  45. 'master_name': CONFIG.get('REDIS_SENTINEL_MASTER'),
  46. 'password': CONFIG.get('REDIS_PASSWORD'),
  47. 'db': redis_celery_once_db,
  48. }
  49. else:
  50. CELERY_BROKER_URL = CELERY_BROKER_URL_FORMAT % {
  51. 'protocol': 'redis',
  52. 'password': CONFIG.get('REDIS_PASSWORD'),
  53. 'host': CONFIG.get('REDIS_HOST'),
  54. 'port': CONFIG.get('REDIS_PORT'),
  55. 'db': redis_celery_db
  56. }
  57. # celery-once 常规模式配置
  58. celery_once_settings = {
  59. 'url': CELERY_BROKER_URL_FORMAT % {
  60. 'protocol': 'redis',
  61. 'password': CONFIG.get('REDIS_PASSWORD'),
  62. 'host': CONFIG.get('REDIS_HOST'),
  63. 'port': CONFIG.get('REDIS_PORT'),
  64. 'db': redis_celery_once_db,
  65. }
  66. }
  67. CELERY_result_backend = CELERY_BROKER_URL
  68. CELERY_timezone = CONFIG.get_time_zone()
  69. CELERY_ENABLE_UTC = False
  70. CELERY_task_serializer = 'hmac_signed_serializer'
  71. CELERY_result_serializer = 'hmac_signed_serializer'
  72. CELERY_accept_content = ['json', 'hmac_signed_serializer']
  73. CELERY_RESULT_EXPIRES = 600
  74. CELERY_WORKER_TASK_LOG_FORMAT = '%(asctime).19s %(message)s'
  75. CELERY_WORKER_LOG_FORMAT = '%(asctime).19s %(message)s'
  76. CELERY_TASK_EAGER_PROPAGATES = True
  77. CELERY_WORKER_REDIRECT_STDOUTS = True
  78. CELERY_WORKER_REDIRECT_STDOUTS_LEVEL = "INFO"
  79. CELERY_TASK_SOFT_TIME_LIMIT = 3600
  80. CELERY_WORKER_CANCEL_LONG_RUNNING_TASKS_ON_CONNECTION_LOSS = True
  81. # celery-once 配置
  82. celery_once_settings['default_timeout'] = 3600 # 锁的默认超时时间(秒)
  83. CELERY_ONCE = {
  84. 'backend': 'celery_once.backends.Redis',
  85. 'settings': celery_once_settings
  86. }
  87. CELERY_BROKER_CONNECTION_RETRY_ON_STARTUP = True
  88. CELERY_LOG_DIR = os.path.join(LOG_DIR, 'celery')