处理MongoDB或Elasticsearch的网络连接问题(装饰器代码,可直接使用)

在处理MongoDB和Elasticsearch的连接问题时,你需要捕获更广泛的异常,并在异常发生时重新初始化连接。

以下是如何扩展代码以处理连接问题:

  1. 为MongoDB和Elasticsearch定义重新连接的函数
def connect_mongo():
    return MongoClient('localhost', 27017)

def connect_elasticsearch():
    return Elasticsearch(hosts=["localhost:9200"])
  1. 修改重试装饰器以处理连接异常

我们需要修改之前的重试装饰器,以便当连接异常发生时,它可以尝试重新连接。

from pymongo.errors import NetworkTimeout, ServerSelectionTimeoutError
from elasticsearch.exceptions import ConnectionTimeout
from pymongo.errors import ConnectionFailure
from elasticsearch.exceptions import ConnectionError
import time
from functools import wraps

def retry_on_failure(retries=3, delay=5):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            global client, es  # 假设你之前的Mongo和ES客户端变量分别叫client和es
            for _ in range(retries):
                try:
                    return func(*args, **kwargs)
                except (NetworkTimeout, ServerSelectionTimeoutError, ConnectionTimeout) as e:
                    print(f"Network error: {e}. Retrying in {delay} seconds...")
                    time.sleep(delay)
                except (ConnectionFailure, ConnectionError) as e:
                    print(f"Connection error: {e}. Reconnecting and then retrying...")
                    if isinstance(e, ConnectionFailure):
                        client = connect_mongo()
                    elif isinstance(e, ConnectionError):
                        es = connect_elasticsearch()
                    time.sleep(delay)
            raise Exception(f"Failed after {retries} retries.")
        return wrapper
    return decorator
  1. 使用该装饰器装饰你的函数
@retry_on_failure(retries=5, delay=10)
def get_latest_oplog_entry():
    ...
    
@retry_on_failure(retries=5, delay=10)
def query_elasticsearch_by_id(document_id):
    ...

现在,当MongoDB或Elasticsearch的连接异常发生时,代码会尝试重新连接,然后继续重试操作。这提供了一个更鲁棒的解决方案,即使数据库服务器或网络遭受短暂的中断,你的代码仍然可以恢复并继续工作。

你可能感兴趣的:(Python,mongodb,es,mongodb,elasticsearch,jenkins)