目录
1、对计算机有初步了解的人都知道,队列是个什么玩意,它就像一个管道一样先进先出。
那么我们来了解一下消息队列是个啥玩意吧!!!
概念
2、Message Query(MQ),消息队列中间件,很多初学者认为,MQ通过消息的发送和接受来实现程序的异步和解耦,mq主要用于异步操作,这个不是mq的真正目的,只不过是mq的应用,mq真正的目的是为了通讯。他屏蔽了复杂的通讯协议,像常用的dubbo,http协议都是同步的。这两种协议很难实现双端通讯,A调用B,B也可以主动调用A,而且不支持长连接。mq做的就是在这些协议上构建一个简单协议——生产者、消费者模型,mq带给我们的不是底层的通讯协议,而是更高层次的通讯模型。他定义了两个对象:发送数据的叫做生产者,接受消息的叫做消费者,我们可以无视底层的通讯协议,我们可以自己定义生产者消费者。
例子比较
我们以淘宝订单为例,比较传统串行服务和引入消息队列多的区别
传统串行服务
如果我们想买一个东西,那么需要经过以上的几个步骤,完成之后,才会给我们发送成功信号,消耗的时间是长的,并且十分容易引发错误,当网络波荡的时候,就会导致任务失败。
传统串行服务的优点:系统架构简单,排查错误比较容易
传统串行服务的缺点:1.耦合性太强 2.系统吞吐量不大,耗时多
引入消息队列
引入消息队列后,当在处理新订单是,只要消息发送到消息队列上,我们客户端就能收到订单成功的消息。剩下的处理操作,由消息队列来处理。大大减少了耗时。并且后面的操作之间也不会相互影响。因为他们进行的异步操作。这就降低了耦合性,提高了性能。
这里我们要思考一个问题:
如何解决重复通知,一个服务订阅多个队列的问题?
使用分布式锁,当一个消息队列被一个服务订阅以后,就会给消息队列加上锁,其他的服务就不能在订阅了。
事务
只要涉及到消息队列,肯定要处理事务问题。
事务:原子性,我所有的动作要么都执行,要么都不执行。
比如说:张三给我转100元,可以分成两部分,张三账户减100,我账户加100
socket
1、socket用于即时通讯。socket是长连接。
2、传统的http请求,随着服务端的返回给客户端消息,两者之间的关联就消失了,所以服务端想要主动联系客户端就得靠轮询的方式,但是这种轮询比较耗费性能的,既要消耗客户端性能,又消耗服务器资源,于是有了长连接的概念。
MQ的两种流派
1、有broker
broker是一个中转站,为了将消息放到不同的队列里。存放方式有两种:
(1)消息来了主动放
(2)等待消息请求
有broker的也分为两类
1、重topic
kafka:全球消息处理性能最快的一款mq
rocket:阿里内部的一个大神根据kafka的执行原理手写的,性能与kafka差不多,但是功能 上比kafka要多,比如说顺序消费。
2、轻topic
可以没有topic,topic只是一种中转模式
rabbitmq
2、无broker
zeromq:没有使用broker,是直接使用socket进行通信。
kafka的基本概念
kafka是一个分布式的分区的消息,提供消息系统应该具备的功能。
名称 |
解释 |
broker |
消息中间件处理节点,一个broker就是一个kafka节点,多个broker构成一个kafka集群。 |
topic |
kafka根据消息进行分类,发布到kafka的每个消息都有一个对应的topic |
producer |
消息生产(发布)者 |
consumer |
消息消费(订阅)者 |
consumergroup |
消息订阅集群,一个消息可以被多个consumergroup消费,但是一个consumergroup只有一个consumer可以消费消息。 |
kafka的安装
可以来看这篇博客
http://t.csdn.cn/LYJ3b
关于消息队列的思考:
了解了消息队列,现在让我们来思考一个消息队列的问题,也是经典的消息堆积问题,比如说客户端每秒生产10000条消息,但是消费者每秒消耗100条。
-------------------------------------------------------------
|
|
|
|
|
答案:
1、增加消费者,既然消费不了,那么就多找几个消费者,来完成消费
2、限流,限制客户端每秒产生消息的数量。