sycommon-python-lib 0.1.11__tar.gz → 0.1.12__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.

Potentially problematic release.


This version of sycommon-python-lib might be problematic. Click here for more details.

Files changed (54) hide show
  1. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/PKG-INFO +1 -1
  2. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/pyproject.toml +1 -1
  3. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/health/health_check.py +1 -1
  4. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/rabbitmq/rabbitmq_client.py +6 -18
  5. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/rabbitmq/rabbitmq_service.py +2 -3
  6. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/synacos/nacos_service.py +62 -5
  7. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon_python_lib.egg-info/PKG-INFO +1 -1
  8. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/README.md +0 -0
  9. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/setup.cfg +0 -0
  10. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/command/cli.py +0 -0
  11. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/__init__.py +0 -0
  12. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/config/Config.py +0 -0
  13. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/config/DatabaseConfig.py +0 -0
  14. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/config/EmbeddingConfig.py +0 -0
  15. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/config/LLMConfig.py +0 -0
  16. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/config/MQConfig.py +0 -0
  17. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/config/RerankerConfig.py +0 -0
  18. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/config/__init__.py +0 -0
  19. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/database/base_db_service.py +0 -0
  20. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/database/database_service.py +0 -0
  21. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/health/__init__.py +0 -0
  22. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/health/ping.py +0 -0
  23. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/logging/__init__.py +0 -0
  24. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/logging/kafka_log.py +0 -0
  25. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/logging/logger_wrapper.py +0 -0
  26. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/middleware/__init__.py +0 -0
  27. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/middleware/context.py +0 -0
  28. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/middleware/cors.py +0 -0
  29. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/middleware/docs.py +0 -0
  30. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/middleware/exception.py +0 -0
  31. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/middleware/middleware.py +0 -0
  32. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/middleware/monitor_memory.py +0 -0
  33. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/middleware/mq.py +0 -0
  34. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/middleware/timeout.py +0 -0
  35. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/middleware/traceid.py +0 -0
  36. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/models/__init__.py +0 -0
  37. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/models/base_http.py +0 -0
  38. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/models/log.py +0 -0
  39. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/models/mqlistener_config.py +0 -0
  40. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/models/mqmsg_model.py +0 -0
  41. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/models/mqsend_config.py +0 -0
  42. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/models/sso_user.py +0 -0
  43. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/services.py +0 -0
  44. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/synacos/__init__.py +0 -0
  45. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/synacos/feign.py +0 -0
  46. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/tools/__init__.py +0 -0
  47. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/tools/docs.py +0 -0
  48. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/tools/snowflake.py +0 -0
  49. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon/tools/timing.py +0 -0
  50. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon_python_lib.egg-info/SOURCES.txt +0 -0
  51. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
  52. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
  53. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/src/sycommon_python_lib.egg-info/requires.txt +0 -0
  54. {sycommon_python_lib-0.1.11 → sycommon_python_lib-0.1.12}/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.1.11
3
+ Version: 0.1.12
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sycommon-python-lib"
3
- version = "0.1.11"
3
+ version = "0.1.12"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -6,7 +6,7 @@ def setup_health_handler(app: FastAPI):
6
6
 
7
7
  @health_router.get("/actuator/health")
8
8
  async def health_check():
9
- """返回应用的健康状态"""
9
+ """实现 Nacos 健康检查接口"""
10
10
  return {
11
11
  "status": "UP",
12
12
  "groups": ["liveness", "readiness"]
@@ -47,10 +47,9 @@ class RabbitMQClient:
47
47
  app_name: str = "",
48
48
  reconnection_delay: int = 1,
49
49
  max_reconnection_attempts: int = 5,
50
- heartbeat: int = 60,
50
+ heartbeat: int = 10,
51
51
  prefetch_count: int = 2,
52
- message_process_timeout: int = 30,
53
- consumption_stall_threshold: int = 120
52
+ consumption_stall_threshold: int = 10
54
53
  ):
55
54
  """
56
55
  初始化RabbitMQ客户端,支持集群多节点配置
@@ -75,7 +74,6 @@ class RabbitMQClient:
75
74
  :param max_reconnection_attempts: 最大重连尝试次数
76
75
  :param heartbeat: 心跳间隔(秒)
77
76
  :param prefetch_count: 预取消息数量
78
- :param message_process_timeout: 消息处理超时时间(秒)
79
77
  :param consumption_stall_threshold: 消费停滞检测阈值(秒)
80
78
  """
