介绍什么是AMQP高级消息队列协议和MQTT科普

DBC 1.7K 0
    • JMS或者NMS都没有标准的底层协议,它们可以在任何底层协议上运行,但是API是与编程语言绑定的,AMQP解决了这个问题,它使用了一套标准的底层协议背景

     

  • 什么是AMQP
    • AMQP(advanced message queuing protocol)在2003年时被提出,最早用于解决金融领不同平台之间的消息传递交互问题,就是是一种协议,兼容JMS
    • 更准确说的链接协议 binary- wire-level-protocol 直接定义网络交换的数据格式,类似http
    • 具体的产品实现比较多,RabbitMQ就是其中一种

介绍什么是AMQP高级消息队列协议和MQTT科普插图

  • 特性
    • 独立于平台的底层消息传递协议
    • 消费者驱动消息传递
    • 跨语言和平台的互用性、属于底层协议
    • 有5种交换类型direct,fanout,topic,headers,system
    • 面向缓存的、可实现高性能、支持经典的消息队列,循环,存储和转发
    • 支持长周期消息传递、支持事务(跨消息队列)

       

  • AMQP和JMS的主要区别
    • AMQP不从API层进行限定,直接定义网络交换的数据格式,这使得实现了AMQP的provider天然性就是跨平台
    • 比如Java语言产生的消息,可以用其他语言比如python的进行消费
    • AQMP可以用http来进行类比,不关心实现接口的语言,只要都按照相应的数据格式去发送报文请求,不同语言的client可以和不同语言的server进行通讯
    • JMS消息类型:TextMessage/ObjectMessage/StreamMessage等
    • AMQP消息类型:Byte[]

 

  • 科普:大家可能也听过MQTT
    • MQTT: 消息队列遥测传输(Message Queueing Telemetry Transport )
    • 背景:
      • 我们有面向基于Java的企业应用的JMS和面向所有其他应用需求的AMQP,那这个MQTT是做啥的?
    • 原因
      • 计算性能不高的设备不能适应AMQP上的复杂操作,MQTT它是专门为小设备设计的
      • MQTT主要是是物联网(IOT)中大量的使用
    • 特性
      • 内存占用低,为小型无声设备之间通过低带宽发送短消息而设计
      • 不支持长周期存储和转发,不允许分段消息(很难发送长消息)
      • 支持主题发布-订阅、不支持事务(仅基本确认)
      • 消息实际上是短暂的(短周期)
      • 简单用户名和密码、不支持安全连接、消息不透明

 

 

 

 

 

 

 

 

第4集 架构师的解决方案-业界主流消息队列和技术选型讲解

简介:对比当下主流的消息队列和选择问题

  • 业界主流的消息队列:Apache ActiveMQ、Kafka、RabbitMQ、RocketMQ
    • ActiveMQ:http://activemq.apache.org/
      • Apache出品,历史悠久,支持多种语言的客户端和协议,支持多种语言Java, .NET, C++ 等
      • 基于JMS Provider的实现
      • 缺点:吞吐量不高,多队列的时候性能下降,存在消息丢失的情况,比较少大规模使用
    • Kafka:http://kafka.apache.org/
      • 是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理大规模的网站中的所有动作流数据(网页浏览,搜索和其他用户的行动),副本集机制,实现数据冗余,保障数据尽量不丢失;支持多个生产者和消费者
      • 类似MQ,功能较为简单,主要支持简单的MQ功能
      • 缺点:不支持批量和广播消息,运维难度大,文档比较少, 需要掌握Scala
    • RocketMQ:http://rocketmq.apache.org/
      • 阿里开源的一款的消息中间件, 纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点, 性能强劲(零拷贝技术),支持海量堆积, 支持指定次数和时间间隔的失败消息重发,支持consumer端tag过滤、延迟消息等,在阿里内部进行大规模使用,适合在电商,互联网金融等领域
      • 基于JMS Provider的实现
      • 缺点:社区相对不活跃,更新比较快,纯java支持
    • RabbitMQ:http://www.rabbitmq.com/
      • 是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、C、用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不错
      • 缺点:使用Erlang开发,阅读和修改源码难度大
  • 简介:介绍RabbitMQ消息队列
    • RabbitMQ:http://www.rabbitmq.com/
      • 是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、C、用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不错,与SpringAMQP完美的整合、API丰富易用
      • 文档:https://www.rabbitmq.com/getstarted.html
    • 核心概念, 了解了这些概念,是使用好RabbitMQ的基础

      介绍什么是AMQP高级消息队列协议和MQTT科普插图2

       

      • Broker
        • RabbitMQ的服务端程序,可以认为一个mq节点就是一个broker
      • Producer生产者
        • 创建消息Message,然后发布到RabbitMQ中
      • Consumer消费者:
        • 消费队列里面的消息
      • Message 消息
        • 生产消费的内容,有消息头和消息体,也包括多个属性配置,比如routingKey路由键
      • Queue 队列
        • 是RabbitMQ 的内部对象,用于存储消息,消息都只能存储在队列中
      • Channel 信道
        • 一条支持多路复用的通道,独立的双向数据流通道,可以发布、订阅、接收消息。
        • 信道是建立在真实的TCP连接内的虚拟连接,复用TCP连接的通道
      • Connection连接
        • 是RabbitMQ的socket链接,它封装了socket协议相关部分逻辑,一个连接上可以有多个channel进行通信
      • Exchange 交换器
        • 生产者将消息发送到 Exchange,交换器将消息路由到一个或者多个队列中,里面有多个类型,后续再一一介绍,队列和交换机是多对多的关系。
      • RoutingKey 路由键
        • 生产者将消息发给交换器的时候,一般会指定一个RoutingKey,用来指定这个消息的路由规则
        • 最大长度255 字节
      • Binding 绑定
        • 通过绑定将交换器与队列关联起来,在绑定的时候一般会指定一个绑定键 ( BindingKey ),这样 RabbitMQ 就知道如何正确地将消息路由到队列了
      • Virtual host 虚拟主机
        • 用于不同业务模块的逻辑隔离,一个Virtual Host里面可以有若干个Exchange和Queue,同一个VirtualHost 里面不能有相同名称的Exchange或Queue
        • 默认是 /
          • /dev
          • /test
          • /pro

发表评论 取消回复
表情 图片 链接 代码

分享