消息中间件之rabbit mq

公司用的消息中间件是rabbit mq 并在此基础上进行了一些封装  故而进行研究一番。

官方文档学习基础知识

rabbit mq 运行在erlang环境之上,所以对应erlang支持的平台环境  rmq都支持

以下的平台是Erlang语言所支持的,因此RabbitMQ可以运行其上:

  • Solaris
  • BSD
  • Linux
  • MacOSX
  • TRU64
  • Windows NT/2000/XP/Vista/Windows 7/Windows 8
  • Windows Server 2003/2008/2012
  • Windows 95, 98
  • VxWorks

总结:主要是说明erlang和rabbit mq的关系 类似jvm和java的关系吧;跨平台特性的实现。

基础概念:

AMQP(高级消息队列协议)是一个网络协议。它支持符合要求的客户端应用(application)和消息中间件代理(messaging middleware broker)之间进行通信。是一个基于TCP长连接的应用层协议。

消息代理(message brokers)从发布者(publishers)亦称生产者(producers)那儿接收消息,并根据既定的路由规则把接收到的消息发送给处理消息的消费者(consumers)。

由于AMQP是一个网络协议,所以这个过程中的发布者,消费者,消息代理 可以存在于不同的设备上。

AMQP 0-9-1的工作过程如下图:消息(message)被发布者(publisher)发送给交换机(exchange),交换机常常被比喻成邮局或者邮箱。然后交换机将收到的消息根据路由规则分发给绑定的队列(queue)。最后AMQP代理会将消息投递给订阅了此队列的消费者,或者消费者按照需求自行获取。

enter image description here

消息的生产者也称为发布者,先与mq服务建立连接,将消息发布到交换机,交换机根据和队列建立的绑定规则和不同的路由方案将消息发送给不同的队列,队列中的消息通过两种方式给消费者进行消费:1.队列主动分发push 2.消费者监听队列根据需要进行消息获取。为了防止消费者消费失败导致消息丢失,消息消费有两种方式:1.自动应答,消息一旦投递给消费者,就将消息删除。 2.消费者主动应答,关闭自动应答模式,只有消费者消费消息成功并进行回执的时候,队列才会将消息删除,这样确保消息被消费成功。为了保证mqserver中的消息不会因为重启导致消息丢失,可以根据需求设置消息持久化;

交换机和交换机类型:

交换机是用来发送消息的AMQP实体。交换机拿到一个消息之后将它路由给一个或零个队列。它使用哪种路由算法是由交换机类型和被称作绑定(bindings)的规则所决定的

Name(交换机类型) Default pre-declared names(预声明的默认名称)
Direct exchange(直连交换机) (Empty string) and amq.direct
Fanout exchange(扇型交换机) amq.fanout
Topic exchange(主题交换机) amq.topic
Headers exchange(头交换机) amq.match (and amq.headers in RabbitMQ)

除交换机类型外,在声明交换机时还可以附带许多其他的属性,其中最重要的几个分别是:

  • Name
  • Durability (消息代理重启后,交换机是否还存在)
  • Auto-delete (当所有与之绑定的消息队列都完成了对此交换机的使用后,删掉它)
  • Arguments(依赖代理本身)

交换机可以有两个状态:持久(durable)、暂存(transient)。持久化的交换机会在消息代理(broker)重启后依旧存在,而暂存的交换机则不会(它们需要在代理再次上线后重新被声明)。然而并不是所有的应用场景都需要持久化的交换机。

1.默认交换机

默认交换机(default exchange)实际上是一个由消息代理预先声明好的没有名字(名字为空字符串)的直连交换机(direct exchange。每个新建队列(queue)都会自动绑定到默认交换机上,绑定的路由键(routing key)名称与队列名称相同。

举个栗子:当你声明了一个名为"search-indexing-online"的队列,AMQP代理会自动将其绑定到默认交换机上,绑定(binding)的路由键名称也是为"search-indexing-online"。因此,当携带着名为"search-indexing-online"的路由键的消息被发送到默认交换机的时候,此消息会被默认交换机路由至名为"search-indexing-online"的队列中。换句话说,默认交换机看起来貌似能够直接将消息投递给队列,尽管技术上并没有做相关的操作。

2.直连交换机

直连型交换机(direct exchange)是根据消息携带的路由键(routing key)将消息投递给对应队列的

直连交换机经常用来循环分发任务给多个工作者(workers)。当这样做的时候,我们需要明白一点,在AMQP 0-9-1中,消息的负载均衡是发生在消费者(consumer)之间的,而不是队列(queue)之间。

直连型交换机图例:
enter image description here

3.扇形交换机

扇型交换机(funout exchange)将消息路由给绑定到它身上的所有队列,而不理会绑定的路由键。

扇型用来交换机处理消息的广播路由(broadcast routing)扇型交换机投递消息的拷贝到所有绑定到它的队列

扇型交换机图例:
enter image description here

其他类型请自行了解。

绑定:

绑定(Binding)是交换机(exchange)将消息(message)路由给队列(queue)所需遵循的规则

绑定操作需要定义一个可选的路由键(routing key)属性给某些类型的交换机。路由键的意义在于从发送给交换机的众多消息中选择出某些消息,将其路由给绑定的队列。

打个比方:

  • 队列(queue)是我们想要去的位于纽约的目的地
  • 交换机(exchange)是JFK机场
  • 绑定(binding)就是JFK机场到目的地的路线。能够到达目的地的路线可以是一条或者多条

拥有了交换机这个中间层,很多由发布者直接到队列难以实现的路由方案能够得以实现,并且避免了应用开发者的许多重复劳动。

通道

有些应用需要与AMQP代理建立多个连接。无论怎样,同时开启多个TCP连接都是不合适的,因为这样做会消耗掉过多的系统资源并且使得防火墙的配置更加困难。AMQP 0-9-1提供了通道(channels)来处理多连接,可以把通道理解成共享一个TCP连接的多个轻量化连接。

在涉及多线程/进程的应用中,为每个线程/进程开启一个通道(channel)是很常见的,并且这些通道不能被线程/进程共享。

一个特定通道上的通讯与其他通道上的通讯是完全隔离的,因此每个AMQP方法都需要携带一个通道号,这样客户端就可以指定此方法是为哪个通道准备的。

rabbitmq

解耦、异步、削峰是其三大特点。

发布了23 篇原创文章 · 获赞 0 · 访问量 2930

猜你喜欢

转载自blog.csdn.net/kris_lh123/article/details/103711044
今日推荐