"""模块:子服务器 AppConfig Django 启动时自动完成 MSYNC Socket.IO 桥接——连接、注册、认证、心跳。""" import logging import threading from django.apps import AppConfig from django.conf import settings logger = logging.getLogger(__name__) # 与主服务器约定的 SDK 最低版本——版本不一致时启动警告 REQUIRED_GVSDSDK_VERSION = '1.1.0' class SubServerConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'apps.sub_server' verbose_name = 'SMANAGE 子服务器' verbose_name_plural = 'SMANAGE 子服务器' def ready(self): # 1) 校验 gvsdsdk 版本与主服务器一致 self._check_sdk_version() # 2) 注册实验本地事务处理器(供主服务器 Saga 编排回调) self._register_local_handlers() # 3) 启动 MSYNC 桥接 self._connect_msync() def _register_local_handlers(self): try: from .local_handlers import RegisterExperimentHandlers RegisterExperimentHandlers() logger.info('实验本地事务处理器已注册: demo_a/demo_b/demo_fail/demo_flaky') except Exception as e: logger.error(f'实验本地事务处理器注册失败: {e}') def _check_sdk_version(self): try: import gvsdsdk info = gvsdsdk.get_version_info() logger.info(f'[SDK] 加载: v{info["Version"]} @ {info["Location"]}') ok, msg = gvsdsdk.check_min_version(REQUIRED_GVSDSDK_VERSION) if ok: logger.info(f'[SDK] {msg}') else: logger.warning(f'[SDK] 版本不符!{msg}。双端 gvsdsdk 版本必须一致!') except ImportError as e: logger.error(f'[SDK] gvsdsdk 未安装: {e}') except Exception as e: logger.error(f'[SDK] 版本检查失败: {e}') def _connect_msync(self): try: from msync_client.sio_client import MSyncSocketClient msync_client = MSyncSocketClient( master_url=settings.MSYNC_MASTER_URL, service_name=settings.MSYNC_SERVICE_NAME, service_domain=settings.MSYNC_SERVICE_DOMAIN, service_secret=settings.MSYNC_SERVICE_SECRET, scope=settings.MSYNC_SERVICE_SCOPE, heartbeat_interval=settings.MSYNC_HEARTBEAT_INTERVAL, metadata={'DBName': settings.DATABASES['default']['NAME']}, ) setattr(settings, 'MSYNC_CLIENT', msync_client) t = threading.Thread(target=msync_client.Connect, daemon=True) t.start() logger.info('MSYNC Socket.IO 桥接线程已启动') except Exception as e: logger.error(f'MSYNC 桥接启动失败: {e}')