MicrocosmWorksІнновації та архітектура цифрового космосу
Про насКонтакт
MicrocosmWorksІнновації та архітектура цифрового космосу

Надаємо IT-рішення, які мають значення. Ми захоплені технологіями, безпекою та допомогою бізнесу зростати завдяки надійній, інноваційній IT-інфраструктурі.

[email protected]
+91 7011868196
New Delhi, India

Центр зростання AI

AI HubІнновації для стартапівПрискорювач для підприємств

Рішення

Всі рішенняДодатки для здоров'я та фітнесуAI відео платформаРозробка AI агентів

Ресурси

ІнсайтиГалузеві ПосібникиШаблони ВикористанняАрхітектурні ШаблониКейси

Компанія

Про НасКонтактНаша Робота

Послуги

Цифровий КонсалтингХмарна ІнфраструктураРозробка SaaSРозробка AIВідео Технології
Розробка ERPНалаштування ZohoРозробка OdooІнтеграція SalesforceРозробка Користувацьких CRM
Інтеграція QuickBooksРішення IoTРозробка Блокчейну
Консалтинг з КібербезпекиІТ Підтримка - L3

© 2026 MicrocosmWorks. Усі права захищено.

Політика КонфіденційностіУмови Обслуговування
Назад до інсайтів
AI Development

Створення надійних систем push-сповіщень з урахуванням часових поясів

Розробка системи push-сповіщень, яка надійно спрацьовує в правильний місцевий час для кожного користувача.

Mayank Joshi.webpMayank Chandra Joshi
•
July 31, 2026
•
Оновлено August 29, 2026
•
5 min read
Untitled design (16).webp
5 min read

Створення надійної системи push-сповіщень з урахуванням часових поясів

Додаток для здоров'я та благополуччя потребував надсилання персоналізованих щоденних нагадувань — про їжу, перевірку настрою, підказки щодо гідратації, сигнали для сну та власні нагадування — тисячам користувачів по всьому світу. Заковика: кожне сповіщення мало надходити в правильний місцевий час, рівно один раз, і ніколи на неактивний пристрій. Ми розробили та побудували розподілений конвеєр, який це забезпечує.

 

Виклик

  • Коректність часового поясу в масштабі. "Нагадування про сніданок о 9 ранку" означає щось різне для кожного користувача. Відправлення за серверним часом надіслало б сповіщення комусь у Сіднеї о 3 ранку. Кожне сповіщення повинно було надходити в місцевий час користувача.
  • Без спаму, без дублювання. Планування cron-завдань неминуче призводить до перекриття та повторного запуску. Без суворих гарантій один користувач міг би отримати одне й те саме нагадування "час обіду 🥗" двічі або тричі — швидкий шлях до видалення програми.
  • Пристрої ненадійні. Користувачі видаляють додатки, відкликають дозволи та постійно змінюють push-токени. Відправлення сповіщень на застарілі токени наосліп витрачає ресурси та псує метрики доставки.
  • Точний час без планувальника "грубої сили". Доставка сотень сповіщень з точністю до хвилини — без cron-завдання, яке "довбає" базу даних кожні 60 секунд — вимагала розумнішого механізму, ніж наївне опитування.

 

Наше рішення

Ми побудували триетапний конвеєр, який чітко розділяє що надсилати, коли надсилати та власне надсилання — щоб кожен етап міг незалежно відмовляти та відновлюватися. База даних є джерелом істини, черга повідомлень обробляє точний час, а єдиний рівень воркера взаємодіє з провайдером push-повідомлень.

image.webp

 

Архітектура

  • Expo-notifications — це React Native клієнт з нативними каналами, унікальними звуками та глибокими посиланнями, який використовує єдиний формат токенів та API доставки для iOS та Android.
  • NestJS backend з expo-server-sdk як уніфікованою абстракцією push-повідомлень над FCM та APNs.
  • MongoDB як джерело істини — колекції NotificationMessage, NotificationToken та NotificationCounter.
  • Черги затримки ActiveMQ (STOMP), по одній для кожної категорії (їжа, настрій, активність, безпека, нагадування), для точної запланованої доставки.
  • Creator crons, що генерують записи сповіщень з урахуванням часових поясів для кожного користувача.
  • Consumer workers, які підписуються на кожну чергу та виконують остаточну перевірку перед відправкою.
  • AWS ECS Fargate, що запускає cron-завдання та споживачів; ActiveMQ на виділеному екземплярі EC2.

 

