什么是MQ
Message Query(MQ),消息队列中间件,很多初学者认为,MQ通过消息的发送和接受来实现程序的异步和解耦,mq主要用于异步操作,这个不是mq的真正目的,只不过是mq的应用,mq真正的目的是为了通讯。他屏蔽了复杂的通讯协议,像常用的dubbo,http协议都是同步的。
比如:A服务:java写的 B服务:c++写的
这两种协议很难实现 双端通讯,A调用B,B也可以主动调用A,而且不支持长连接。mq做的就是在这些协议上构建一个简单协议——生产者、消费者模型,mq带给我们的不是底层的通讯协议,而是更高层次的通讯模型。他定义了两个对象:发送数据的叫做生产者,接受消息的叫做消费者,我们可以无视底层的通讯协议,我们可以自己定义生产者消费者。
MQ的两种流派
1.有broker的
broker是什么,可以理解为是一个中转站。生产者将消息发送给他就结束自己的任务了,broker将消息主动推送给消费者(具体的将消息推送到哪个队列,或者说消费者主动请求)
1.消息来了主动放;
2.等比如订单服务去请求队列有没有消息的时候,再放。
如图解:
一个队列可以对应多个服务,一个服务也可以监听多个队列。如图就是定义了两个服务,来了两个队列的消息,就会通知两次订单服务,下两次订单,这时就有问题,就用到了分布式锁。
为了解决重复通知的问题:可以用分布式锁。
重topic
必须要有topic
kafka:全球消息处理性能最快的一款mq
rocketmq:阿里内部的一个大神根据kafka的执行原理手写的,性能与kafka差不多,但是功能上比kafka要多,比如说顺序消费。
轻topic
可以没有topic,topic只是一种中转模式
rabbitmq
2.无broker的
zeromq:没有使用broker,是直接使用socket进行通信。
长连接,靠socket连接。
什么是socket。socket主要用于即时通讯。socket是长连接。
传统的http请求随着服务端返回给客户端消息,两者之间的关联就消失了,所以服务端想要主动练习客户端就得靠轮询的方式,但是这种轮询比较耗费性能,既耗费客户端的性能,又耗费服务器资源,于是就有了长连接的概念。
客户端向服务端发了个在吗,服务器回客户端在。发在的前提是客户端先访问的服务端,如果服务端想直接访问客户端怎么办,
服务端想直接访问客户端:第一种方案:轮询
关于消息队列的思考:
比如说客户端每一秒钟向队列生产1万条消息,但是每一秒钟只能消费100条消息。怎么办?(消息堆积问题怎么解决)
方案一:可以增加消费者。
方案二:限流,先过滤掉一部分请求。
发送消息的时候加个限制。
穿插知识点
事务简单介绍
事务
只要涉及到消息队列,肯定要处理事务问题。
事务:原子性。我所有的动作,要么不执行,要么不全部执行成功。
比如说:张三给我转账100元。可以拆分为两个动作:张三账户减100,我的账户加100
消息队列和普通串行程序相比有哪些优缺点
传统串行化服务的缺点:
1. 耦合性强(系统各个模块之间的耦合性)
2. 系统吞吐量不大,耗时多
优点:系统架构简单,排查错误比较方便