8 November 2010

Сервер подсчета кликов

High performance
Если ваш проект использует подсчет кликов и на нем есть какая-либо солидная нагрузка, то вы наверно задумывались об отдельном решении.

История разработки уходит в один проект торгово-рекламной площадки, где необходимо было учитывать кол-во переходов. Было решение на РНР. Но это давало видимую задержку в 0.5-1 сек, что очень раздражало разработчиков (в частности меня) и я думаю пользователей тоже.

По этому, когда пришлось разрабатывать аналогичный проект, мне пришлось искать альтернативы.

Что происходит при нажатии и учете клика:
— необходимо по некому ключу вытащить url перехода
— записать данные в лог или БД

Не найдя промышленных решений было два варианта:
— написать модуль для nginx;
— создать собственное решение;

Решили не утежелять nginx и создали свой http сервер, на который проксируются запросы через nginx. Хотя данный сервер может выступать самостоятельно. Исходники тут

Решение не носит промышленный характер, но пока показало себя вполне надежно. Сейчас испытывается на новом проекте. При инсталляции необходимо будет подправить пути в Makefile.

User-friendly конфигурационный файл. Большинство параметров можно не трогать. Необходимо задать хост и порт, на котором будет «сидеть» сервер.

В проекте используется понятие inStorage и outStorage engine. Они определены единым интерфейсом IStorage.cpp. Это БД (стораджи) для хранения информации.

В качестве inStorage используется memcachedb, в котором хранятся данные: ключ / адрес
перехода.
В качестве outStorage используется MongoDb, в которую записываются логи. Данный функционал не обязательный, так как ведется access.log вида:
2010/10/08 11:38:30 127.0.0.1 GET /xxx?12345 404
2010/10/08 11:38:30 127.0.0.1 GET /leads?12345 200

Можно написать расширение (модуль) под любое хранилище данных, используя интерфейс IStorage. В этом случае требуется изменить строчки в main.cpp IStorage * inStorage = reinterpret_cast<IStorage *>(new inputMcStorage);
IStorage * outStorage = reinterpret_cast<IStorage *>(new outputMongoStorage);
на свой класс и пересобрать сервер .

На 404 ошибку можно установить адрес перехода. см. конфиг.

В моем проекте на click-server проксируются данные через nginx.

Хочется отметить, что на слабом железе сервер выдерживает 1200rpq, что вполне достаточно. Практически задержки не замечается (1-3 ms). Потребляемая память 600К, так что отдельно выделенного железа не требует.

Надеюсь данное решение будет полезно не только мне.
Tags:производительностьподсчет переходов
Hubs: High performance
+58
2.6k 90
Comments 126