Когда использовать прямой обмен по обмену разветвлением

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

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

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

Правильно ли это или существует реальный прецедент?

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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