mq是常见的物理解耦+逻辑解耦
provider提供服务只需要对着mq进行发布消息,mq会转发给comsumer就可以接触耦合(逻辑上解耦了,物理上也解耦了)
为什么需要使用mq
1.流量消峰 # 在访问量突然增长的时候,mq就可以当做一个缓存的队列。
2.应用解耦 # 应用之间中间多了一个mq,假如订单系统坏了,消息会缓存在mq中,不会直接导致其他的系统也受到影响。
3.异步处理 # 如果应用A调用了B的服务,但是B需要一段时间才可以处理结束,但是A需要知道B什么时候才可以执行完成,这时候一般可以采用两种方式,1.A调用B的查询api,查询什么时候执行完成。2.B提供一个callback的api,B执行完后调用callback通知A。使用mq,B执行完发送消息给mq,mq再把消息通知A,A即可以及时的处理信息,也不用一直去询问B
四大核心概念
生产者、
交换机 交换机接收来自生产者的消息,又把消息推送到队列中,(交换机必须确切知道如何处理它接收到的消息,是将这些消息推送到特定队列还是推送到多个队列,亦或者是把消息丢弃,这个得有交换机类型决定)
队列 队列是一种数据结构,先进先出,是一个缓存区
消费者
rabbitMQ执行原理图
创建provider
``java
//通过工厂创建连接
private final static String QUEUE_NAME = "hello";
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("8.130.15.205");
factory.setUsername("guest");
factory.setPassword("guest");
//channel实现类close接口自动关闭,不用手动关闭
Channel channel = factory.newConnection().createChannel();
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
String message="hello world";
channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
System.out.println("消息发送完毕");
```
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("8.130.15.205");
factory.setUsername("guest");
factory.setPassword("guest");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
System.out.println("等待接收消息....");
//推送的消息如何进行消费的接口回调
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody());
System.out.println(message);
};
//取消消费的一个回调接口 如在消费的时候队列被删除掉了
CancelCallback cancelCallback = (consumerTag) -> {
System.out.println("消息消费被中断");
};
channel.basicConsume(QUEUE_NAME,true,deliverCallback,cancelCallback);
rabbitMQ的手动应答和自动应答
自动应答:消费者接收到消息就应答rabbitMQ,rabbitmq直接删除消息。
自动应道还分批量应答,和单个应答
手动应答:在处理完消息才确定应答
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
};
//采用手动应答
boolean autoAck = false;
channel.basicConsume("two", autoAck, deliverCallback, (consumerTag) -> {
System.out.println(consumerTag + "消费者取消消费接口回调逻辑");
});



