简介
消息队列 (Message Queue, MQ) 是一种在分布式系统中用于异步通信的中间件。它允许不同应用程序或服务通过发送消息与接收消息交换数据,而且无需直接相互依赖
核心概念
生产者:负责创建并发送消息到消息队列
消息队列:储存消息的缓冲区,基于阻塞队列的实现基底
消费者:从消息队列接收消息并执行
工作流程
1.生产者将消息发送到消息队列。
2.消息队列存储消息,直到有消费者准备好处理它。
3.消费者从消息队列中获取消息并进行处理。
4.处理完成后,消费者可以确认消息已被成功处理,消息队列将其删除。
阻塞队列的实现
public class MyBlockingDeque {
private int[]elem;
public MyBlockingDeque(int space) {
if(space<=0) {
throw new RuntimeException();
}
else elem=new int[space];
}
private volatile int head=0;//头下标
private volatile int tail=0;//尾下标
private volatile int size=0;//数组有效个数
public void put(int value) throws InterruptedException {
synchronized (this) {
if (size >= elem.length) {
//阻塞,使其等待 this当前这个
this.wait();
}
elem[tail] = value;
tail++;
if (tail == elem.length) {
tail = 0;
}
size++;
}
}
public synchronized Integer take() throws InterruptedException {
if(size==0){
this.wait();
}
Integer key=elem[head];
head++;
if(head==elem.length){
head=0;
}
size--;
//唤醒阻塞等待线程
this.notifyAll();
return key;
}
}
消息队列的优点
1.解耦:生产者与消费者之间不需要直接了解对方,降低了系统之间的依赖性
2.异步:生产者发送消息不需要等消费者执行完,提高了系统的响应速度
3.削峰填谷:在高并发下,消息队列可以缓冲请求,防止系统过载
4.可靠性:消息队列通常具有持久化机制,可以保证消息不会丢失
5.可以方便地增加生产者和消费者,扩展系统的处理能力。
6.某些消息队列可以保证消息的顺序性,即按照发送的顺序进行处理。