Високопродуктивний long polling чат

Все було чудово, поки одного разу розробник чату відмовився його підтримувати у зв'язку з високим навантаженням. З цього моменту почалися пошуки альтернативних чат-систем…
Вибір технології
Багато хто скаже, що зараз уже ніхто не використовує старі браузери типу Опера12 або ІЕ8, однак таких людей поки що досить багато, тому вирішено було вибрати самеLong Polling.
Спочатку сайт був розміщений на Shared hosting, через що був величезний ряд обмежень. Тим не менш, хостинг справлявся із навантаженням. Це тішило. І єдиною можливою реалізацією чату був long polling на PHP.
Реалізація
Від слів до справи

Принцип зрозумілий та простий. Аяксом надсилається запит на сервер, який зчитує повідомлення. Тривалість запиту, а точніше відповідь від сервера залежить від того, чи додав хтось повідомлення. Тобто після запиту запускається цикл, який перевіряє, чи немає нових повідомлень, і якщо є нове повідомлення — цикл переривається, повертається відповідь з новим повідомленням. Після отримання відповіді, запит повторюється. І так далі.
Реалізувати таку штуку на PHP простіше нема куди. Я витратив на реалізацію в сумі близько 3-х годин свого життя.
Проте залишив його на стадії MVP (Minimum viable product). І, як виявилося, не дарма. При тестуванні функціоналу на продакшн сайт просто падав. Оперативка заповнювалась протягом 1-2 хвилин і гасила сервер.
Подумавши трохи, я вирішив, що справа на сервері. І згодом сайт був перенесений на VPS. Скажу одночасно, що зміна слабка, і оперативної пам'яті всього 1Гб. Тим не менш, наVPS чат тримався 3-4хвилини. Вже краще.
У результаті після тривалих розкопок інтернету я зрозумів, що писати чат на PHP — безглуздо, якщо навантаження на нього буде більше, ніж 10 людей.
Залишилось 2 варіанти:
- Ставити nodeJS та писати чат на веб-сокетах
- Писати сервіс на чомусь іншому

Скомпілювавши програму на win, я перевірив функціонал локально. Все працювало як годинник. Тим не менш, це був простий exe-шник і хотілося щось більше написати нормальний сервіс типу apache. Lazarus це вам не Delphi, хоч і дуже схожий. По-перше, він безкоштовний, що автоматично викликає підозру щодо якості продукту. А по-друге, ... втім як і по-третє і ще н-ное кількість - всі незручності пов'язані з цим. Більшість питань на форумі Лазаруса так і залишаються без відповіді. Це дуже сумно. Так само як і налагодження програми з помилкою, що вискакує типу «uncatchable error». Але, на щастя після закінчення тижневого терміну - я завершив аналог того функціоналу, який був написаний на PHP за 3 години.
Задоволений як слон, я вирішив зібрати додаток налінуксі. Залогінившись під root на сервер і виконавши команду apt-get-install lazarus - я швидко поставив лазаря, скопіював вихідні коди і, за допомогою відритих раніше в інтернеті команд lazbuild -r project.lpi, скомпілював додаток. Це був єдиний, справді найвдаліший і найшвидший етап.
Перевіривши роботу чату вже на реальному навантаженні, я зрозумів, що мою ідею виправдали. Чат працював, навантаження на сервер збільшилося не набагато. Це тішило. Тепер я міг повернутися на вінду і продовжити роботу над покращеною версією – сервіс (daemon). Як і слід було чекати, на вінді все вийшло, хоч і з невеликою затримкою в часі.

На лінуксі проект не скупився. При компіляції видавалася помилка у тому, що знайдено юнітInterfaces. Це було дуже дивно. На форумі лазаря виразної відповіді так і не з'явилося. Багато хто лише писав про те, що при перевстановленні все запрацювало. Проте переустановка не допомагала. Зрештою я зрозумів, що моя версія лазаря відрізняється від тієї, що стоїть на лінуксі. Оновити репозиторій не вдалося. Точніше репозиторій оновився, а ось лазар так і лишився колишньої версії.
Тоді я спробував завантажити інсталяційний пакет за допомогою wget. В результаті вийшла помилка 177 (точний номер вже не пам'ятаю). Після чергового виплеску емоцій я зрозумів, що проблема в якомусь символі на засланні. Я перелив інсталяційний пакет на MS OneDrive та створив коротке посилання, після чого успішно скачав файл.
Далі я видалив старий лазарус і поставив нову версію. І як ви вважаєте, що повідомив компілятор? Звичайно ж! Незрозумілі помилки!
Спираючись на минулий гіркий досвід із пошуком відповідей в інтернеті, я почав вивчати конфіги лазаря. Проблема виявилася простою — при встановленні лазарус чомусь не створив нову папку з конфігами.Татко залишився від попередньої версії, хоча я видаляв старий лазарус за допомогою apt-get remove --purge. Що ж, я забекапил старі конфіги, видалив папку і знову спробував перекомпілити Lazarus IDE. Магічно, після цього папка з конфігами створилася і я зміг нарешті скомпілювати даймон для лінукс.
Перемога! Чи ні?

Як і слід було очікувати, простий скрипт для створення запису в service start… не спрацював. Більше того, я знову ж таки знайшов пости на форумі з моєю проблемою без відповіді.
Поколупав ще годинку інтернет, я знайшов як можна запустити сервіс за допомогоюstart-stop-daemon. У результаті я зрозумів, що код скрипта запуску, який виклали в прикладах лазаруса, працює, але тільки якщо запускати його з терміналу. Інакше він видавав щось на кшталт «не знайдено якийсь файл».
Ви можете допомогти і перевести небагато коштів на розвиток сайту