Режим маршрутизации MQ (прямой) | Серия RabbitMQ (8)

задняя часть RabbitMQ
Режим маршрутизации MQ (прямой) | Серия RabbitMQ (8)

Это 13-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления


Статьи по Теме

Краткое содержание серии MyBatis:Серия MyBatis


предисловие

  • имитировать сцену

    • Теперь есть три уровня информации в журналах, ношение, ошибка
    • Теперь я хочу сохранить лог ошибок локально, а инфу и ношение сбросить напрямую (то есть прямое потребление, без обработки, без потребления, будет формироваться бэклог)
    • Думая об этом таким образом, можем ли мы определить привязку потребителя, чтобы специально обрабатывать сохранение журналов ошибок, а другую информацию о привязке потребителя и ношение носить напрямую без какой-либо обработки?

1. Производители

  •     public static void publishMessageIndividually() throws Exception {
            Channel channel = RabbitMqUtils.getChannel();
            channel.exchangeDeclare(ChangeNameConstant.DIRECT_MODEL, BuiltinExchangeType.DIRECT);
            //创建多个 bindingKey
            Map<String, String> bindingKeyMap = new HashMap<>();
            bindingKeyMap.put("info","普通 info 信息");
            bindingKeyMap.put("warning","警告 warning 信息");
            bindingKeyMap.put("error","错误 error 信息");
            //debug 没有消费这接收这个消息 所有就丢失了
            bindingKeyMap.put("debug","调试 debug 信息");
            for (Map.Entry<String, String> bindingKeyEntry: bindingKeyMap.entrySet()){
                String bindingKey = bindingKeyEntry.getKey();
                String message = bindingKeyEntry.getValue();
                channel.basicPublish(ChangeNameConstant.DIRECT_MODEL,bindingKey, null,
                        message.getBytes("UTF-8"));
                System.out.println("生产者发出消息:" + message);
            }
        }
    
  • image-20210804164202085.png
  • Вы видите: на переключателе direct_pattern задано три маршрута

2. Потребители

  • потребитель А
  • /**
     * 这是一个测试的消费者
     *@author DingYongJun
     *@date 2021/8/1
     */
    public class DyConsumerTest_direct01 {
    ​
        public static void main(String[] args) throws Exception{
            //使用工具类来创建通道
            Channel channel = RabbitMqUtils.getChannel();
    ​
            String queueName = "disk";
            channel.queueDeclare(queueName, false, false, false, null);
            //这个专门处理error日志,将其保存至本地
            channel.queueBind(queueName, ChangeNameConstant.DIRECT_MODEL, "error");
            System.out.println("A等待接收消息,把接收到的消息打印在屏幕.....");
            DeliverCallback deliverCallback = (consumerTag, delivery) -> {
                String message = new String(delivery.getBody(), "UTF-8");
                System.out.println(message+"已经保存到本地啦");
            };
            channel.basicConsume(queueName, true, deliverCallback, consumerTag -> {
                System.out.println("消息中断了~");
            });
        }
    }
    
  • потребитель Б
  • /**
     * 这是一个测试的消费者
     *@author DingYongJun
     *@date 2021/8/1
     */
    public class DyConsumerTest_direct02 {
    ​
        public static void main(String[] args) throws Exception{
            //使用工具类来创建通道
            Channel channel = RabbitMqUtils.getChannel();
    ​
            String queueName = "console";
            channel.queueDeclare(queueName, false, false, false, null);
            //这个专门处理error日志,将其保存至本地
            channel.queueBind(queueName, ChangeNameConstant.DIRECT_MODEL, "warning");
            channel.queueBind(queueName, ChangeNameConstant.DIRECT_MODEL, "info");
            System.out.println("B等待接收消息,把接收到的消息打印在屏幕.....");
            DeliverCallback deliverCallback = (consumerTag, delivery) -> {
                String message = new String(delivery.getBody(), "UTF-8");
                System.out.println(message+"已经消费完并丢弃了");
            };
            channel.basicConsume(queueName, true, deliverCallback, consumerTag -> {
                System.out.println("消息中断了~");
            });
        }
    }
    
  • image-20210804164355985.png
  • Потребительский АБ готов.
  • Результаты

    • режиссер
    • image-20210804164439858.png
    • потребитель А
    • image-20210804164505961.png
    • потребитель Б
    • image-20210804164520762.png
    • Он идеально подходит для нашей смоделированной сцены! здорово!

3. Резюме

  • image-20210804164649273.png

  • множественная привязка

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

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

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

  • То есть дело в том, что сложный режим может быть обратно совместим с простым режимом!


Впереди долгий путь, и я обязательно буду его искать вдоль и поперёк~

Если вы думаете, что я блогеры хорошо пишу! Писать нелегко, пожалуйста, ставьте лайки, подписывайтесь и комментируйте, чтобы поощрять блоггеров ~ хахах