← Назад к вопросам

Как производились уведомления

2.0 Middle🔥 121 комментариев
#Другое

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Как производились уведомления на прошлой работе

Этот вопрос задают для понимания вашего опыта с системами уведомлений, инструментами коммуникации и тем, как вы работали над функциями в реальных проектах. Интервьюер хочет узнать о технической реализации и вашем вкладе в систему.

Что работодатель хочет узнать

  1. Технический стек — какие технологии использовались
  2. Масштаб — сколько уведомлений обрабатывалось
  3. Надёжность — как обеспечивалась доставка
  4. Ваша роль — что именно вы делали
  5. Проблемы и решения — какие сложности встретили
  6. Best practices — понимание современных подходов

Пример хорошего ответа (вариант 1: Email уведомления)

"В моей компании мы использовали систему Email уведомлений для оповещения пользователей о важных событиях. Вот как она была организована:

Архитектура:

  • Django REST API на backend'е
  • Celery для асинхронной обработки задач
  • RabbitMQ как message broker
  • SMTP сервер SendGrid для отправки писем

Мой вклад:

  • Разработал сервис отправки уведомлений на Django
  • Создал Celery task для асинхронной отправки (чтобы не блокировала основной поток)
  • Реализовал retry логику — если первая попытка не прошла, повторяем через 5 минут (максимум 3 раза)
  • Добавил логирование всех попыток отправки для отладки
@shared_task(bind=True, max_retries=3)
def send_email_notification(self, user_id, event_type):
    try:
        user = User.objects.get(id=user_id)
        subject, message = generate_email_content(event_type)
        
        send_email(
            recipient=user.email,
            subject=subject,
            message=message
        )
        
        # Логируем успешную отправку
        NotificationLog.objects.create(
            user=user,
            type='email',
            status='sent'
        )
    except Exception as exc:
        # Retry через 5 минут
        raise self.retry(exc=exc, countdown=300)

Результаты:

  • Система обрабатывала ~50K писем в день
  • Rate доставки был 98% (2% bounce из-за неверных адресов)
  • Среднее время доставки: 2-5 минут

Вызовы и решения:

  • Проблема: SendGrid часто rate-limit'ил нас. Решение: добавили очередь с обработкой по 100 писем в минуту
  • Проблема: некоторые письма попадали в spam. Решение: отрегулировали DKIM, SPF, DMARC
  • Проблема: без отслеживания было сложно понять, получили ли письмо. Решение: добавили tracking pixel и вебhook обработку от SendGrid "

Пример хорошего ответа (вариант 2: Push уведомления)

"В нашем мобильном приложении мы использовали Firebase Cloud Messaging (FCM) для push уведомлений.

Архитектура:

  • Java Spring Boot backend
  • Firebase Cloud Messaging для доставки push
  • Database хранит FCM токены устройств
  • Kafka для очереди уведомлений (высоконагруженная система)

Мой вклад:

  • Разработал REST API endpoint /api/v1/notifications для отправки push
  • Реализовал Producer для отправки событий в Kafka
  • Написал Consumer для обработки из Kafka и вызова FCM
  • Добавил deadletter queue для неудачных доставок
  • Реализовал retry логику с экспоненциальной задержкой
@Service
public class NotificationService {
    @Autowired
    private KafkaTemplate<String, NotificationEvent> kafkaTemplate;
    @Autowired
    private FirebaseMessaging firebaseMessaging;
    
    public void sendPushNotification(String userId, String title, String body) {
        NotificationEvent event = new NotificationEvent(
            userId, title, body, System.currentTimeMillis()
        );
        // Отправляем в Kafka для асинхронной обработки
        kafkaTemplate.send("notifications-topic", event);
    }
    
    @KafkaListener(topics = "notifications-topic")
    public void processPushNotification(NotificationEvent event) {
        try {
            String fcmToken = getUserFcmToken(event.getUserId());
            Message message = Message.builder()
                .setToken(fcmToken)
                .putData("title", event.getTitle())
                .putData("body", event.getBody())
                .build();
            
            firebaseMessaging.send(message);
            logSuccessful(event);
        } catch (Exception e) {
            // На неудачу отправляем в deadletter queue
            kafkaTemplate.send("notifications-dead-letter", event);
        }
    }
}

Метрики:

  • 200K+ push уведомлений в день
  • Delivery rate: 95% (5% не доставились из-за удаления приложения)
  • P99 latency: 500ms

Вызовы:

  • Проблема: FCM имеет rate limit 500 запросов в секунду на наш проект. Решение: батчили уведомления и использовали Kafka throttling
  • Проблема: старые FCM токены становились невалидными. Решение: обновляли токены в клиент-приложении и слушали ошибки от FCM "

Пример хорошего ответа (вариант 3: SMS уведомления)

"Для критичных уведомлений мы использовали SMS через Twilio.

