小项目做异步直接采用多线程,大项目采用mq
解耦: 就是将业务不同的场景隔离开,相互不影响。
生产者: 投递消息给MQ服务器端。MQ服务器端缓存该消息。
消费者: 消费者从mq服务器获取相应的消息
mq框架如何设计:
1,mq服务器端: 缓存生产者投递的消息 队列:
数据结构与算法课程
单机版本
package com.taotao.async_log.mq;
import org.apache.logging.log4j.util.Strings;
import java.util.concurrent.LinkedBlockingDeque;
/**
*@author tom
*Date 2020/8/5 0005 9:30
*
*/
public class MQServer {
public static void main(String[] args) throws InterruptedException {
//定义mq服务器端
LinkedBlockingDeque<String> linkedBlockingDeque= new LinkedBlockingDeque<String>();
// System.out.println(linkedBlockingDeque.poll());
//创建生产线程
Thread producer=new Thread(()->{
for (int i = 0; i < 10; i++) {
linkedBlockingDeque.offer(i+"");
System.out.println(Thread.currentThread().getName()+",向mq服务器端存放消费内容:"+i);
}
},"生产线程:");
//主线程等待,生产线程投递万全部消息后则开始继续向下执行
producer.start();
producer.join();
new Thread(()->{
for (;;) {
String msg=linkedBlockingDeque.poll();
if(Strings.isEmpty(msg)){
return;
}
System.out.println(Thread.currentThread().getName()+",从mq服务器取出消息:"+msg);
}
},"消费线程线程:").start();
//主线程等待,生产线程投递万全部消息后则开始继续向下执行
}
}
手写MQ网络版本的思路:
一个mq服务器端存放多个不同的业务逻辑队列
网络通讯有哪些技术: netty,websocket.
{
"type":"生产者或者消费者",
"dequeName":"队列名称",
Data:{}
}