73 lines
2.8 KiB
Python
73 lines
2.8 KiB
Python
"""模块:子服务器 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}')
|