RabbitMQ简单认识

一、简介

RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:PythonRuby.NETJavaJMSCPHPActionScriptXMPPSTOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

二、协议

AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。

三、基本概念

Exchange:交换机,决定了消息路由规则;

Queue:消息队列;

Channel:进行消息读写的通道;

Bind:绑定了QueueExchange,意即为符合什么样路由规则的消息,将会放置入哪一个消息队列;

四、使用过程

消息队列的使用过程大概如下:

1)客户端连接到消息队列服务器,打开一个channel

2)客户端声明一个exchange,并设置相关属性。

3)客户端声明一个queue,并设置相关属性。

4)客户端使用routing key,在exchangequeue之间建立好绑定关系。

5)客户端投递消息到exchange

五、Exchange类型

exchange有几种类型

1、完全根据key进行投递的叫做Direct交换机,例如,绑定时设置了routing key为”abc”,那么客户端提交的消息,只有设置了key为”abc”的才会投递到队列。

2、对key进行模式匹配后进行投递的叫做Topic交换机,符号”#”匹配一个或多个词,符号”*”匹配正好一个词。例如”abc.#”匹配”abc.def.ghi”,”abc.*”只匹配”abc.def”。

3、还有一种不需要key的,叫做Fanout交换机,它采取广播模式,一个消息进来时,投递到与该交换机绑定的所有队列。

4headers类型的Exchange不依赖于routing keybinding key的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配。

六、持久化

RabbitMQ支持消息的持久化,为了数据安全考虑,我想大多数用户都会选择持久化。消息队列持久化包括3个部分:
1exchange持久化,在声明时指定durable => 1
2queue持久化,在声明时指定durable => 1
3)消息持久化,在投递时指定delivery_mode => 21是非持久化)

七、应用场景

RabbitMQ是一个消息代理,从“生产者”接收消息并传递消息至“消费者”。

“生产者”也即message发送者以下简称P,相对应的“消费者”乃message接收者以下简称C

message通过queuePC,多个P可向同一queue发送message,多个C可从同一个queue接收message

  • Hello Word

一个Pqueue发送一个message,一个C从该queue接收message并打印。

 

  •  work queues

将耗时的消息处理通过队列分配给多个consumer来处理,我们称此处的consumerworker,我们将此处的queue称为Task Queue,其目的是为了避免资源密集型的task的同步处理,也即立即处理task并等待完成。相反,调度task使其稍后被处理。也即把task封装进message并发送到task queueworker进程在后台运行,从task queue取出task并执行job,若运行了多个worker,则task可在多个worker间分配。

 

 

  •  Publish/Subscribe

在应用场景2中一个message(task)仅被传递给了一个comsumer(worker)。现在我们设法将一个message传递给多个consumer。这种模式被称为publish/subscribe。此处以一个简单的日志系统为例进行说明。该系统包含一个log发送程序和一个log接收并打印的程序。由log发送者发送到queue的消息可以被所有运行的log接收者接收。因此,我们可以运行一个log接收者直接在屏幕上显示log,同时运行另一个log接收者将log写入磁盘文件。

 

 

  • Routing

应用场景3中构建了简单的log系统,可以将log message广播至多个receiver。现在我们将考虑只把指定的message类型发送给其subscriber,比如,只把error message写到log file而将所有log message显示在控制台。

 

 

  •  topic

topic类型的exchangerouting_key中可以包含两个特殊字符:“*”用于替代一个词,“#”用于0个或多个词。

 

 

八、资源与管理

   管理界面与http api

    curl -i -u guest:guest http://localhost:15672/api/vhosts

   命令行

    rabbitmqctl status

    rabbitmqctl list_users  

    rabbitmq-plugins list

    rabbitmqctl list_vhosts

    rabbitmq-plugins enable rabbitmq_management  ##启用web管理

    rabbitmqctl add_user mqadmin 123456 ##添加管理员用户

    rabbitmqctl set_user_tags mqadmin administrator ##设置mqadmin这个用户为管理员角色

    rabbitmqctl delete_user guest   ##删除默认用户

    rabbitmqctl list_queues 

(仅供参考学习,非本人原创。)

posted @ 2019-08-26 10:03  mmengblog  阅读(194)  评论(0编辑  收藏  举报