Проблема дублирования записей в MongoDB при update_one и upsert при высоком трафике
В настоящее время я столкнулся с проблемой в моем приложении Django
, интегрированном с MongoDB
, особенно при работе с большим трафиком и одновременными пользователями. Несмотря на использование update_one
с upsert
, я наблюдаю случаи, когда в таких условиях периодически создаются двойные (иногда тройные) записи.
Ниже приведен упрощенный пример фрагмента кода, который я использую:
from pymongo import MongoClient
from rest_framework.views import APIView
from rest_framework import status
from rest_framework.response import Response
from django.conf import settings
# MongoDB connection setup
client = MongoClient(settings.MONGO_CONNECTION_URL)
db = client[settings.DATABASE_NAME]
collection = db[settings.COLLECTION_NAME]
class UserDataView(APIView):
def post(self, request) -> Response:
try:
# Using update_one with upsert to handle user data updates
collection.update_one(
{'user_id': request.user.pk},
{'$set': {'data': request.data["data"]}},
upsert=True
)
# Returning a successful response with a data-related message
return Response(
{'message': 'User data successfully updated or created'},
status=status.HTTP_200_OK
)
except KeyError as e:
# Logging and handling potential errors
logger.error(e)
# Returning a response for a bad request with a data-related message
return Response(
{'message': 'Bad request. Please provide the required data'},
status=status.HTTP_400_BAD_REQUEST
)
Даже при использовании опции upsert=True
спорадически создаются дубликаты записей, и, похоже, это происходит в периоды высокого трафика и одновременной активности пользователей.
Я убедился, что user_id
правильно установлен в качестве уникального идентификатора, и в журналах MongoDB нет видимых ошибок. Такое поведение сложно воспроизвести, что затрудняет выявление первопричины.
Есть ли какие-либо соображения или лучшие практики, о которых я должен знать при использовании update_one
с upsert
в сценариях с высоким трафиком и одновременными пользователями? Любые соображения о том, как решить эту проблему или устранить неполадки, будут высоко оценены.