消息和异步
异步:
客户端请求不会阻塞进程,服务端的响应可以是非即时的。
异步常见形态:
通知:单项请求
请求/异步响应:客户端发送请求,服务端异步响应,客户端不会阻塞
消息:利用消息实现一对多响应
MQ应用场景:
异步处理
流量削峰:流量过大会导致应用挂掉,在应用前端加入消息队列,当人数大于队列长度,直接转到错误页面或者放弃请求
日志处理:最典型的就是kafka,大数据中应用比较多,通过日志采集定时写入Kafka,Kafka进行转发存储
应用解耦
使用RabbitMq
1.引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.创建接收方法
@Slf4j
@Component
public class MqReceiver {
//需要手动创建队列 @RabbitListener(queues = "myQueue")
//自动创建队列
@RabbitListener(queuesToDeclare = @Queue("myQueue"))
public void process(String message){
log.info("message:{}",message);
}
}
3.使用AmqpTemplate进行发送消息
@Autowired
private AmqpTemplate amqpTemplate;
@Test
public void send(){
//第一个参数是队列 第二个参数是要发送的消息
amqpTemplate.convertAndSend("myQueue","now"+System.currentTimeMillis());
}
4.如果是想在创建队列的时候和Exchanges绑定 那么需要修改注解
@RabbitListener(bindings = @QueueBinding(
value = @Queue("myQueue"),
exchange = @Exchange("myExchange")
))
5.使用同一个Exchanges通过BindingKey发送消息到对应队列
/**
* 队列1
* @param message
*/
@RabbitListener(bindings = @QueueBinding(
exchange = @Exchange("myOrder"),
key = "computer",
value = @Queue("computerOrder")
))
public void computerOrder(String message){
log.info("computerOrder:{}",message);
}
/**
* 队列2
* @param message
*/
@RabbitListener(bindings = @QueueBinding(
exchange = @Exchange("myOrder"),
key = "fruit",
value = @Queue("fruitOrder")
))
public void fruitOrder(String message){
log.info("fruitOrder:{}",message);
}
发送消息,参数1:ExChange(交换器) 参数2:key 参数3:为内容,发送后队列1会收到消息
@Test
public void sendOrder(){
amqpTemplate.convertAndSend("myOrder","computer","now"+System.currentTimeMillis());
}