Опишите ключевые компоненты архитектуры для реферальной системы.

«Опишите ключевые компоненты архитектуры для реферальной системы.» — вопрос из категории Архитектура, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Архитектура реферальной системы строится вокруг отслеживания приглашений и начисления вознаграждений. Ключевые компоненты включают модели данных, бизнес-логику и API.

1. Модели данных (Схема БД)

Основа системы — правильная структура данных. Пример для Django-подобного ORM:

from django.db import models

class User(models.Model):
    # ... другие поля пользователя
    username = models.CharField(max_length=150, unique=True)

    # Уникальный код, который пользователь передает другим
    referral_code = models.CharField(max_length=12, unique=True, blank=True)

    # Пользователь, который пригласил данного юзера (может быть пустым)
    referred_by = models.ForeignKey(
        'self', 
        on_delete=models.SET_NULL, 
        null=True, 
        blank=True
    )

class ReferralEvent(models.Model):
    # Модель для отслеживания событий и начисления бонусов
    referrer = models.ForeignKey(User, related_name='given_referrals', on_delete=models.CASCADE)
    referee = models.ForeignKey(User, related_name='received_referral', on_delete=models.CASCADE)
    event_type = models.CharField(max_length=50) # например, 'registration', 'first_purchase'
    reward_granted = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)

2. Бизнес-логика

  • Генерация реферального кода: Уникальный код создается для каждого пользователя при регистрации (например, с помощью post_save сигнала или в методе save).
  • Применение кода: Новый пользователь вводит код при регистрации. Система находит владельца кода и устанавливает связь referred_by.
  • Начисление бонусов: Логика начисления должна быть асинхронной, чтобы не замедлять основные процессы. При совершении целевого действия (например, первая покупка) создается фоновая задача (Celery, RQ), которая проверяет условия и начисляет бонус.

3. API Endpoints

  • GET /api/referral/stats/ — получение статистики по своим рефералам (количество, заработок).
  • POST /api/register/ — эндпоинт регистрации, принимающий опциональное поле referral_code.

4. Масштабируемость и безопасность

  • Асинхронные задачи: Используйте Celery или RabbitMQ для обработки начислений, чтобы избежать блокировок.
  • Кэширование: Статистику и данные, которые часто запрашиваются, следует кэшировать (например, в Redis).
  • Защита от фрода (Fraud Detection): Это критически важный аспект. Необходимо внедрить механизмы для предотвращения злоупотреблений: лимиты на количество рефералов, анализ IP-адресов, device fingerprinting.