公司个人怎么制作网站,wordpress主题多页面,怎样做免费抽皮肤的网站,网站代运营费用#x1f4dd;个人主页#xff1a;五敷有你 #x1f525;系列专栏#xff1a;中间件
⛺️稳中求进#xff0c;晒太阳 MQ的优劣#xff1a;
优势
应用解耦#xff1a;提升了系统容错性和可维护性异步提速#xff1a;提升用户体验和系统吞吐量消峰填谷#xff1… 个人主页五敷有你 系列专栏中间件
⛺️稳中求进晒太阳 MQ的优劣
优势
应用解耦提升了系统容错性和可维护性异步提速提升用户体验和系统吞吐量消峰填谷提升系统稳定性
劣势
系统可用性降低 系统引入的外部依赖越多系统稳定性越差一旦MQ宕机就会对业务造成影响如何保证MQ的高可用系统复杂度提高 MQ的加入大大增加了系统的复杂度以前系统间是同步的远程调用现在是拖过MQ进行异步调用如何保证消息没有被重复消费怎么处理消息丢失情况怎么保证消息传递的顺序性一致性问题 A系统处理完业务通过MQ给B、C、D系统发送数据如果B系统C系统处理成功D系统处理失败如何保证消息数据处理的一致性。
既然MQ有优势也有劣势那么怎么使用MQ需要满足什么条件呢
生产者不需要从消费者处获得反馈引入消息队列之前直接调用其接口的返回值应该为空这才让明明下层的动作还没做上层却当成动作做完了继续往后走即所谓异步成了可能容许短暂的不一致性确实是用了有效果即解耦、提速、晓峰方面的收益超过了加入MQ管理MQ的成本
常见的MQ产品 RabbitMQ简介
AMQP
AMQP,即Advanced Message Queuing Protocol ,是一个网络协议是应用层协议的一个开发标准为面向消息的中间件设计基于此协议的客户端与消息中间件可传递消息并不受客户端/中间件不同产品不同的开发语言等条件的限制。 RabbitMQ的基础架构 相关概念
Broker接收和分发消息的应用RabbitMQ Server就是Message BrokerVirtual host出于多租户和安全因素的考虑把AMQP 的基本组件划分到一个虚拟的分组中类似于网络中的namespace概念。当多个不同的用户使用同一个RabbitMQ server提供的服务时可以划分出多个vhost,每个用户在自己的vhost创建exchange/queue等。Connectionpublisher/consumer和broker之间的TCP连接Channel如果每一次访问RabbitMQ都建立一个Connection在消息量大的时候建立TCP Connection的开销将是巨大的效率也较低Channel是在connection内部建立的逻辑连接如果应用程序支持多线程通常每个thread创建单独的channel进行通讯AMQP method包含了channel id帮助客户端和message broker识别channel ,所以channel之间是完全隔离的Channel作为轻量级的Connection极大减少了操作系统建立TCP connection的开销Exchangemessage到达broker的第一站根据分发规则匹配查询表中的routing key,分发消息到queue中去常用的类型有direct,topic,Queue消息最终被送到这里等待consumer被取走Bindingexchange 和 queue 之间的虚拟连接binding中可以包含routing key 。Binding信息被保存到exchange中的查询表中用于message的分发依据
RabbitMQ的6中工作模式 JMS
JMS,即Java消息服务(JavaMessage Service) 应用程序接口是一个Java平台中关于面向中间件的APIJMS是JavaEE规范的一种类似JDBC很多中间件都实现类JMS规范.
快速入门 这个直接通过队列进行通信的
引入spring-boot-starter-amqp配置rabbitmq服务端信息
spring:rabbitmq:host: ipport: 5672virtual-host: /username: MeetRyspassword: 123456
利用RabbitTemplate发送消息
Autowired
private RabbitTemplate rabbitTemplate;Test
void testSendMessage2Queue() {String queueName1 MeetRys01;String queueName2 MeetRys02;String msg hello word;rabbitTemplate.convertAndSend(queueName1, msg);rabbitTemplate.convertAndSend(queueName1,msg);} 2.利用RabbitListener注解声明要监听的队列
Slf4j
Component
public class MqListener {RabbitListener(queues MeetRys01)public void listenSimpleQueue(String msg){System.out.println(消费者1收到了MeetRys01的消息【 msg 】);}}