当前位置:   article > 正文

服务异步通讯

服务异步通讯

初识MQ

同步通讯

在这里插入图片描述在这里插入图片描述在这里插入图片描述
同步存在的问题:

  1. 耦合度高:每次加入新的需求时 ,都要修改原来的代码
  2. 性能下降:调用者需要等待服务提供者的响应,如果调用链过长则响应时长则总时长变长
  3. 资源浪费:调用链中每个服务都在等待响应过程中,不能释放请求占用的资源,高并发环境下极度浪费资源
  4. 级联失败:如果服务提供者出现问题,则所有调用方都会出现问题

同步调用优点:时效性较强,可以立即得到结果

异步通讯

在这里插入图片描述异步通讯:引入事件代理者broker,支付完成后,支付服务只需发送一个通知即可,不需要再等待其他调用服务。

  1. 耦合低:新增服务或减少业务,只需订阅broker即可,不需要大量改动
  2. 性能提升,吞吐量提高:不用同步的等待
  3. 无强依赖,级联失败问题解决:一个服务down了,其他服务不受影响
  4. 流量削峰:高并发时,各个被调用者服务,从broker取出请求,按照自己的节奏来处理业务,broker承受压力

异步通信缺点:

  1. 依赖Broker的可靠性、安全性、吞吐能力
  2. 架构复杂,业务没有明显流程线,不好追踪管理

MQ常用技术

MQ,中文就是消息队列,字面看就是存放消息队列==》时间驱动的Broker.
在这里插入图片描述

RabbitMQ

在这里插入图片描述RabbitMQ的概念:

  1. channel:操作MQ的工具
  2. exchange:路由消息到队列
  3. queue:缓冲消息
  4. virtual host:虚拟主机,对queue,exchange资源的逻辑分组

在这里插入图片描述helloword案例:
官方的helloword是基于最基础的消息队列模型来实现的,只包括三个角色:

  1. publisher:消息发布者,将消息发送到队列Queue
  2. queue:消息队列,负责接受并消息
  3. consumer:订阅队列,处理队列的消息

在这里插入图片描述Publisher:

 // 1.建立连接
        ConnectionFactory factory = new ConnectionFactory();
        // 1.1.设置连接参数,分别是:主机名、端口号、vhost、用户名、密码
        factory.setHost("192.168.120.12");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("haoyue");
        factory.setPassword("123456");
        // 1.2.建立连接
        Connection connection = factory.newConnection();

        // 2.创建通道Channel
        Channel channel = connection.createChannel();

        // 3.创建队列
        String queueName = "simple.queue";
        channel.queueDeclare(queueName, false, false, false, null);

        // 4.发送消息
        String message = "hello, rabbitmq!";
        channel.basicPublish("", queueName, null, message.getBytes());
        System.out.println("发送消息成功:【" + message + "】");

        // 5.关闭通道和连接
        channel.close();
        connection.close();

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

consumer:

 // 1.建立连接
        ConnectionFactory factory = new ConnectionFactory();
        // 1.1.设置连接参数,分别是:主机名、端口号、vhost、用户名、密码
        factory.setHost("192.168.120.12");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("haoyue");
        factory.setPassword("123456");
        // 1.2.建立连接
        Connection connection = factory.newConnection();

        // 2.创建通道Channel
        Channel channel = connection.createChannel();

        // 3.创建队列
        String queueName = "simple.queue";
        channel.queueDeclare(queueName, false, false, false, null);

        // 4.订阅消息
        channel.basicConsume(queueName, true, new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope,
                                       AMQP.BasicProperties properties, byte[] body) throws IOException {
                // 5.处理消息
                String message = new String(body);
                System.out.println("接收到消息:【" + message + "】");
            }
        });
        System.out.println("等待接收消息。。。。");
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

在这里插入图片描述基本消息队列的消息发送流程:

  1. 建立connnection
  2. 创建channel
  3. 利用channel声明队列
  4. 利用channel向队列发送消息
    基本消息队列的消息接受流程:
  5. 建立connnection
  6. 创建channel
  7. 利用channel声明队列
  8. 定义consumer的消费行为handleDeliver()
  9. 利用channel将消费与队列绑定

SpringAMQP

AMQP:Advanced Message Queuing Protocol,是用于在应用程序之间传递业务消息的开放标准。该协议与语言和平台无关,更符合微服务中独立性的要求。
Spring AMQP
Spring AMQP是基于AMQP协议定义的一套API规范,提供了模板来发送和接受消息。包含两部分,其中spring-amqp是基础抽象的,spring-rabbit是底层的默认实现。
利用Spr ingAMQP实现HelloWorld中的基础消息队列功能:

  1. 在父工程中引入spr ing -amqp的依赖
  2. 在publ isher服务中利用Rabbi tTemplate发送消息到s imple. queue这个队列
  3. 在consumer服务中编写消费逻辑,绑定simple. queue这个队列
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述总结:
       什么是AMQP?
    ●应用间消 息通信的一●种协议,与语言和平台无关。
       Spr ingAMQP如何发送消息?
    ●引入amqp的starter依赖
    ●配置Rabbi tMQ地址
    ●利用Rabbi tTemplate的convertAndSend方法
       Spr ingAMQP如何接收消息?
    ●引入amqp的starter依赖
    ●配置Rabbi tMQ地址
    ●定义类,添加@Component注解
    ●类中声明方法,添加@Rabbi tListener注解,方法参数就时消息
    注意:消息一旦消费就会从队列删除,Rabbi tMQ没有消息回溯功能

WorkQueue

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述Work模型的使用:

  1. 多个消费者绑定到一个队列,同一条消息只会被一个消费者处理
  2. 通过设置prefetch来控制消费者预取的消息数量

发布、订阅(加入交换机)

发布订阅模式与之前案例的区别就是允许将同- -消息发送给多个消费者。实现方式是加入了exchange (交换机)。
常见exchange;

  1. Fanout:广播
  2. Direct:路由
  3. Topic:话题

在这里插入图片描述

发布订阅-Fanout Exchange

在这里插入图片描述在这里插入图片描述在这里插入图片描述交换机的作用:

  1. 接受publisher发送的消息
  2. 将消息按照规则路由到与之绑定的队列
  3. 不能缓冲消息,路由失败,消息丢失
  4. FanoutExchange的会将消息路由到每个绑定的队列

发布订阅-DirectExchange

Direct Exchange 会将接收到的消息根据规则路由到指定的Queue,因此称为路由模式(routes) 。
●每一个Queue 都与Exchange设置- - 个BindingKey
●发布者发送消息时,指定消息的RoutingKey
●Exchange将 消息路由到BindingKey与消息RoutingKey-致的队列
在这里插入图片描述在这里插入图片描述在这里插入图片描述
描述下Direct交换机与Fanout交换机的差异:
●Fanout交换机将消息路由给每一个与之绑定的队列
●Direct交换机根据Rout ingKey判断路由给哪个队列
●如果多个队列具有相同的Rout ingKey,则与Fanout功能类似

TopicExchange

TopicExchange与DirectExchange类似,区别在于rout ingKey必须是多个单词的列表,并且以.分割。
Queue与Exchange指定BindingKey时可以使用通配符:
#:代指0个或多个单词
*:代指-一个单词
在这里插入图片描述在这里插入图片描述在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/798579
推荐阅读
相关标签
  

闽ICP备14008679号