2013-02-26 4 views
9

Насколько я могу судить, нет подходящего случая для прямого обмена, поскольку все, что вы можете с ним сделать, вы можете сделать с обменом разветвлением, только более расширяемым.Когда использовать прямой обмен по обмену разветвлением

Более конкретно в чтении RabbitMQ в действии авторы многочисленно относятся к прецеденту, который выходит что-то вроде - «Предположим, что, когда пользователь загружает изображение, которое нужно создавать миниатюру Но потом маркетинг также говорит вам награду. точки для загрузки фотографии. С RabbitMQ вам просто нужно создать очередную очередь и не выполнять никаких действий со стороны производителя! "

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

Это правильно или есть фактический прецедент?

ответ

0

Вы имели в виду обмен разветвителя или обмен предметами? обмен разветвлений сильно отличается от прямого обмена. Я полагаю, что отправка фотографии на биржу отправляется с помощью ключа маршрутизации, который указывает, что есть фотография. В этом случае у вас есть потребитель, который генерирует миниатюру, и когда вы хотите добавить нового потребителя, вы можете просто добавить его и получить одно и то же сообщение, но сделать что-то другое с ним, то есть наградные очки.

Эксплуатация используется. Я думаю, дело в том, что обмен изначально создается как прямой обмен.

0

Этот ответ повторяет previousone, и если вы обратитесь к этому page, я считаю, что вы один конкретный случай использования Описанная:

Прямые обмены часто используются для распределения задач между несколькими рабочих (экземпляры одного и того же приложения) в круглой форме.

+0

Это предложение в документации сбивает с толку. Фактически, если вы связываете несколько очередей с одним и тем же ключом маршрутизации для прямого обмена, все они получат сообщение, если ключ маршрутизации совпадает. Это лучше объясняется в [tutorial 4] (https://www.rabbitmq.com/tutorials/tutorial-four-python.html). –

5

По сравнению с обменом разветвлением прямой обмен позволяет фильтровать на основе ключа маршрутизации сообщения, чтобы определить, какая из них (-ов) получает сообщение. При обмене разветвлением такая фильтрация отсутствует, и все сообщения поступают во все связанные очереди.

Итак, если у вас есть прямой обмен с несколькими очередями, связанными с одной и той же очередью маршрутизации, и все сообщения имеют этот ключ, тогда вы будете иметь такое же поведение, как обмен разветвления. Это лучше объясняется в tutorial 4 on the RabbitMQ website.

При использовании загрузки изображений случае, вы можете использовать:

  • обмен разветвления с двумя очередями (по одному для рабочего эскиза, один для вычисления баллов работника). Ключ маршрутизации игнорируется.

    fanout-exchange 
    |--> queue --> thumbnail-worker 
    `--> queue --> score-worker 
    
  • прямой обмен с еще двумя очередями. Очереди связаны с ключом image-processing, и сообщения с этим ключом будут поставлены в очередь для обеих очередей.

    direct-exchange 
    |--["image-processing"]--> queue --> thumbnail-worker 
    `--["image-processing"]--> queue --> score-worker 
    

    Конечно, в этой ситуации, если ключ маршрутизацию сообщения не соответствует привязки ключа, ни одна из очередей не получит сообщение.

Вы не можете поместить двух рабочих в одну очередь, так как сообщения будут сбалансированы между собой: один рабочий увидит половину сообщений.

Смежные вопросы