Re: Типы exchange и последующий bind

315 views
Skip to first unread message

Dmitry

unread,
Oct 12, 2010, 1:49:20 PM10/12/10
to rabbit...@googlegroups.com
Скажите, а какая в принципе разница между типами exchange?
В документации http://code.google.com/p/php-rabbit/wiki/AMQPExchangeDeclare описаны только 3 типа
 
Выше было сказано, что “fanout” самый быстрый
Для чего тогда использовать “direct”? Было бы здорово увидеть различия между ними
И еще насчет типа “topic”. В этой статье на Хабрахабре http://habrahabr.ru/blogs/webdev/70997/ было сказано, что маршрутизация в случае “topic”-exchange может быть по паттерну.
 
> Например, публикация в обмен 'php' с ключом 'fanat' направит сообщение в очередь 'php.fanat'
Какие могут быть паттерны?

Maxim Treskin

unread,
Oct 12, 2010, 2:06:07 PM10/12/10
to rabbit...@googlegroups.com
В эксченже типа "fanout" каждое сообщение раскидывается всем подписчикам.
В типе "direct", когда несколько подписчиков подписаны на конкретную очередь, сообщения им будут приходить по round-robin. Допустим, на очередь в direct-эксченже подписаны три клиента. Тогда первое сообщение пойдёт первому клиенту, второе второму, третье третьему, четвёртое опять первому, пятое второму и т.д. Если подписывается ещё один клиент, то он также вклинивается в этот цикл.
В типе fanout подписываются на паттерны. Паттерны могут быть, например, "#.weather", "uk.#", где знак '#' — любой кусок паттерна.

Вот здесь подробнее написано: http://www.rabbitmq.com/faq.html#managing-concepts-exchanges

2010/10/13 Dmitry <dmitry...@yandex.com>



--
Maxim Treskin

Alexandre Kalendarev

unread,
Oct 12, 2010, 2:42:14 PM10/12/10
to rabbit...@googlegroups.com


12 октября 2010 г. 21:49 пользователь Dmitry <dmitry...@yandex.com> написал:

Скажите, а какая в принципе разница между типами exchange?
В документации http://code.google.com/p/php-rabbit/wiki/AMQPExchangeDeclare описаны только 3 типа
 

а их в соответствии с протоколом AMQP всего три
прежде чем использовать раббит, советую ознакомиться с протоколом
тогда будет все понятней
 
Выше было сказано, что “fanout” самый быстрый

потому что нет роутинга сообщений
все сообщения отдаются напрямую
 
Для чего тогда использовать “direct”? Было бы здорово увидеть различия между ними

осуществляется роутинг по ключам, "прямое" соответствие,
те если ключ соответствует подписки? то сообщение приходит
 
И еще насчет типа “topic”. В этой статье на Хабрахабре http://habrahabr.ru/blogs/webdev/70997/ было сказано, что маршрутизация в случае “topic”-exchange может быть по паттерну.

роутинг по ключам с "паттернами"
т.е. проверяется как ключ на соответствие паттерну  * #
соответственно, самые медленные
 
> Например, публикация в обмен 'php' с ключом 'fanat' направит сообщение в очередь 'php.fanat'
Какие могут быть паттерны?

news.* направит сообщения news.politic news.art news.realry НО НЕ realty.news
*.spb направит сообщения art.spb auto.spb НО НЕ art.msk и тем более realty.news

Dmitry

unread,
Oct 12, 2010, 2:49:05 PM10/12/10
to rabbit...@googlegroups.com
спасибо, буду читать

Alexandre Kalendarev

unread,
Oct 12, 2010, 3:05:16 PM10/12/10
to rabbit...@googlegroups.com

Rauan Maemirov

unread,
Oct 12, 2010, 4:28:34 PM10/12/10
to rabbit...@googlegroups.com
>В типе fanout подписываются на паттерны.
Вы ничего не перепутали, Максим? :)

2010/10/13 Maxim Treskin <zert...@gmail.com>

Maxim Treskin

unread,
Oct 12, 2010, 4:32:35 PM10/12/10
to rabbit...@googlegroups.com
Да, разумеется, перепутал. Имел в виду "topic". Спасибо за поправку.

2010/10/13 Rauan Maemirov <ra...@maemirov.com>



--
Maxim Treskin

Dmitry

unread,
Oct 12, 2010, 4:32:37 PM10/12/10
to rabbit...@googlegroups.com
Насколько я понимаю, Максим перепутал. Он имел в виду “topic”
 
Sent: Wednesday, October 13, 2010 12:28 AM
Subject: Re: Типы exchange и последующий bind
 

Dmitry

unread,
Oct 12, 2010, 5:04:40 PM10/12/10
to rabbit...@googlegroups.com
К слову насчет direct-exchange
Нигде не нашел такого четкого разбрасывания сообщений (первое – первому итд). Да и насколько я понимаю, direct-exchange требуется для точной посылки по routing key
Смысл round-robin вроде бы как раз не в отсылке как указал Максим, а просто в очередности.
То есть, сообщения приходят всем, а вот очередность уже определяется по алгортиму round-robin
Таким образом, каждое сообщение должно попасть с каждому из участников обмена.
 
об этом вроде бы еще пишут
Да и тут пишут, что fanout и direct являются всего лишь упрощениями topic
 
Подскажите, кто прав.
Sent: Tuesday, October 12, 2010 10:06 PM
Subject: Re: Типы exchange и последующий bind

Maxim Treskin