81
79
  # 连接参数 - 支持多主机
@@ -109,7 +107,6 @@ class RabbitMQClient:
109
107
  self.heartbeat = heartbeat
110
108
 
111
109
  # 消息处理参数
112
- self.message_process_timeout = message_process_timeout
113
110
  self.consumption_stall_threshold = consumption_stall_threshold
114
111
 
115
112
  # 连接和通道对象
@@ -263,6 +260,7 @@ class RabbitMQClient:
263
260
  password=self.password,
264
261
  virtualhost=self.virtualhost,
265
262
  heartbeat=self.heartbeat,
263
+ loop=asyncio.get_event_loop(),
266
264
  client_properties={
267
265
  "connection_name": f"{self.app_name}@{host}"
268
266
  }
@@ -477,10 +475,11 @@ class RabbitMQClient:
477
475
  if self._is_consuming:
478
476
  current_time = asyncio.get_event_loop().time()
479
477
  if current_time - self._last_message_processed > self.consumption_stall_threshold:
480
- logger.warning(
481
- f"检测到消费停滞超过 {self.consumption_stall_threshold} 秒 (主机: {self._active_host}),将重启消费者")
478
+ # logger.warning(
479
+ # f"检测到消费停滞超过 {self.consumption_stall_threshold} 秒 (主机: {self._active_host}),将重启消费者")
482
480
  if self._is_consuming and self.message_handler:
483
481
  await self.stop_consuming()
482
+ await asyncio.sleep(1)
484
483
  await self.start_consuming()
485
484
  logger.info("消费者已重启以恢复消费")
486
485
  except Exception as e:
@@ -832,17 +831,6 @@ class RabbitMQClient:
832
831
  # 解析消息
833
832
  parsed_data = await self._parse_message(message)
834
833
 
835
- # 消息处理超时控制
836
- # try:
837
- # await asyncio.wait_for(
838
- # self.message_handler(MQMsgModel(**parsed_data), message),
839
- # timeout=self.message_process_timeout
840
- # )
841
- # except asyncio.TimeoutError:
842
- # logger.error(
843
- # f"消息 {message_id} 处理超时(超过 {self.message_process_timeout} 秒)(主机: {self._active_host})")
844
- # await message.ack() # 超时也确认,避免无限重试
845
- # return
846
834
  await self.message_handler(MQMsgModel(**parsed_data), message)
847
835
 
848
836
  # 处理成功,确认消息
@@ -129,11 +129,10 @@ class RabbitMQService:
129
129
  reconnection_delay=kwargs.get('reconnection_delay', 1),
130
130
  max_reconnection_attempts=kwargs.get(
131
131
  'max_reconnection_attempts', 5),
132
- heartbeat=kwargs.get('heartbeat', 60),
132
+ heartbeat=kwargs.get('heartbeat', 10),
133
133
  prefetch_count=kwargs.get('prefetch_count', 2),
134
- message_process_timeout=kwargs.get('message_process_timeout', 30),
135
134
  consumption_stall_threshold=kwargs.get(
136
- 'consumption_stall_threshold', 120)
135
+ 'consumption_stall_threshold', 10)
137
136
  )
138
137
 
139
138
  @classmethod
@@ -66,6 +66,10 @@ class NacosService(metaclass=SingletonMeta):
66
66
  self.real_ip = self.get_service_ip(self.host)
67
67
  self._long_term_retry_count = 0 # 长期重试计数器
68
68
 
69
+ # 轮询索引,用于在所有实例中进行轮询选择
70
+ self._round_robin_index = 0
71
+ self._round_robin_lock = threading.Lock() # 保护轮询索引的线程安全
72
+
69
73
  if self.enable_register_nacos:
70
74
  # 初始化客户端(仅在首次调用时执行)
71
75
  self._initialize_client()
@@ -361,7 +365,12 @@ class NacosService(metaclass=SingletonMeta):
361
365
  self.registered = False
