В Києві останнім часом тривога триває постійно, з дуже короткими перервами.
Раніше треба було знати одне: є тривога чи нема. Зараз питання інше: що конкретно ця тривога означає для тебе. Де летить, що летить і чи летить воно до тебе.
Найкраще з інформуванням населення справляються моніторингові канали. Проте працювати з ними трохи незручно, бо пишуть вони текстом, їх декілька, і потрібні ментальні зусилля, аби намалювати мапу в себе в голові по цим повідомленням. У Києві доволі багато різних місцевостей, і яка з них де знаходиться, я, наприклад, не всі знаю.
Тому вирішив зробити сайт, який об'єднував би всі ці повідомлення і показував їх на карті. Так з'явився проєкт Дрони на районі. Спробуйте, логін не потрібен, можна дивитись саме на свій район і бачити загрози для нього та сусідів.
Пишу про нього з двох причин. По-перше, щоб ви спробували, подивились і дали фідбек як професіонали, які можуть якісно оцінити технічний продукт. Буду дуже вдячний. По-друге, в процесі було декілька цікавих інженерних та архітектурних рішень, якими варто поділитись, і на один пост вони, мабуть, не влізуть.
Сайт на Python і HTMX. Ідея була використати мінімум JavaScript, але затягнути його все ж довелось. Service worker, щоб сайт працював в офлайні і показував, що дані неактуальні. Плюс схематична мапа, без клієнтського коду вона не працює. Ставку зробив на серверну генерацію контенту, і HTMX з цим справляється чудово.
Задеплоєно на моєму домашньому сервері, тому самому, що на балконі. Поки є електрика, він буде там. Коли почнуться проблеми з доступністю, можна буде перенести кудись у датацентр.
Оскільки воно працює локально, питання економії ресурсів стоїть доволі актуально.
Тому сайт закритий за Cloudflare. Безкоштовного плану вистачає, щоб підняти тунель і налаштувати CDN та кешування. Завдяки кешу значна частина запитів до самого сервера не долітає.
Щоб сторінка оновлювалась сама, спочатку взяв WebSocket. Потім згадав, що є server-sent events, які більш оптимальні для односторонньої комунікації. Але є проблема — кожен клієнт це окреме зʼєднання. І коли їх багато, то це дефіцит ресурсів. Тому перейшов на звичайний polling, коли клієнт робить періодичні запити за таймером. Тоді вся робота перекладається на клієнтів, і в поєднанні з кешем на Cloudflare частина тих запитів до мого сервера не доходить зовсім.
Кешування стоїть на 20 секунд. Розрахунок був такий: навіть якщо туди ломануться 10-20 тисяч людей і будуть регулярно оновлювати, до мене дійде приблизно один запит за ті 20 секунд на кожен фрагмент, тобто на район, на мапу, на сторінку.
З моменту запуску, а це чотири дні, Cloudflare віддав мільйон запитів. Трохи більше половини з них пішло з кешу, решта долетіла до мене. Все працює, нічого не падає, тому план, можна сказати, доволі успішний.
Споживання ресурсів: 162 мегабайти памʼяті з дозволених 512 і біля 2% одного ядра. Пік, який я зловив, 47 відсотків, то було на якомусь шальному рендері мапи. Тобто місце для росту є.
Сподіваюсь, після цього поста користувачів стане більше і вдасться потестити в стресовіших умовах. Про проєкт писатиму й далі.
Напишіть у коменти, що не працює або чого там не вистачає. Мені зараз найцінніше саме це. Ну або поставте лайкос — це теж дуже в тему :)
Post #700
2.66K