unread,
Oct 12, 2010, 5:11:42 PM10/12/10
to rabbit...@googlegroups.com
Если на одну и ту же очередь подписаны несколько клиентов, то сообщение, попадающее в эту очередь по какому-то routing key, доставится только одному из подписчиков. В этом и суть названия direct: 1 к 1. Т.е., если пошлём пачку сообщений, маршрутизируемых в эту очередь, никто из подписчиков не получит всех сообщений из этой пачки, сообщения распределятся примерно поровну между ними всеми.

2010/10/13 Dmitry <dmitry...@yandex.com>



--
Maxim Treskin

Dmitry

unread,
Oct 12, 2010, 5:28:41 PM10/12/10
to rabbit...@googlegroups.com
Странно, в документации такого не видел.
Я так наоборот понял, что direct значит 1 сообщение к 1 routing key

Maxim Treskin

unread,
Oct 12, 2010, 5:45:27 PM10/12/10
to rabbit...@googlegroups.com
Это верно, по routing-key сообщение доставляется в одну очередь, в ту, на которую этот routing-key и указывает. Дальше сообщение из очереди попадает только к одному подписчику, независимо от того, сколько их подписалось на эту очередь. Затем, при каждом новом сообщении, подписчик, получающий его, будет меняться по кругу.

2010/10/13 Dmitry <dmitry...@yandex.com>



--
Maxim Treskin

Rauan Maemirov

unread,
Oct 13, 2010, 2:55:05 AM10/13/10
to rabbit...@googlegroups.com
Дмитрий, тут очень хорошо написано для начинающих. Мне очень помогло.

http://github.com/rabbitmq/rabbitmq-tutorials/blob/master/python/tutorial-two.md
http://github.com/rabbitmq/rabbitmq-tutorials/blob/master/python/tutorial-three.md



2010/10/13 Dmitry <dmitry...@yandex.com>

Dmitry

unread,
Oct 24, 2010, 4:21:25 AM10/24/10
to rabbit...@googlegroups.com
Кто-то из нас путается в понятиях.
В мануалах написано как идет обработка в Task Queue.
Но это никак не должно сказываться на сообщениях, которые доходят до конечного получателя.
Direct-обмен подразумевает посылку сообщений во все очереди по точному совпадению ключа.
Для теста я прогнал небольшой скрипт (попросил товарища с другого IP помочь). Все 10 сообщений, отправленных в direct-обменник дошли и до меня, и до него.

Rauan Maemirov

unread,
Oct 24, 2010, 5:08:10 AM10/24/10
to rabbit...@googlegroups.com
Странно. С нуля скрипт не должен был заработать вообще.
Прежде чем посылать сообщения в exchange, нужно сделать bind очередей к нему. У вас же сперва отсылаются сообщения, а затем деклейрятся очереди и делается bind.

Вы уверены, что до этого в брокере не существовал эксчейндж testing с типом fanout? Насколько я знаю, для существующего эксчейнджа тип меняться не будет.

2010/10/24 Dmitry <dmitry...@yandex.com>

Dmitry

unread,
Oct 24, 2010, 5:34:32 AM10/24/10
to rabbit...@googlegroups.com
Еще одни непонятки. Зачем вобще делать бинд очередей для посылки сообщения в обменник?
Человек, отправляющий сообщение в обменник не должен знать, какие очереди привязаны к нему и через какие биндинги.
Он просто отправляет сообщение с соответствующим routing_key, а обменник на основании этого routing_key уже определяет в какие очереди переслать это сообщение.
Проверял как раз вчера.
 
Насчет того, что когда происходит. Я просто сделал доп. действие (вызывал в виде test.php?publish), чтобы не создавать еще один файл. Таким образом при опубликовани сообщения сперва происходит коннект, потом подключение к обменнику, потом publish. При получении – коннект, подключение к обменнику, потом создание и привязка очереди к обменнику. По-моему логично.
 
До этого в брокере существовал только один обменник. Не testing.

Alexandre Kalendarev

unread,
Oct 24, 2010, 2:28:21 PM10/24/10
to rabbit...@googlegroups.com
$exch->declare( 'testing', 'direct', AMQP_DURABLE ); // объявляем обмен 
AMQP_DURABLE - кажется для обменника этот флаг в АПИ начиная с лета не работает

queue = new AMQPQueue( $cnn );
if ( user1 ) {
$messagesNum = $queue->declare( 'dima.queue', AMQP_DURABLE ); // объявляем очередь
$queue->bind( 'testing', 'robot' ); // привязываем очередь к обменнику по ключу 'robot'

должно все работать если мы публимкуем сообщение в обменник в ключом 'robot'



24 октября 2010 г. 13:34 пользователь Dmitry <dmitry...@yandex.com> написал:



--
Alexandre

Dmitry

unread,
Oct 24, 2010, 3:42:51 PM10/24/10
to rabbit...@googlegroups.com
> AMQP_DURABLE - кажется для обменника этот флаг в АПИ начиная с лета не работает
разве? вроде в исходниках не нашел чего-то, что этот флаг не передает. Или..?
В принципе при перезагрузке брокера, обменник продолжает существовать, что как раз и говорит о его DURABLE-состоянии, или я не прав?

Alexandre Kalendarev

unread,
Oct 24, 2010, 6:03:26 PM10/24/10
to rabbit...@googlegroups.com
да, это я напутал
сорри что ввел в заблуждение

24 октября 2010 г. 23:42 пользователь Dmitry <dmitry...@yandex.com> написал:

> AMQP_DURABLE - кажется для обменника этот флаг в АПИ начиная с лета не работает
разве? вроде в исходниках не нашел чего-то, что этот флаг не передает. Или..?
В принципе при перезагрузке брокера, обменник продолжает существовать, что как раз и говорит о его DURABLE-состоянии, или я не прав?



--
Alexandre
Reply all
Reply to author
Forward
0 new messages