Михаил!

Мы взяли готовый сервис — NiftyImages. Со временем хотим перейти на самописный, потому что NiftyImages медленно отдаёт картинки и стоит $250 в месяц.

Чтобы написать свой, мы разобрались, как устроены таймеры в NiftyImages. Таймер — это гифка, которая генерируется при каждом запросе к ней:

В каждом таймере — 35 кадров. Дедлайн отсчёта задаётся юникс‑таймом в часовом поясе Москвы, поэтому таймер не ломается при смене часовых поясов у клиента

Чтобы гифка обновлялась, её отдают с явно выключенным кешированием:

GET https://img1.niftyimages.com/...?dt=...&format=epoch

cache-control: no-cache, no-store
expires: -1
pragma: no-cache

В результате при каждом открытии письма почтовая программа заново запрашивает картинку с таймером, сервис генерирует новую её версию, клиент видит новый счётчик.

Самая большая сложность — производительность. Генерация каждой гифки занимает примерно 350 мс. Если не предусмотреть кеширование и ограничения по количеству одновременных запросов, легко заддосить сервис пачкой параллельных запросов.

P. S. Это был совет о веб‑разработке. Хотите знать всё о коде, тестах, фронтенд‑разработке, цеэсэсе, яваскрипте, рельсах и джейде? Присылайте вопросы.

Веб‑разработка
Отправить
Поделиться
Запинить

Комментарии

Для маленьких рассылок могу порекомендовать сервис www.sendtric.com

Он бесплатный, но можно поменять только цвет текста и фона.

5 авг 2021

Можно попробовать сделать свой сервис — это вроде не очень сложно и дорого в поддержке. Кроме того, он должен быть быстрее в работе. Вот план:

Этап генерации:

  1. Локально при помощи любого инструмента для управления браузером снимаем скриншот на каждую секунду. Получилось 86 400 кадров.

  2. Из получившихся кадров склеиваем 86 400 гиф файлов по 35 кадров, на каждую секунду.

Этап отправки в хранилище:
3. Отправить гиф файлы в AWS S3. Цены на хранение такого количества файлов и передачу должны быть совсем крошечными.

Принцип работы:
4. AWS S3 сейчас поддерживает AWS Lambda — это значит, что запрос можно обработать перед отдачей результата. Отдаём так необходимую гиф.

Этап генерации, конечно, можно делать не локально, а где нибудь на сервере.

Я кратко посмотрел, можно ли из HTTP запроса вытащить информацию о таймзоне: вроде нет, там всегда по UTC +0. Но, с другой стороны, тогда и завершение события (например, скидки) можно планировать по UTC +0, и этой проблемы не будет.

9 авг 2021

Рекомендуем другие советы