消息中间件

消息中间件

MQ的基本概念

1.MQ全称Message Queue(消息队列),是在消息的传输过程中保存消息的容器。多用与分布式系统之间的通信

2.优势:

  • 应用解耦(跨系统数据传输)
  • 异步提速(请求并行执行 )
  • 削峰填谷(把大量的请求存入消息中间 中,以一个数值去消息中间件的请求)

3.劣势

  • 系统可用性降低
  • 系统复杂度增加

4.消息中间件的本质:

  • 他是一种接受数据,存储数据,发送数据等功能的技术服务

5.协议

  • 为啥要规定协议呢?当涉及到跨平台以及跨语言,导致语言不同,所以要一个规范,去完成数据的高可用。
  • 常用的协议:AMQP,Kafka

6.持久化

  • 将数据存入磁盘中,而不是存在内存中随服务器重启断开而消失,而让数据进行永久存储

![在这里分割在这里插入图片描述
7.分发策略
在这里插入图片描述

  • Mq消息队列有三种角色:生产者,存储消息,消费者,生产者生成消息,MQ进行存储,最终以推送的方式将消息发送给消费者。

  • 发布订阅—>生产者发出一条消息,与之绑定的消费者全部收到消息

  • 轮询分发—>平均分发得各个消费者,假如生产者发送100条请求,四个消费者都将获取25条消息

  • 公平分发—>按照消费者的处理水平,平均时间,容易照成请求的倾斜。

常见的MQ消息中间件

在这里插入图片描述

RabbitMQ

1. 使用协议-AMQP协议
  • 是一个提供统一消息服务的应用层标准高级消息队列,基于此协议的客户端与消息中间件可传递信息,不受客户端/中间件不同产品,不同语言的限制。
  • 特点
    1. 支持分布式事务
    2. 支持消息的持久化
    3. 高性能和高可靠的消息处理优势

Kafka

1. 使用协议-Kafka协议
  • Kafka协议是基于Tcp/Ip的二进制协议,消息内部是通过数组长度来分割,由一些基本数据类型组成
  • 特点
    1. 结构简单
    2. 解析速度块
    3. 不支持事务
    4. 有持久化设计

rabbitMQ的初步使用

生成者
  • 创建连接工厂
  • 设置属性
  • 创建连接
  • 创建管道
  • 声明队列,绑定管道
  • 管道发送消息到broke
  • 关闭管道
  • 关闭连接
消费者
  • 创建连接工厂
  • 设置属性
  • 创建连接
  • 创建管道
  • 消费消息
  • 关闭管道
  • 关闭连接
工作模式
  • 简单模式

在这里插入图片描述

  • 工作队列模式
    在这里插入图片描述

  • 发布订阅模式

在这里插入图片描述

  • 路由模式
    在这里插入图片描述

  • 主题模式

在这里插入图片描述

work模式

1.轮询分发
  • 该模式接受信息又多个 消费者接入事,一人一条,直至消费完成
2. 公平分发
  • 根据消费者处理消息水平,处理完一条发一条,直至消费完成
3.区别
  • 两者在代码上的体现为,公平分发要求必须是手动应答

简单入门

// Produce
//创建连接工厂
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("localhost");
connectionFactory.setPort(5672);
connectionFactory.setPassword("guest");
connectionFactory.setUsername("guest");
connectionFactory.setVirtualHost("/");
Connection connection = null;
Channel channel = null;
try {
    //创建连接
    connection = connectionFactory.newConnection("生产者haha");
    //创建管道
    channel = connection.createChannel();
    //声明队列   @parame1:交换机名称,@parame2:是否持久化,@parame3:排他性,@parame4:制动删除,@parame5:附带参数,
    channel.queueDeclare("helloWorld", false, false, false, null);
    //发送消息
    String message = "hello压";
    channel.basicPublish("", "helloWorld", null, message.getBytes());
    System.out.println("消息发送成功");
} catch (Exception e) {
    throw new Exception("出错了,吊毛" + e);
} finally {
    //关闭管道
    channel.close();
    //关闭连接
    connection.close();
}

//Consume
//创建连接工厂
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("localhost");
connectionFactory.setPort(5672);
connectionFactory.setPassword("guest");
connectionFactory.setUsername("guest");
connectionFactory.setVirtualHost("/");
Connection connection = null;
Channel channel = null;
try {
    connection = connectionFactory.newConnection();
    //创建管道
    channel = connection.createChannel();
​
    channel.basicConsume("helloWorld", true, new DeliverCallback() {
        @Override //消息消费成功
        public void handle(String s, Delivery delivery) throws IOException {
            System.out.println("发的消息被消费了--->" + new String(delivery.getBody(), "utf-8"));
        }
    }, new CancelCallback() {
        @Override // 消费失败
        public void handle(String s) throws IOException {
            System.out.println("发的消息消费失败------>出错了");
        }
    });
} catch (Exception e) {
    throw new Exception("出错了,吊毛" + e);
} finally {
    //关闭管道
    channel.close();
    //关闭连接
    connection.close();
}

### 随记

#### 1.为什么消息中间件不直接使用http协议

- http请求的请求头以及请求体中包含大量的信息,而对于消息中间件而言,大部分的信息都是不需要的,为了追求高性能,要尽量简洁和快速。

#### 2. topic模式中,#与*的区别

- #表示 0个,一个,多个 。有点像数据库中模糊查询的 %
- *表示 一个 。有点像数据库中模糊查询的 _

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值