什么是MQ?

 什么是MQ

Message Query(MQ),消息队列中间件,很多初学者认为,MQ通过消息的发送和接受来实现程序的异步和解耦,mq主要用于异步操作,这个不是mq的真正目的,只不过是mq的应用,mq真正的目的是为了通讯。他屏蔽了复杂的通讯协议,像常用的dubbo,http协议都是同步的

比如:A服务:java写的    B服务:c++写的

什么是MQ?_第1张图片

这两种协议很难实现 双端通讯,A调用B,B也可以主动调用A,而且不支持长连接。mq做的就是在这些协议上构建一个简单协议——生产者、消费者模型,mq带给我们的不是底层的通讯协议,而是更高层次的通讯模型。他定义了两个对象:发送数据的叫做生产者,接受消息的叫做消费者,我们可以无视底层的通讯协议,我们可以自己定义生产者消费者。

MQ的两种流派

1.有broker的

broker是什么,可以理解为是一个中转站。生产者将消息发送给他就结束自己的任务了,broker将消息主动推送给消费者具体的将消息推送到哪个队列,或者说消费者主动请求

1.消息来了主动放;

2.等比如订单服务去请求队列有没有消息的时候,再放。

如图解:

什么是MQ?_第2张图片

  一个队列可以对应多个服务,一个服务也可以监听多个队列。如图就是定义了两个服务,来了两个队列的消息,就会通知两次订单服务,下两次订单,这时就有问题,就用到了分布式锁

什么是MQ?_第3张图片

 为了解决重复通知的问题:可以用分布式锁。

重topic

必须要有topic

kafka:全球消息处理性能最快的一款mq

rocketmq:阿里内部的一个大神根据kafka的执行原理手写的,性能与kafka差不多,但是功能上比kafka要多,比如说顺序消费。

轻topic

可以没有topic,topic只是一种中转模式

rabbitmq

2.无broker的

zeromq:没有使用broker,是直接使用socket进行通信。

长连接,靠socket连接。

什么是MQ?_第4张图片

 什么是socket。socket主要用于即时通讯。socket是长连

传统的http请求随着服务端返回给客户端消息,两者之间的关联就消失了,所以服务端想要主动练习客户端就得靠轮询的方式,但是这种轮询比较耗费性能,既耗费客户端的性能,又耗费服务器资源,于是就有了长连接的概念。

客户端向服务端发了个在吗,服务器回客户端在。发在的前提是客户端先访问的服务端,如果服务端想直接访问客户端怎么办,

 服务端想直接访问客户端:第一种方案:轮询

关于消息队列的思考:

比如说客户端每一秒钟向队列生产1万条消息,但是每一秒钟只能消费100条消息。怎么办?(消息堆积问题怎么解决

方案一:可以增加消费者。

方案二:限流,先过滤掉一部分请求。

发送消息的时候加个限制。

穿插知识点

事务简单介绍

事务

只要涉及到消息队列,肯定要处理事务问题。

事务:原子性。我所有的动作,要么不执行,要么不全部执行成功。

比如说:张三给我转账100元。可以拆分为两个动作:张三账户减100,我的账户加100

消息队列和普通串行程序相比有哪些优缺点

传统串行化服务的缺点:     

1.  耦合性强(系统各个模块之间的耦合性)     

2.  系统吞吐量不大,耗时多

优点:系统架构简单,排查错误比较方便

你可能感兴趣的:(Java,java)