消息队列中间件及RabbitMQ简介
来源:互联网 发布:大学生数据统计分析 编辑:程序博客网 时间:2024/06/07 05:13
什么是消息队列中间件?
消息队列可以让各个应用之间使用发送消息这种方式来进行信息的传递,并且当目标应用正忙或者连接失败的时候,消息队列会提供一个暂时存储这些消息的空间,当目标应用可以工作时,从消息队列取出消息进行处理。
为什么要使用消息队列中间件?
平常在业务场景中,在客户端的一个行为通常会触发一系列的消息。例如,在用户登录客户端后,后台需要验证用户的登录信息,拉取用户的头像,用户昵称等,那么这些一系列的消息应该采用一种什么样的方式进行工作呢?
1. 串行工作方式。先从DB中拉取用户的头像,再从DB中拉取用户昵称等基本信息,结束后返回给客户端,但是会导致很大的网络延时。
2. 并行工作方式。同时拉取用户头像和昵称等基本信息,再返回至客户端,很好,我们缩短了一半时间了。
3. 异步方式。想象一下工作场景,用户的操作跟后台拉取头像和昵称一定有关吗?用户浏览新闻为什么一定要等拉取完用户昵称之后再开始?那么这个时候采用异步的方式就很有必要了,即客户端消息的发送不影响主逻辑的实现。这个时候,我们的消息队列中间件就闪亮登场了。
消息队列中间件简介
明确一些基本概念:
1. 队列:这里面存放着一堆待处理的事情。
2. 消息:发送方和接收方之间是通过消息来进行数据的传递,例如上述场景中的拉取用户昵称。
那么,消息队列就是存放着一堆待处理消息的大池子,客户端我们叫做生产者(producer),负责消息生产并扔进队列中,接收端我们叫做消费者(consumer),负责从队列中取消息并进行消息处理。
再说一下消息队列的解耦(Decoupling )。这个网上有资料讲,看文末参考资料。即两个应用之间完全不需要对方是怎么实现的,发送方只需要进行消息的发送和接受即可。如下图:
消息队列有很多种,常用的RabbitMQ,Kafka,ActiveMQ等。像国内很多大公司使用的消息队列也是在这些开源的消息队列上进行修改的。
RabbitMQ 简介
什么是RabbitMQ ?
消息队列的一种,使用了AMQP协议进行实现,AMQP是异步消息所使用的应用层协议规范,即可以无视消息的来源,只负责消息的转发,发送方和接收方可以不认识,可以使用不同的语言,rabbitMQ内部结构如下:
均是网上的图片,大家对比着看更清楚一些。
可以看到RabbitMQ内部有两个重要的东西:exchange和queue。
exchange主要负责消息的分发,即每个消息应该转发到哪一个queue上。queue负责消息的持久化保存,暂存队列等。有三种类型的exchange:direct exchange,topic exchange,fanout exchange。
direct exchange:根据routing key来决定消息进入哪一个队列,如果没有指定key,那么该消息会被抛弃,此类型exchange不需要和queue进行绑定。
topic exchange:消息会有一个routing key,通过通配符匹配决定发送到哪个队列上。例如routing key为hello,world,会被转发到hello#和#world这两个队列上。
fanout exchange:无需key值,但是要求在创建时就酱exchange和queue进行绑定。消息会分发给指定的queue。
还需要清楚的概念:
connection(连接):客户端和rabbitMQ的一个TCP连接。
channel(通道):一个虚拟连接,你生产或消费一条消息的时候,都要经过channel。
以下为从生产者到消费者的流程:
1. 在你的客户端和rabbitMQ之间建立一个tcp Connection;
2. 打开一个channel,channel建立时基于tcp Connection,也就是说,Connection,再建立channel;
3. 声明并创建一个队列。创建队列前需要先声明,免得队列已经存在;
4. 初始化exchange,并将exchange与queue进行绑定,
5. 生产者生产消息;
6. 消费者从队列中取消息处理;
7. Connection关闭。
当然rabbitMQ还有很多值得优化的地方,推荐看这篇:https://www.qcloud.com/community/article/164816001481011847 ,讲了rabbitMQ更细节的一些东西。
参考资料:
https://www.cloudamqp.com/blog/2014-12-03-what-is-message-queuing.html
https://www.cloudamqp.com/blog/2015-05-18-part1-rabbitmq-for-beginners-what-is-rabbitmq.html
http://hwcrazy.com/34195c9068c811e38a44000d601c5586/be62fc2668c811e3adba000d601c5586/
http://blog.csdn.net/sun305355024sun/article/details/41913105
- 消息队列中间件及RabbitMQ简介
- 消息中间件以及RabbitMQ简介
- 常见消息队列中间件RabbitMQ介绍
- 【中间件】消息队列(一):RabbitMQ、ActiveMQ、Kafka和Redis
- 消息中间件RabbitMQ
- 消息中间件之RabbitMQ
- 消息中间件RabbitMQ 初探
- 使用rabbitmq消息中间件
- rabbitMQ消息中间件
- 消息中间件原理及JMS简介
- 消息中间件原理及JMS简介
- 消息中间件原理及JMS简介(1)
- 消息中间件原理及JMS简介(2)
- 消息中间件原理及JMS简介之一
- 消息中间件原理及JMS简介(2)
- 消息中间件原理及JMS简介
- 消息中间件原理及JMS简介之一
- 消息中间件原理及JMS简介
- mySQL之约束条件
- java面向对象(二)之继承
- 关于js浅拷贝深拷贝的思考
- “#if 0/#if 1 ... #endif”的作用
- 求int型正整数在内存中存储时1的个数(进制转换与读取二进制每一位)
- 消息队列中间件及RabbitMQ简介
- getCacheDir()、getFilesDir()、getExternalFilesDir()、getExternalCacheDir()区别
- C++ vector 内存分配与回收机制
- RecyclerView优点
- 【C++】不能将“this”指针从“const vector”转换为“vector & rhs"
- 【WeChat】微信页面弹出键盘后iframe内容变空白
- dao、po、vo等服务器对象解析
- Oracle 11g体系结构
- Qt学习之旅---1.简单控件