
1.MQ全称Message Queue(消息队列),是在消息的传输过程中保存消息的容器。多用与分布式系统之间的通信
2.优势:
3.劣势
4.消息中间件的本质:
5.协议
6.持久化
![在这里分割
7.分发策略
Mq消息队列有三种角色:生产者,存储消息,消费者,生产者生成消息,MQ进行存储,最终以推送的方式将消息发送给消费者。
发布订阅—>生产者发出一条消息,与之绑定的消费者全部收到消息
轮询分发—>平均分发得各个消费者,假如生产者发送100条请求,四个消费者都将获取25条消息
公平分发—>按照消费者的处理水平,平均时间,容易照成请求的倾斜。
工作队列模式
发布订阅模式
路由模式
主题模式
// 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个,一个,多个 。有点像数据库中模糊查询的 %
- *表示 一个 。有点像数据库中模糊查询的 _