про AMQP говорили много. Очередная разработка, ориентированная на AJAX.
Возможности:
Данные возвращаются в JSON.
чтение одного элемента из очереди
именем очереди выступает правая часть url до последнего слеша. Для урла /sss/q2 именем очереди будет «q2». Это сделано намеренно, так как все урлы вешаются на определенный локейшен и проксируется через nginx.
чтение всех элементов из очереди
размер очереди
публикация
Именем обмена так же является часть урла между последним слешем и '?', а ключом обмена является часть урла, после знака вопроса. Например для урла 10.0.0.1:8080/sss/ex1?news
именем обмена является «ex1», а ключом обмена (routing key) является «news»
Конечно, все расчитано на AJAX. nginx стоит фронт сервером и проксирует запросы на amqp-rest. Можно обойтись и без nginx, если их повесить на разные IP. В моем случае я использую ngx_accesskey_module для защиты от спама. Возможно этот функционал в будущем перенесется в amqp-rest.
что каается производительности: 1300rps
место в памяти 601к
Возможности:
- читать из очереди одно сообщение
- читать из очереди все сообщения
- узнать длинну очереди
- публиковать сообщение в обмен
Данные возвращаются в JSON.
Сборка
- устанавливаем libevent (есть в портах, в большинстве серверах уже установлено ) monkey.org/~provos/libevent
- устанавливаем rabbitmq-c hg.rabbitmq.com/rabbitmq-c
- устанавливаем protocol code-generation hg.rabbitmq.com/rabbitmq-codegen
- устанавливаем amqpcpp code.google.com/p/rabbitcpp
- запускаем Makefile;
- копируем amqp-rest в /usr/local/bin
- правим n.conf и копируем в /usr/local/etc/amqp-rest.conf
logfile /usr/local/var/amqp.log; # logfile
pidfile /tmp/amqp.pid; # pidfile
log_level notice; # the level of logging : error, notice, warning, debug
daemon on; # daemon mode
port 80; # http port, default 80
http 10.0.0.1; # bind IP
amqp :5672; # amqp connection string psw:login@host:port/vhost
Запуск
./amqp-rest [полное имя конфиг-файла]
./amqp-rest stop // останавливает сервис
kill -s HUP `ps | grep amqp-rest | awk '{print $1}'` // перезапуск с новой конфигурацией
Использование
чтение одного элемента из очереди
именем очереди выступает правая часть url до последнего слеша. Для урла /sss/q2 именем очереди будет «q2». Это сделано намеренно, так как все урлы вешаются на определенный локейшен и проксируется через nginx.
curl 10.0.0.1:8080/sss/q2
{"result": "OK", "message":"message 2", size : 2}
// size - размер очереди, сколько элементов осталось в очереди.
чтение всех элементов из очереди
curl 10.0.0.1:8080/sss/q2?all
{"result": "OK", "count" : 2, messages ["message 3","the text\"xxxx\" tttt"]}
// count - размер массива сообщений.
размер очереди
curl 10.0.0.1:8080/sss/q2?count
{"result": "Ok", "count": 3 }
публикация
Именем обмена так же является часть урла между последним слешем и '?', а ключом обмена является часть урла, после знака вопроса. Например для урла 10.0.0.1:8080/sss/ex1?news
именем обмена является «ex1», а ключом обмена (routing key) является «news»
curl -d 'some post data' 10.0.0.1:8080/sss/ex1?news
{"result": "Ok"}
Конечно, все расчитано на AJAX. nginx стоит фронт сервером и проксирует запросы на amqp-rest. Можно обойтись и без nginx, если их повесить на разные IP. В моем случае я использую ngx_accesskey_module для защиты от спама. Возможно этот функционал в будущем перенесется в amqp-rest.
заключение
что каается производительности: 1300rps
место в памяти 601к