消息中间件

消息中间件是在分布式系统中传送数据的组件。

消息中间件是否需要注册到注册中心 消息中间件是干嘛的_消息中间件是否需要注册到注册中心

  1. 消息中间件的定义?
    利用高效可靠的消息传递机制与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。
    消息中间件,全称为消息队列中间件,Mesage Queue Middleware,简称MQ。
    官方的解释比较拗口,其实就是用于程序间通信的一种手段,系统间通过消息传递完成交互。
  2. 消息中间件应用主要场景
  • 异步:有些业务不需要立即处理消息,可以异步处理,快速返回
  • 解耦:服务双方不需要知道彼此的存在,只要发布消息,消费消息即可
  • 削峰:消息中间件可以在峰值时堆积消息,不会因突发的超负荷请求而致使系统崩溃,在之后慢慢消费消息

在做微服务的时候,有一个重要的组件是config,如果需要动态更改配置需要用到Bus,而通知应用免重启更新配置文件就需要用到消息中间件解耦。

  1. 如何衡量一个消息中间件?
  • 服务性能:QPS级别是万级、十万级,时延(时效性)
  • 数据存储:存储在内存还是磁盘
  • 集群架构:保证高可用
  1. 消息中间件的传递模式:
  • 点对点(P2P):基于队列,生产者发送消息到队列,消费者从队列中接收消息
  • 发布/订阅(Pub/Sub):定义了如何向一个内容节点发布和订阅消息。
  1. 消息队列的缺点
  • 系统可用性降低:MQ挂了,系统无法运转了
  • 复杂性提升:设计的时候处处需要考虑MQ的协调
  • 一致性问题:消息丢失,重复消费

主流中间件

ActiveMQ

  • Apache出品,曾经最流行的开源消息中间件,完全支持JMS
  • 丰富的API、多种集群构建模式
  • 依赖Zookeeper,Master-Slave、NetWork模式

Kafka

  • 出自LinkedIn,开源于Apache
  • 借助了操作系统,最求高吞吐
  • 主要用于日志收集和传输
  • 存在消息重复消费、丢失等
  • 依赖Zookeeper

RocketMQ

  • 出自阿里,开源于Apache
  • 高吞吐,高可用,适合大规模分布式系统

RabbitMQ

  • 使用Erlang语言
  • 基于AMQP协议
  • 可靠性好,安全性高
  • 与Spring完善整合
  • 表达式配置,HA模式,镜像队列mirror queue

RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同应用之间共享数据。

RabbitMQ越来越受到追捧,还是跟它的表现分不开的:

  • 可靠性:使用了持久化、传输确认等
  • 灵活的路由:通过交换机路由消息
  • 扩展性:多个RabbitMQ节点可以方便地组成集群
  • 高可用性:集群中存在备份,部分节点失效时队列仍可用
  • 多客户端:支持多种语言的客户端,如Java、Python、Ruby、PHP等
  • 管理界面:有一个管理界面,可以监控和管理消息与集群
  • 插件:有多种插件,扩展很方便

AMQP

  1. RabbitMQ为什么选Erlang ?
  • Erlang有着和原生Socket一样的延迟
  1. AMQP是什么?
  • 高级消息队列协议:Advanced Message Queuing Protocol
  • 二进制协议,提供统一消息服务的应用层标准高级消息队列协议

AMQP 名词

  • Server:又称Broker,接受客户端连接
  • Connection:应用程序与Broker的网络连接
  • Channed:网络信道。消息读写的通道。
  • Message:消息。服务器和应用程序之间传送的数据,由Properties和Body组成
  • Virtual host:虚拟地址。用于逻辑隔离,最上层的消息路由
  • Binding:虚拟连接,Exchange和Queue之间的虚拟连接
  • Routing key:路由规则,虚拟机可用它来确定如何路由一个特定消息
  • Queue:消息队列,保存消息并将它们转发给消费者