sycommon-python-lib 0.2.0b4__tar.gz → 0.2.0b6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/PKG-INFO +1 -1
  2. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/pyproject.toml +1 -1
  3. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/rabbitmq/rabbitmq_client.py +59 -14
  4. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/rabbitmq/rabbitmq_service_core.py +3 -3
  5. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon_python_lib.egg-info/PKG-INFO +1 -1
  6. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/README.md +0 -0
  7. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/setup.cfg +0 -0
  8. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/command/cli.py +0 -0
  9. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/__init__.py +0 -0
  10. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/config/Config.py +0 -0
  11. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/config/DatabaseConfig.py +0 -0
  12. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/config/EmbeddingConfig.py +0 -0
  13. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/config/LLMConfig.py +0 -0
  14. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/config/LangfuseConfig.py +0 -0
  15. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/config/MQConfig.py +0 -0
  16. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/config/RerankerConfig.py +0 -0
  17. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/config/SentryConfig.py +0 -0
  18. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/config/__init__.py +0 -0
  19. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/database/async_base_db_service.py +0 -0
  20. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/database/async_database_service.py +0 -0
  21. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/database/base_db_service.py +0 -0
  22. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/database/database_service.py +0 -0
  23. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/health/__init__.py +0 -0
  24. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/health/health_check.py +0 -0
  25. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/health/metrics.py +0 -0
  26. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/health/ping.py +0 -0
  27. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/llm/__init__.py +0 -0
  28. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/llm/embedding.py +0 -0
  29. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/llm/get_llm.py +0 -0
  30. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/llm/llm_logger.py +0 -0
  31. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/llm/llm_tokens.py +0 -0
  32. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/llm/struct_token.py +0 -0
  33. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/llm/sy_langfuse.py +0 -0
  34. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/llm/usage_token.py +0 -0
  35. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/logging/__init__.py +0 -0
  36. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/logging/async_sql_logger.py +0 -0
  37. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/logging/kafka_log.py +0 -0
  38. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/logging/logger_levels.py +0 -0
  39. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/logging/logger_wrapper.py +0 -0
  40. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/logging/sql_logger.py +0 -0
  41. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/middleware/__init__.py +0 -0
  42. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/middleware/context.py +0 -0
  43. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/middleware/cors.py +0 -0
  44. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/middleware/docs.py +0 -0
  45. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/middleware/exception.py +0 -0
  46. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/middleware/middleware.py +0 -0
  47. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/middleware/monitor_memory.py +0 -0
  48. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/middleware/mq.py +0 -0
  49. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/middleware/timeout.py +0 -0
  50. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/middleware/traceid.py +0 -0
  51. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/models/__init__.py +0 -0
  52. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/models/base_http.py +0 -0
  53. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/models/log.py +0 -0
  54. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/models/mqlistener_config.py +0 -0
  55. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/models/mqmsg_model.py +0 -0
  56. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/models/mqsend_config.py +0 -0
  57. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/models/sso_user.py +0 -0
  58. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/notice/__init__.py +0 -0
  59. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/notice/uvicorn_monitor.py +0 -0
  60. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
  61. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
  62. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
  63. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
  64. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
  65. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
  66. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/sentry/__init__.py +0 -0
  67. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/sentry/sy_sentry.py +0 -0
  68. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/services.py +0 -0
  69. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/sse/__init__.py +0 -0
  70. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/sse/event.py +0 -0
  71. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/sse/sse.py +0 -0
  72. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/synacos/__init__.py +0 -0
  73. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/synacos/example.py +0 -0
  74. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/synacos/example2.py +0 -0
  75. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/synacos/feign.py +0 -0
  76. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/synacos/feign_client.py +0 -0
  77. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/synacos/nacos_client_base.py +0 -0
  78. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/synacos/nacos_config_manager.py +0 -0
  79. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
  80. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/synacos/nacos_service.py +0 -0
  81. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
  82. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/synacos/nacos_service_registration.py +0 -0
  83. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/synacos/param.py +0 -0
  84. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/tests/test_email.py +0 -0
  85. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/tools/__init__.py +0 -0
  86. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/tools/docs.py +0 -0
  87. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/tools/env.py +0 -0
  88. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/tools/merge_headers.py +0 -0
  89. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/tools/snowflake.py +0 -0
  90. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/tools/syemail.py +0 -0
  91. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon/tools/timing.py +0 -0
  92. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon_python_lib.egg-info/SOURCES.txt +0 -0
  93. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
  94. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
  95. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon_python_lib.egg-info/requires.txt +0 -0
  96. {sycommon_python_lib-0.2.0b4 → sycommon_python_lib-0.2.0b6}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.0b4
3
+ Version: 0.2.0b6
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sycommon-python-lib"
3
- version = "0.2.0b4"
3
+ version = "0.2.0b6"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -354,37 +354,82 @@ class RabbitMQClient:
354
354
  async def _process_message_callback(self, message: AbstractIncomingMessage):
355
355
  """
356
356
  消息处理回调
357
+
358
+ 【架构原理】
359
+ 1. 优先尝试:
360
+ - 在子线程中构建完全独立的 asyncio 运行环境。
361
+ - XX.Semaphore 绑定到子线程 Loop,彻底隔离 CPU 压力。
362
+
363
+ 2. 自动降级【混合模式】:
364
+ - 如果捕获到 Loop 冲突错误,说明 XX 是顽固的主线程单例。
365
+ - 此时直接在主线程 await 执行,利用异步 I/O 特性保持心跳响应。
357
366
  """