362
366
  SYLogger.warning("nacos:本地状态显示已注册,但Nacos中未找到服务实例,准备重新注册")
363
367
 
364
- metadata = {"ignore-metrics": "true"}
368
+ metadata = {
369
+ "ignore-metrics": "true",
370
+ "preserved.heart.beat.interval": "3000", # 心跳间隔 3 秒
371
+ "preserved.heart.beat.timeout": "15000", # 心跳超时 15 秒
372
+ "preserved.ip.delete.timeout": "30000" # 实例删除超时 30 秒
373
+ }
365
374
  if self.version:
366
375
  metadata["version"] = self.version
367
376
 
@@ -731,8 +740,13 @@ class NacosService(metaclass=SingletonMeta):
731
740
 
732
741
  return self.get_service_instances(service_name, group, version)
733
742
 
734
- def get_service_instances(self, service_name: str, group: str = "DEFAULT_GROUP", version: str = None) -> List[Dict]:
735
- """获取服务实例列表"""
743
+ def get_service_instances(self, service_name: str, group: str = "DEFAULT_GROUP", target_version: str = None) -> List[Dict]:
744
+ """
745
+ 获取服务实例列表,并按照以下优先级规则筛选:
746
+ 1. 相同版本号的实例
747
+ 2. 无版本号的实例
748
+ 3. 所有实例中轮询
749
+ """
736
750
  try:
737
751
  namespace_id = self.nacos_config['namespaceId']
738
752
  instances = self.nacos_client.list_naming_instance(
@@ -741,13 +755,56 @@ class NacosService(metaclass=SingletonMeta):
741
755
  group_name=group,
742
756
  healthy_only=True,
743
757
  )
758
+
744
759
  if not instances or 'hosts' not in instances:
760
+ SYLogger.info(f"nacos:未发现 {service_name} 的服务实例")
745
761
  return []
746
762
 
763
+ all_instances = instances.get('hosts', [])
747
764
  SYLogger.info(
748
- f"nacos:发现 {len(instances.get('hosts', []))} 个 {service_name} 服务实例")
765
+ f"nacos:共发现 {len(all_instances)} 个 {service_name} 服务实例")
766
+
767
+ # 确定要使用的目标版本,如果未指定则使用当前服务的版本
768
+ version_to_use = target_version or self.version
769
+
770
+ # 按规则筛选实例
771
+ if version_to_use:
772
+ # 1. 筛选相同版本号的实例
773
+ same_version_instances = [
774
+ instance for instance in all_instances
775
+ if instance.get('metadata', {}).get('version') == version_to_use
776
+ ]
777
+
778
+ if same_version_instances:
779
+ SYLogger.info(
780
+ f"nacos:筛选出 {len(same_version_instances)} 个与当前版本({version_to_use})匹配的实例")
781
+ return same_version_instances
782
+
783
+ # 2. 如果没有相同版本的实例,筛选无版本号的实例
784
+ no_version_instances = [
785
+ instance for instance in all_instances
786
+ if 'version' not in instance.get('metadata', {})
787
+ ]
788
+
789
+ if no_version_instances:
790
+ SYLogger.info(
791
+ f"nacos:未找到相同版本({version_to_use})的实例,筛选出 {len(no_version_instances)} 个无版本号的实例")
792
+ return no_version_instances
793
+
794
+ # 3. 如果没有指定版本或前两个规则都不满足,使用轮询方式选择所有健康实例
795
+ SYLogger.info(
796
+ f"nacos:使用轮询方式从 {len(all_instances)} 个实例中选择")
797
+
798
+ # 线程安全地获取下一个轮询索引
799
+ with self._round_robin_lock:
800
+ selected_index = self._round_robin_index % len(all_instances)
801
+ # 更新轮询索引,为下一次请求做准备
802
+ self._round_robin_index = (
803
+ selected_index + 1) % len(all_instances)
804
+
805
+ # 返回包含当前选中实例的列表
806
+ return [all_instances[selected_index]]
749
807
 
750
- return instances.get('hosts', [])
751
808
  except Exception as e:
752
809
  SYLogger.error(f"nacos:服务发现失败: {service_name}: {str(e)}")
753
810
  return []
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.1.11
3
+ Version: 0.1.12
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown