热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AMQP的应用场景

1.什么是AMQP?在异步通讯中,消息不会立刻到达接收方,而是被存放到一个容器中,当满

1. 什么是AMQP?

在异步通讯中,消息不会立刻到达接收方,而是被存放到一个容器中,当满足一定的条件之后,消息会被容器发送给接收方,这个容器即消息队列,而完成这个功能需要双方和容器以及其中的各个组件遵守统一的约定和规则,AMQP就是这样的一种协议,消息发送与接受的双方遵守这个协议可以实现异步通讯。这个协议约定了消息的格式和工作方式。


2. 为什么使用AMQP

  为什么使用AMQP或者AMQP解决了什么问题?

  在分布式的系统中,子系统之间如果使用socket连接进行通讯,有很多问题需要解决。比如:

  1)信息的发送者和接受者如何维持这个连接?如果一方中断,这期间的数据如何防止丢失?

  2)如何降低发送者和接受者的耦合度?

  3)如何让优先级高的接受者先接到数据?

  4)如何做到load balance? 均衡接受者的负载?高并发场景

  5)如何将信息发送到相关的接收者,如果接受者订阅了不同的数据,如何正确的分发到接受者?

  6)如何做到可扩展,将通信模块发到集群上去?异构系统

  7)如何保证接受者接到了完整,正确或是有序的数据? 

AMQP解决了这些问题。与此同时,基于AMQP实现的产品相比其他类似产品(AcitveMQ)有着自己的特点。基于AMQP的RabbitMQ具有路由灵活,消息可靠等特点,如果路由策略多样化和消息需要可靠传输的需求的情况下可考虑使用基于AMQP的产品。


3. AMQP 的模型和原理

3.1 AMQP 中包含的主要元素

生产者(Producer):向Exchange发布消息的应用。 消费者(Consumer):从消息队列中消费消息的应用。 

消息队列(Message Queue):服务器组件,用于保存消息,直到发送给消费者。 消息(Message):传输的内容。 

交换器(exchange):路由组件,接收Producer发送的消息,并将消息路由转发给消息队列。 

虚拟主机(Virtual Host): 一批交换器,消息队列和相关对象。虚拟主机是共享相同身份认证和加密环境的独立服务器域。 

Broker :AMQP的服务端称为Broker。 

连接(Connection):一个网络连接,比如TCP/IP套接字连接。 

信道(Channel):多路复用连接中的一条独立的双向数据流通道,为会话提供物理传输介质。 

绑定器(Binding):消息队列和交换器直接的关联。

3.2 AMQP 的组件结构图

 

3.3 AMQP 如何实现通信的

1)建立连接Connection。由producer和consumer创建连接,连接到broker的物理节点上。

2)建立消息Channel。Channel是建立在Connection之上的,一个Connection可以建立多个Channel。

 producer连接Virtual Host 建立Channel,Consumer连接到相应的queue上建立Channel。

3)发送消息。由Producer发送消息到Broker中的exchange中。

4)路由转发。exchange收到消息后,根据一定的路由策略,将消息转发到相应的queue中去。

5)消息接收。Consumer会监听相应的queue,一旦queue中有可以消费的消息,queue就将消息发送给Consumer端。

6)消息确认。当Consumer完成某一条消息的处理之后,需要发送一条ACK消息给对应的Queue。Queue收到ACK信息后,才会认为消息处理成功,并将消息从Queue中移除;如果在对应的Channel断开后,Queue没有收到这条消息的ACK信息,该消息将被发送给另外的Channel。至此一个消息的发送接收流程走完了。消息的确认机制提高了通信的可靠性。

 

  3.4 exchange 与 Queue 的路由机制

exchange 将消息发送到哪一个queue是由exchange type 和bing 规则决定的,目前常用的有3种exchange,

Direct exchange, Fanout exchange, Topic exchange 。

Direct exchange 直接转发路由,其实现原理是通过消息中的routkey,与queue 中的routkey 进行比对,若二者匹配,则将消息发送到这个消息队列。   Fanout exchange

    复制分发路由,该路由不需要routkey,当exchange收到消息后,将消息复制多份转发给与自己绑定的消息队列。

    topic exchange 通配路由,是direct exchange的通配符模式,消息中的routkey可以写成通配的模式,exchange

   支持“#”和“*” 的通配。收到消息后,将消息转发给所有符合匹配表达式的queue。

需要注意的一点只有queue具有保持消息的功能,exchange不能保存消息。


4. AQMP 的应用场景

AQMP是实现消息机制的一种协议,消息队列主要有以下几种应用场景:

4.1 异步处理

比如公司新入职一个员工,需要开通系统账号,有几件事情要做,开通系统账号,发短信通知用户,发邮件给员工,在公司内部通讯系统中发送消息给员工。其中发短信,发邮件,发内部通讯系统消息,这三件事情可以串行也可以并行,并行的好处就是可以提高效率,这时可以应用MQ来实现并行。

4.2 应用解耦

在公司内部系统中,有人事系统,OA系统,财务系统,外围应用系统等等,当人事发生变动的时候(离职入职调岗),人事系统需要将这些变动通知给其他系统,这时只需人事系统发送一条消息,各个外围系统订阅该消息,就可得知人事变动,与实时服务调用相比,如果人事系统挂掉,各个外围系统不会受到影响,继续运行。

4.3 流量缓冲

在有些流量会瞬间暴增的场景下,如秒杀,为了防止流量突然增大而使得应用挂掉,可以引入MQ,将请求存入MQ中,如果超过了MQ的长度,就把请求丢弃掉,这样来限制流量。

4.4 日志处理

将消息队列引入到日志处理中,如kafka的应用,解决了大量日志的传输问题。日志客户端(生产者)负责采集日志数据,并定期写入kafka队列,kafka负责接收,存储和转发日志,日志处理系统(消费者)订阅并消费kafka中的日志数据。

5. AMQP 与 RabbitMQ

AMQP 是一种协议, RabbitMQ是一个由erlang开发的AMQP的开源实现,目前使用比较广泛的MQ有RabbitMQ,ActiveMQ,KafKa等等,其中ActiveMQ是基于JMS的一个开源实现,JMS 是一个接口标准或者说是一个API消息服务的规范(JAVA Message Service,java消息服务),KafKa是一种高吞吐量的分布式发布订阅消息系统,通常有吞吐量需求的日志处理和日志聚合应用会使用Kafka,性能要优于Rabbit,但是稳定性和可靠性相对而言RabbitMQ要成熟一些。

 




推荐阅读
  • 本文详细介绍了如何使用OpenSSL自建CA证书的步骤,包括准备工作、生成CA证书、生成服务器待签证书以及证书签名等过程。 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • 本文详细介绍了 com.apollographql.apollo.api.internal.Optional 类中的 orNull() 方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
  • RocketMQ在秒杀时的应用
    目录一、RocketMQ是什么二、broker和nameserver2.1Broker2.2NameServer三、MQ在秒杀场景下的应用3.1利用MQ进行异步操作3. ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • 使用ArcGIS for Java和Flex浏览自定义ArcGIS Server 9.3地图
    本文介绍了如何在Flex应用程序中实现浏览自定义ArcGIS Server 9.3发布的地图。这是一个基本的入门示例,适用于初学者。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • 阿里巴巴终面技术挑战:如何利用 UDP 实现 TCP 功能?
    在阿里巴巴的技术面试中,技术总监曾提出一道关于如何利用 UDP 实现 TCP 功能的问题。当时回答得不够理想,因此事后进行了详细总结。通过与总监的进一步交流,了解到这是一道常见的阿里面试题。面试官的主要目的是考察应聘者对 UDP 和 TCP 在原理上的差异的理解,以及如何通过 UDP 实现类似 TCP 的可靠传输机制。 ... [详细]
author-avatar
Yao2524_420
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有