367
+ msg_obj = None # 预声明防止 UnboundLocalError
368
+ trace_id = "unknown"
369
+
358
370
  try:
359
- # === 阶段 1: 消息解析与上下文设置 (在主线程执行) ===
360
- body_dict = json.loads(message.body.decode("utf-8"))
361
- msg_obj: MQMsgModel = MQMsgModel(**body_dict)
371
+ # === 阶段 1: 消息解析与 TraceId 准备 (主线程) ===
372
+ try:
373
+ body_dict = json.loads(message.body.decode("utf-8"))
374
+ msg_obj: MQMsgModel = MQMsgModel(**body_dict)
375
+ except Exception as e:
376
+ logger.error(f"❌ 消息解析失败: {str(e)}")
377
+ await message.ack() # 解析失败直接丢弃
378
+ return
362
379
 
363
380
  if not msg_obj.traceId:
364
381
  msg_obj.traceId = message.headers.get(
365
382
  "trace-id") if message.headers else SYLogger.get_trace_id()
366
383
 
367
- SYLogger.set_trace_id(msg_obj.traceId)
384
+ trace_id = msg_obj.traceId
385
+ SYLogger.set_trace_id(trace_id)
368
386
 
369
- # === 阶段 2: 业务逻辑执行 ===
387
+ # === 阶段 2: 智能执行 ===
370
388
  if self._message_handler:
371
- def run_job_with_context():
372
- # 【关键修复】在子线程内重新设置 TraceId
373
- SYLogger.set_trace_id(msg_obj.traceId)
374
389
 
375
- return asyncio.run(
376
- functools.partial(
377
- self._message_handler, msg_obj, message)()
378
- )
390
+ # --- 模式 A: 终极隔离方案 (默认首选) ---
391
+ def run_in_isolated_thread(current_trace_id):
392
+ # 【关键修复】通过参数传递 TraceId,防止闭包捕获导致并发 ID 错乱
393
+ SYLogger.set_trace_id(current_trace_id)
379
394
 
380
- await asyncio.to_thread(run_job_with_context)
395
+ try:
396
+ return asyncio.run(self._message_handler(msg_obj, message))
397
+ except Exception as e:
398
+ # 捕获异常并抛出,避免在子线程中崩溃导致主线程无法感知
399
+ raise e
400
+
401
+ try:
402
+ # 1. 扔进线程池执行 (主线程等待子线程完成)
403
+ await asyncio.to_thread(run_in_isolated_thread, trace_id)
404
+
405
+ except RuntimeError as e:
406
+ # --- 捕获特定错误,进入降级模式 ---
407
+ if "bound to a different event loop" in str(e):
408
+ logger.warning(
409
+ f"⚠️ 检测到跨 Loop 冲突 (TraceId: {trace_id}),"
410
+ f"自动切换至【混合模式】。业务逻辑将在主线程运行。"
411
+ )
412
+
413
+ # --- 模式 B: 混合模式 (降级方案) ---
414
+ # 既然 Semaphore 绑定了主 Loop,且必须保证流控 (Ack 在最后),
415
+ # 那么直接在主线程 await 执行是唯一正确的解法。
416
+ # 只要业务逻辑是异步 I/O,主线程会在 await 期间处理心跳。
417
+ await self._message_handler(msg_obj, message)
418
+
419
+ else:
420
+ # 其他 RuntimeError 直接抛出
421
+ raise
381
422
 
382
423
  # === 阶段 3: 消息确认 ===
424
+ # 只有代码执行到这里,说明业务已成功处理 (或已处理完异常)
425
+ # 此时 Ack 才能正确触发 MQ 的流控机制
383
426
  await message.ack()
384
427
 
385
428
  except Exception as e:
386
- logger.error(f"❌ 消息处理异常: {str(e)}", exc_info=True)
429
+ logger.error(
430
+ f"❌ 消息处理异常 (TraceId: {trace_id}): {str(e)}", exc_info=True)
387
431
  try:
432
+ # 即使异常也 Ack,避免死信循环(根据业务需求也可改为 Nack/Requeue)
388
433
  await message.ack()
389
434
  except Exception:
390
435
  pass
@@ -41,7 +41,7 @@ class RabbitMQCoreService:
41
41
  f"端口: {cls._config.get('port')}, "
42
42
  f"虚拟主机: {cls._config.get('virtual-host')}, "
43
43
  f"应用名: {cls._config.get('APP_NAME')}, "
44
- f"心跳: {cls._config.get('heartbeat', 30)}s"
44
+ f"心跳: {cls._config.get('heartbeat', 60)}s"
45
45
  )
46
46
  cls._is_shutdown = False
47
47
 
@@ -70,8 +70,8 @@ class RabbitMQCoreService:
70
70
  virtualhost=cls._config.get('virtual-host', "/"),
71
71
  app_name=cls._config.get("APP_NAME", ""),
72
72
  prefetch_count=global_prefetch_count,
73
- heartbeat=cls._config.get('heartbeat', 15),
74
- connection_timeout=cls._config.get('connection_timeout', 15),
73
+ heartbeat=cls._config.get('heartbeat', 60),
74
+ connection_timeout=cls._config.get('connection_timeout', 30),
75
75
  reconnect_interval=cls._config.get('reconnect_interval', 5),
76
76
  )
77
77
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.0b4
3
+ Version: 0.2.0b6
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown