网站首页 > 技术文章 正文
AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。在RabbitMQ中有三个重要的部分,即:生产者、队列、消费者。
简介
1、生产者
生产者就是发送消息的程序,它的主要任务就是发送消息到队列。
2、队列
队列(queue)就是存放消息的位置,它的主要作用就是存储消息、转发消息。消息通过你的应用程序和 RabbitMQ 进行传输,它们能够只存储在一个队列(queue)中。 队列(queue)没有任何限制,你要存储多少消息都可以——基本上是一个无限的缓冲。多个生产者(producers)能够把消息发送给同一个队列,同样,多个消费者(consumers)也能够从同一个队列(queue)中获取数据。
3、消费者
消费者就是就收消息的程序,它的主要任务是获取消息。
如下示意图表示了RabbitMQ的工作流程:P代表生产者、C代表消费者、中间的红色部分代表队列。
注意:生产者、队列、消费者三个部分可以存在于三个服务器中,实际上对于大型的消息队列系统,这三个部分通常是部署在三个不同的地方的。
应用场景
RabbitMQ虽然是一个消息代理系统,但它的作用并不仅仅局限于发送消息,实际上RabbitMQ的常见应用有很多:
1、异步处理
我知道注册是很常见的功能,通常在用户注册后,需要发注册邮件和注册短信。传统的做法有两种:1、串行的方式;2.并行的方式。
串行方式就是用户需要等待注册信息添加到数据库,邮件和短信发送成功后,才可以收到响应。如下:
并行方式就是将注册信息写入数据库后,发送邮件的同时,发送短信,以上三个任务完成后,才将响应返回给用户。如下:
以上两种方式虽然可以完成注册,但都比较耗时。那么,RabbitMQ如何解决这个问题呢?
使用RabbitMQ,引入消息队列后,把发送邮件和发送短信等不是必须的业务逻辑进行异步处理,即待注册信息添加到数据库之后就立马返回响应。如下:
从图中可以看出,此种方案耗时相对于前两种方案,要少很多。
2、应用解耦
双11是购物的狂欢节,这一天各大电商平台订单暴增。一般在用户下单后,订单系统需要通知库存系统,传统的做法就是订单系统调用库存系统的接口来减少库存。如下:
这种做法有如下缺点:
当库存系统出现故障时,订单就会失败。
订单系统和库存系统高耦合.。
如果引入RabbitMQ,那么我们可以这样做:
订单系统:用户下单后,订单系统完成持久化处理,,将消息写入消息队列,返回用户订单下单成功。
库存系统:订阅下单的消息,获取下单消息,进行库操作。 就算库存系统出现故障,消息队列也能保证消息的可靠投递,不会导致消息丢失。
如下:
3、流量销峰
流量削峰一般在秒杀活动中应用广泛 。秒杀活动,一般会因为流量过大,导致应用挂掉,为了解决这个问题,一般在应用前端加入消息队列。 其作用如下:
可以控制活动人数,超过此一定阀值的订单直接丢弃
可以缓解短时间的高流量压垮应用(应用程序按自己的最大处理能力获取订单)
如下:
用户的请求,服务器收到之后,首先写入消息队列,加入消息队列长度超过最大值,则直接抛弃用户请求或跳转到错误页面.。秒杀业务根据消息队列中的请求信息,再做后续处理。
基础概念
ConnectionFactory、Connection、Channel都是RabbitMQ对外提供的API中最基本的对象。
Connection是RabbitMQ的socket链接,它封装了socket协议相关部分逻辑。
ConnectionFactory为Connection的制造工厂。
Channel是我们与RabbitMQ打交道的最重要的一个接口,我们大部分的业务操作是在Channel这个接口中完成的,包括定义Queue、定义Exchange、绑定Queue与Exchange、发布消息等。
本文转自互联网,如侵犯你的权益,请及时告知。
参考地址:http://blog.csdn.net/whoamiyang/article/details/54954780
猜你喜欢
- 2024-09-24 RabbitMQ宕机后,消息100%不会丢失吗
- 2024-09-24 非常强悍的 RabbitMQ 总结,写得真好
- 2024-09-24 在 WebApi 项目中快速开始使用 RabbitMQ
- 2024-09-24 RabbitMQ使用延迟插件,代码量直接降一半?
- 2024-09-24 RabbitMQ 高可用之镜像队列
- 2024-09-24 k8s上创建高可用RabbitMQ集群
- 2024-09-24 Centos7部署RabbitMQ的镜像队列集群
- 2024-09-24 docker分布式部署rabbitmq高可用集群
- 2024-09-24 详解如何用zabbix来监控rabbitmq消息队列服务
- 2024-09-24 rabbitMQ几种工作模式及策略分享
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)