消息队列-RabbitMQ

    MQ(Message Queue)消息队列,是基础数据结构中“先进先出”的一种数据结构。指把要传输的数据(消息)放在队列中,用队列机制来实现消息传递——生产者产生消息并把消息放入队列,然后由消费者去处理。消费者可以到指定队列拉取消息,或者订阅相应的队列,由MQ服务端给其推送消息

   大多应用中,可通过消息服务中间件来提升系统异步通信、扩展解耦能力。 消息的发送者和接收者不需要同时与消息队列交互。消息会保存在队列中,知道接收者取回它

消息队列-RabbitMQ_第1张图片

  • Producer:消息生产者,负责生产和发送消息到Broker;

  • Broker:消息处理中心,负责消息存储、确认、重试等;

  • Consumer:消息消费中心,负责从Broker中获取消息并处理。

消息队列-作用

  • 异步性:将耗时的同步任务通过发送消息的方式进行异步处理,减少等待时间。

  • 松耦合:不同系统、服务之间可以通过消息队列进行通信,不用关心彼此的实现细节,数据格式一致。

  • 分布式:为了防止消息堵塞,可以对消费者集群进行横向扩展,避免单点故障,同样队列本身也可以。

  • 可靠性:将接收到的消息落盘,就算服务器重启或者发生故障,恢复之后也能重新加载

MQ的缺点 

1、系统可用性降低。依赖服务越多,服务越容易挂掉。需要考虑MQ瘫痪的情况

2、系统复杂性提高。需要考虑消息丢失、消息重复消费、消息传递的顺序性

3、业务一致性。主业务和从属业务一致性的处理

 RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue Protocol)的开源实现。

Message

  • 消息,消息是不具名的,它由消息头和消息体组成

  • 消息头,包括routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等

    Publisher

  • 消息的生产者,也是一个向交换器发布消息的客户端应用程序

Exchange

Exchange是一个比较重要的概念,它是消息到达RabbitMQ的第一站,主要负责根据不同的分发规则将消息分发到不同的Queue,供订阅了相关Queue的消费者消费到指定的消息。类型有direct(默认),fanout, topic, 和headers,具有不同转发策略

Routing key,翻译成中文就是路由键。当我们创建好Exchange和Queue之后,需要使用Routing key(通常叫作Binding key)将它们绑定起来,producer在向Exchange发送一条消息的时候,必须指定一个Routing key,然后Exchange接收到这条消息之后,会解析Routing key,然后根据Exchange和Queue的绑定规则,将消息分发到符合规则的Queue中。

Queue(队列)

Queue是一个用来存放消息的队列,生产者发送的消息会被放到Queue中,消费者消费消息时也是从Queue中取走消息。

Binding

  • 绑定,用于消息队列和交换器之间的关联

Connection

  • 网络连接,比如一个TCP连接

Channel

  • 信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内的虚拟连接,AMQP命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成的。因为对于操作系统来说建立和销毁TCP都是非常昂贵的开销,所以引入了信道的概念,以复用一条TCP连接。

  • Channel是在Connection的基础上建立的虚拟连接,RabbitMQ中大部分的操作都是使用Channel完成的。例如:声明Queue、声明Exchange、发布消息、消费消息等。

Consumer

  • 消息的消费者,表示一个从消息队列中取得消息的客户端应用程序

核心概念之Virtual host(虚拟主机)

Virtual host是一个虚拟主机的概念,一个Broker中可以有多个Virtual host,每个Virtual host都有一套自己的Exchange和Queue,同一个Virtual host中的Exchange和Queue不能重名,不同的Virtual host中的Exchange和Queue名字可以一样。这样,不同的用户在访问同一个RabbitMQ Broker时,可以创建自己单独的Virtual host,然后在自己的Virtual host中创建Exchange和Queue,很好地做到了不同用户之间相互隔离的效果

Broker

  • 消息队列服务器实体

  • Broker表示RabbitMQ服务,每个Broker里面至少有一个Virtual host虚拟主机;每个虚拟主机中有自己的Exchange交换机、Queue队列;Exchange与Queue之间通过RoutingKey形成绑定关系Binding。producer(生产者)和consumer(消费者)通过与Broker建立Connection来保持连接,然后在Connection的基础上建立若干Channel信道,用来发送与接收消息

  • 消息队列-RabbitMQ_第2张图片

你可能感兴趣的:(消息中间件,java-rabbitmq,rabbitmq,java)