Система:

  • Node.js backend
  • Twilio SDK для отправки SMS
  • Database для хранения templates и логов
  • Мониторинг доставки через Twilio webhooks

Мой вклад:

  • Создал сервис отправки SMS с rate limiting (максимум 1000 в минуту)
  • Реализовал шаблонизацию SMS ("Ваш код подтверждения: {code}")
  • Добавил tracking — логирование статуса доставки
  • Реализовал webhook обработчик для получения статуса от Twilio
const twilio = require('twilio');

class SMSService {
    constructor() {
        this.client = twilio(accountSid, authToken);
        this.sendQueue = new Queue({ maxConcurrent: 1000 });
    }
    
    async sendSMS(phoneNumber, templateName, variables) {
        const message = this.renderTemplate(templateName, variables);
        
        const result = await this.client.messages.create({
            body: message,
            from: 'MY_TWILIO_PHONE',
            to: phoneNumber
        });
        
        // Логируем отправку
        await SMSLog.create({
            phoneNumber,
            templateName,
            status: 'sent',
            twilio_sid: result.sid
        });
        
        return result.sid;
    }
    
    async handleTwilioWebhook(req, res) {
        // Получаем статус доставки от Twilio
        const { MessageSid, MessageStatus } = req.body;
        
        await SMSLog.updateOne(
            { twilio_sid: MessageSid },
            { status: MessageStatus }
        );
        
        res.sendStatus(200);
    }
}

Результаты:

  • 10K+ SMS в день
  • Доставка за 10-30 секунд
  • Стоимость: 0.05$ за SMS "

Пример хорошего ответа (вариант 4: In-app уведомления)

"В приложении мы использовали WebSocket для real-time in-app уведомлений.

Архитектура:

  • Java Spring Boot с Spring WebSocket
  • Redis для хранения активных соединений
  • Message broker для pub/sub

Реализация:

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(notificationHandler(), "/ws/notifications")
            .setAllowedOrigins("*")
            .withSockJS();
    }
    
    @Bean
    public WebSocketHandler notificationHandler() {
        return new NotificationWebSocketHandler();
    }
}

@Service
public class NotificationWebSocketHandler extends TextWebSocketHandler {
    @Autowired
    private RedisTemplate<String, String> redisTemplate;
    
    private Map<String, WebSocketSession> sessions = new ConcurrentHashMap<>();
    
    @Override
    public void afterConnectionEstablished(WebSocketSession session) {
        String userId = extractUserId(session);
        sessions.put(userId, session);
        // Сохраняем активное соединение в Redis
        redisTemplate.opsForSet().add("active_users", userId);
    }
    
    public void sendNotification(String userId, String message) {
        WebSocketSession session = sessions.get(userId);
        if (session != null && session.isOpen()) {
            session.sendMessage(new TextMessage(message));
        }
    }
}

Преимущества:

  • Real-time доставка (< 100ms)
  • Нет задержек благодаря WebSocket
  • Экономим на отправке (локальная сеть) "

Частые ошибки в ответе

Ошибка 1: Слишком общее описание

❌ "Мы отправляли уведомления пользователям. Это было с помощью email."

Исправление

✅ "Мы использовали Django + Celery для отправки email уведомлений. Система обрабатывала 50K писем в день с 98% delivery rate."

Ошибка 2: Нет деталей о технологии

❌ "Мы просто отправляли уведомления через какой-то сервис."

Исправление

✅ "Мы использовали Firebase Cloud Messaging для push, Twilio для SMS и SendGrid для email. Обрабатывали через Kafka для асинхронности."

Ошибка 3: Нет упоминания вызовов

❌ "Всё работало идеально."

Исправление

✅ "Столкнулись с rate limiting и spam issues. Решили это через батчинг и настройкой SPF/DKIM."

Что подготовить

Перед ответом обдумайте:

  1. Технический стек — какие инструменты использовались
  2. Масштаб — цифры: тысячи/миллионы уведомлений в день
  3. Архитектура — как организована система (синхронно/асинхронно)
  4. Ваша роль — что именно вы реализовали
  5. Вызовы — какие проблемы встретили и как решили
  6. Результаты — метрики: delivery rate, latency, cost
  7. Code snippet — готовьте небольшой пример кода

Следующие вопросы

После вашего ответа могут спросить:

  • "Как вы обеспечивали надёжность доставки?"
  • "Как масштабировать систему на миллионы уведомлений?"
  • "Как отслеживать failed уведомления?"
  • "Какой retry strategy вы использовали?"
  • "Как вы тестировали систему уведомлений?"

Подготовьте ответы на эти вопросы.

Заключение

Хороший ответ на этот вопрос должен содержать:

  • Конкретный стек технологий
  • Архитектурное описание
  • Ваш вклад и ответственность
  • Вызовы и их решения
  • Метрики и результаты
  • Code примеры (если возможно)

Это демонстрирует, что вы работали над реальными системами и понимаете complexities notifications at scale.

Как производились уведомления | PrepBro