Ключові особливості

  1. Планування з урахуванням часових поясів. Використовуючи date-fns-tz, обчислюється місцевий час надсилання для кожного користувача, конвертується назад у UTC для зберігання та обмежується вікнами дат UTC, щоб гарантувати одне нагадування на день.
  2. Ідемпотентність, забезпечена базою даних. Частковий унікальний індекс для повідомлень у стані "очікування" унеможливлює створення дублікатів — навіть якщо cron запускається двічі:
// Унікальний лише поки повідомлення перебуває в стані PENDING і не видалене

schema.index(

  { userId: 1, notificationTokenId: 1, category: 1, label: 1, scheduledAt: 1 },

  { unique: true, partialFilterExpression: { status: 'pending', isDeleted: false } }

);

 

3. Точна доставка через черги затримки. Замість cron-завдання, що запускається щохвилини, планувальник ставить повідомлення в чергу зараз, але відкладає доставку до точної хвилини, використовуючи заголовок scheduled-delay в ActiveMQ:
 

client.send(`/queue/${queueName}`, {

  persistent: 'true',

  'AMQ_SCHEDULED_DELAY': String(delayMs), // доставлено точно в призначений час

}, JSON.stringify(message));

 

4. Один активний токен на пристрій. Частковий унікальний індекс гарантує наявність лише одного активного токена на пристрій; нові входи акуратно деактивують старий токен, з експоненційними відстрочками повторних спроб для виживання при одночасних входах.

5. Перевірка квитанцій + автоматичне очищення. Після відправлення ми опитуємо квитанції Expo. Відповідь DeviceNotRegistered негайно деактивує "мертвий" токен, щоб ми більше ніколи не витрачали на нього відправлення.

f (receipt.status === 'error' &&

    receipt.details?.error === 'DeviceNotRegistered') {

  await this.deactivateToken(token); // припинити надсилання на неактивні пристрої

}

 

6. Межа відмов. Кожен пристрій має лічильник повторних спроб; після 3 послідовних збоїв токен автоматично деактивується — без нескінченних циклів, без "зомбі" токенів.

7. Повага до намірів користувача під час відправлення. Переваги сповіщень повторно перевіряються споживачем під час доставки, а не лише під час планування — тому користувач, який відмовився за годину до нагадування, ніколи його не отримає. Повідомлення переходять у чесні кінцеві стани: success, failed або is_missed.

 

Результати

  • Кожен користувач отримує нагадування в правильний місцевий час, по всьому світу — нуль сповіщень у неробочий час.
  • Дубльовані сповіщення повністю усунені завдяки ідемпотентності на рівні бази даних.
  • "Мертві" та застарілі токени пристроїв виявляються та автоматично деактивуються, підтримуючи чистоту доставки.
  • Надійність підвищується, а навантаження на базу даних зменшується завдяки точній доставці з хвилинною точністю без планувальника "грубої сили".

 

Стек технологій

React Native · Expo Notifications · NestJS · TypeScript · MongoDB · ActiveMQ (STOMP) · expo-server-sdk · date-fns-tz · AWS ECS Fargate

Push-сповіщенняЧасові поясиПлануванняНадійність
Mayank Joshi.webp

Про автора

Mayank Chandra Joshi

AI & Cloud Solutions Expert at MicrocosmWorks

Building innovative AI-powered solutions and helping businesses transform through cutting-edge technology.

Бажаєте дізнатися більше?

Зв'яжіться з нами, щоб обговорити, як ми можемо допомогти впровадити ці рішення для вашого бізнесу.

Зв'яжіться з нами

Часті запитання

A timezone-aware notification system converts each user's local schedule into UTC before delivery, ensuring reminders arrive at the correct local time regardless of the user's location or daylight saving changes.

Database-level idempotency using unique indexes ensures each scheduled notification is created only once, even if scheduling jobs are retried or executed multiple times.

Delayed message queues deliver notifications at the exact scheduled time without constantly polling the database, improving delivery accuracy while reducing infrastructure load.

A reliable push notification system validates delivery receipts and automatically deactivates expired or unregistered device tokens, preventing failed notifications and improving delivery success rates.

A scalable push notification system combines timezone-aware scheduling, delayed message queues, idempotent database design, token lifecycle management, and delivery validation to ensure accurate and reliable notification delivery.

Comments (0)

Share your thoughts and join the conversation

Leave a Comment

Your email will not be published

No comments yet

Be the first to share your thoughts!