初学rabbitMQ

1.先了解什么是同步通信和异步通信

按我的理解来说是

同步通信:实时对话传输

异步通信:得等对方回复了才能收到,时效性差

优缺点:同步通信只能同时对于一个人对话不能多线回复,而异步通信可以同时与几个人聊天

这就是实时的,得等待服务回应

当服务多了会性能下降,吞吐量也下降了

同步调用存在的问题

  • 耦合度高(每次加入新需求都需要修改原来的代码)
  • 性能和吞吐能力下降(调用者需要等待服务提供者的响应,如果调用链过长则每次响应时间等于调用时间之和)
  • 有额外的资源消耗(调用链中每个服务在等待相应过程中不能释放资源,高并发下极度浪费系统资源)
  • 有级联失败问题(如果服务提供者出现问题,所有调用方都会出现问题,和多米诺骨牌一样迅速导致整个微服务群故障)

 引入了broker(事件代理者)

例如

在这个体系中一旦有人支付成功就是一个事件

异步调用好处:

  • 吞吐量提升:无需等待订阅者处理完成,响应更快速
  • 故障隔离:服务没有直接调用,不存在级联失败问题
  • 调用间没有阻塞,不会造成无效的资源占用
  • 耦合度极低,每个服务都可以灵活插拔,可替换
  • 流量削峰:不管发布事件的流量波动多大,都由 Broker 接收,订阅者可以按照自己的速度去处理事件

异步调用缺点:

  • 架构复杂了,业务没有明显的流程线,不好管理
  • 需要依赖于 Broker 的可靠、安全、性能

MQ消息队列

MQ,中文是消息队列(MessageQueue),字面来看就是存放消息的队列,也就是事件驱动架构中的 Broker

比较常见的 MQ 实现:

  • ActiveMQ
  • RabbitMQ
  • RocketMQ
  • Kafka

几种常见MQ的对比:

RabbitMQActiveMQRocketMQKafka
公司/社区RabbitApache阿里Apache
开发语言ErlangJavaJavaScala&Java
协议支持AMQP、XMPP、SMTP、STOMPOpenWire、STOMP、REST、XMPP、AMQP自定义协议自定义协议
可用性一般
单机吞吐量一般非常高
消息延迟微秒级毫秒级毫秒级毫秒以内
消息可靠性一般一般

rabbitmq的安装   

服务器中运用docker

docker pull rabbitmq:3-management

然后执行命令运行MQ容器

docker run \
 -e RABBITMQ_DEFAULT_USER=yunjie \
 -e RABBITMQ_DEFAULT_PASS=123123 \
 --name mq \
 --hostname mq1 \
 -p 15672:15672 \
 -p 5672:5672 \
 -d \
 rabbitmq:3-management

设置web界面的用户名与密码

容器名字mq

hostname是主机名

端口映射15672是rabbit管理平台的端口

5672是消息通信的端口

-d是后台运行

然后docker ps查看容器是否成功

RabbitMQ中的几个概念:
·chanpel:操作MQ的工具
·exchange:路由消息到队列中
·queue:缓存消息
·virtual host:虚拟主机,是对queue、exchange等
资源的逻辑分组

 

MQ的官方文档给出了几个demo,对应了几种不同的用法

-基本消息队列(BaseQueue)

-工作消息队列(WorkQueue)

队列是RabbitMQ的内部对象,用于存储消息。生产者(下图中的P)生产消息并投递到队列中,消费者(下图中的C)可以从队列中获取消息并消费。

 官方的HelloWorld是基于最基础的消息队列模型来实现的,只包括三个角色:
·publisher:消息发布者,将消息发送到队列queue
·queue:消息队列,负责接受并缓存消息
 consumer:订阅队列,处理队列中的消息

单列通信

基本消息队列的消息发送流程:
1.建立connection
2.创建channel
3.利用channel声明队列
4.利用channel向队列发送消息
基本消息队列的消息接收流程:
1.建立connection
2.创建channel
3.利用channel声明队列
4.定义consumer的消费行为handleDelivery()
5.利用channel将消费者与队列绑定

创建消息生产者

public class PublisherTest {
    @Test
    public void testSendMessage() throws IOException, TimeoutException {
        // 1.建立连接
        ConnectionFactory factory = new ConnectionFactory();
        // 1.1.设置连接参数,分别是:主机名、端口号、vhost、用户名、密码
        factory.setHost("124.222.59.81");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("yunjie");
        factory.setPassword("123123");
        // 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();
    }
}

 创建消息消费者

public class ConsumerTest {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.建立连接
        ConnectionFactory factory = new ConnectionFactory();
        // 1.1.设置连接参数,分别是:主机名、端口号、vhost、用户名、密码
        factory.setHost("124.222.59.81");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("yunjie");
        factory.setPassword("123123");
        // 1.2.建立连接
        Connection connection = factory.newConnection();
        // 2.创建通道Channel
        Channel channel = connection.createChannel();
        // 3.创建队列
        String queueName = "object.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) {
                // 5.处理消息
                String message = new String(body);
                System.out.println("接收到消息:" + message);
            }
        });
        System.out.println("等待接收消息中");
    }
}

检查rabbitmq的后台queues

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值