RabbitMQ(一)——简介

RabbitMQ(一)php

——简介数据库

 

(转载请附上本文连接——linhxx)编程

 

1、概述json

RabbitMQ是一种消息的传输者(broker),除了消息持久化,不对消息内容自己作任何的处理。其相似于邮局,能够将邮件发送给他,也能够去邮局取邮件。RabbitMQ类似,用户能够将消息发到其中,也能够去取消息。数组

其和ActiveMQ、ZeroMQ、Kafka等功能类似。RabbitMQ具备高稳定性,支持数据持久化,及时运行rabbitmq的服务器宕机,重启后消息仍存在。且有ack回传机制,保证消息送达消费者后才会将消息从队列中清除。服务器

 

2、关键词微信

rabbitmq中有一些关键词,以下:composer

一、生产者(producer)机器学习

生产者是消息的产生者,即发送内容供消费者使用。如用户登陆点击发送短信确认,这个点击完发送以前的过程,就是生产者去实现。编程语言

二、消费者(consumer)

消费者即具体任务的处理者,例如上述具体去实现发送短信的过程,就是消费者实现的。消费者要去队列中取任务,而且执行任务。能够是死循环不断的运行,也能够是定时任务按期去消费。

生产者和消费者是用户根据实际业务场景去实现的,下面的内容则是rabbitmq经过用户不一样的定义和声明内部实现的。

三、交换机(exchange)

接收生产者发送的信息,其做为第一步,而且将信息根据用户的配置,发送给队列。

四、队列(queue)

用于存储消息,供消费者来取,而且提供ack机制,消费者取完回馈ack后,会将消息从队列删除。

五、绑定(bind)

交换机和队列之间的一种机制,当有多个队列时,经过绑定,交换机会将信息传到具体的队列中。

六、路由键(routing key)

除了绑定,队列还有一个具体的key,用于标识队列的身份,当有这个key时,输错则交换机不会将信息发送到队列。

七、vhost

相似于数据库的帐号,一个rabbitmq能够由多个用户操做,不一样的用户能够用不一样的vhost和密码,用于区分不一样用户的队列。

八、通道(channel)

通道是用户和rabbitmq交互的途径,生产者和交换机、消费者和队列,都是经过channel进行数据交互。

 

3、工做模式

rabbitmq有五种工做模式,分别是工做队列(work queues)、发布订阅(publish/subscribe)、路由(routing)、主题(topic)、远程调用(rpc),每种模式都有不一样的特性。以下图所示:

一、工做队列

 

二、发布订阅

 

 

三、路由

 

 

四、主题

 

 

五、远程

 

 

 

4、使用方式

一、安装

rabbitmq支持很是多种编程语言,这里用php来进行操做。php安装rabbit,建议采用composer的方式,即在项目建立一个composer.json文件,并写入:

{

    "require": {

        "php-amqplib/php-amqplib": ">=2.6.1"

    }

}

在命令行中运行composer.phar install便可。若是已经有composer.json,则是在require里面添加这一行内容,而后运行updat命令便可。

二、文件引用

引入方式也很简单,以下:

require_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;

use PhpAmqpLib\Message\AMQPMessage;

三、建立链接和channel

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');

$channel = $connection->channel();

四、关闭链接

每次执行完后,生产者和消费者都须要关闭链接,以下:

$channel->close();

$connection->close();

五、生产者

假设文件名为producer.php

发送一段最基础的内容给消费者,比较简单,由于exchange能够采用默认的,所以甚至能够不用定义exchange,直接定义队列便可。

生产者较简单,定义队列、定义消息、发送消息便可。其中,AMQPMessage传入的内容即具体的业务逻辑,若是是数组或者对象还须要序列化后进行传输。

$channel->queue_declare('hello', false, false, false, false);

$msg = new AMQPMessage('Hello World!');

$channel->basic_publish($msg, '', 'hello');

六、消费者

假设文件名为consumer.php

去队列中获取消息,并进行后续的处理工做。若是有开启ack机制,还须要在处理完任务后,给队列进行回馈。

消费者须要定义较多内容,包括定义队列、定义回调函数、定义消费方法、while循环中等待生产者发送消息并进行处理。

其中,回调函数即具体的业务逻辑。

$channel->queue_declare('hello', false, false, false, false);

$callback = function($msg) {

  echo " [x] Received ", $msg->body, "\n";

};

$channel->basic_consume('hello', '', false, true, false, false, $callback);

while(count($channel->callbacks)) {

    $channel->wait();

}

七、运行

打开两个控制台,一个运行php producer.php,一个运行consumer.php,则consumer.php会收到消息Hello World!。

consumer.php会在后台一直运行,每次生产者发送消息,消费者就会去执行。

所以,为了保证消费者一直在后台运行,一般要有一个守护进程监视消费者,当其挂掉,则须要从新唤醒。

 

 

——written by linhxx

 

更多最新文章,欢迎关注微信公众号“决胜机器学习”,或扫描右边二维码。

相关文章
相关标签/搜索