zoukankan      html  css  js  c++  java
  • RabbitMQ译文 — 简单的开始(Hello World!)

    一、简介

      RabbitMQ 是一个消息代理:它接收并转发消息。你能把它想象成一个邮局:当你把一封想要邮寄的信件放到一个邮箱里的时候,你能确定邮递员最终一定会把你的这封信递交给你的收信人。以此来比喻,RabbitMQ就是一个邮箱,一个邮局和一个邮递员。

      RabbitMQ和邮局之间最大的不同是RabbitMQ不处理纸质邮件,而是接收,存储和转发二进制数据——消息。

      通常,RabbitMQ 和消息使用一些术语。

      生产(producing):也就是发送,一个程序发送消息就是生产者。

      producer

      队列(queue):一个队列好比是一个寄宿在RabbitMQ内的邮箱,尽管消息流转于RabbitMQ和你的应用之间,但它们仅被存储在一个队列中。一个队列仅由主机内存和磁盘限额所限制,它本质上就是一个大的消息缓冲区。许多生产者能发送消息到某一个队列中,许多消费者尝试从某队列中接收消息数据。我们这样来表示一个队列:

     

      消费(consuming):消费和接收具有类似的意义,一个消费者通常就是一个程序来等待接收消息:

      

       需要说的是生产者,消费者和代理不必都位于同一台主机上,实际上在大多数的应用中他们也没有这么做。

    二、"Hello World"

      (使用 php-amqplib 客户端)

      在这部分教程中,我们将用PHP写两段程序;一个发送单一消息的生产者和一个接收消息并打印出来的消费者。为了有个好的开始,我们先不讨论php-amqplib API的详细信息,而专注于这件简单的事情。就是一条“Hello World”的信息。

      在下面的图示中,“P”是我们的生产者,“C”是我们的消费者。中间的盒子就是一个队列——一个RabbitMQ为了消费者保存消息的缓冲区。

      (P) -> [|||] -> (C)

      php-amqplib 客户端类库

      RabbitMQ支持多种协议,本教程使用AMQP 0-9-1,这是一个针对消息的开放的,通用的协议。对于RabbitMQ有很多不同语言的客户端。在教程里我们将使用php-amqplib客户端,并用Composer来管理相关依赖。

      添加一个composer.json文件到你的项目里:

    {
        "require": {
            "php-amqplib/php-amqplib": ">=2.6.1"
        }
    }
    

      假如你已经安装了Composer和相关功能,你能运行下面的:

    composer.phar install

      这里有一个Windows系统的Composer安装文件

      现在我们已经安装了php-amqplib类库,我们可以写一些代码了。

      发送

      (P) -> [|||]

      我们将调用我们的消息发布者(发送者)send.php 和我们的消息接收者 receive.php。这个发布者将连接RabbitMQ,发送一条消息后退出。

      在send.php我们需要包括类库并 use 必要的类。

    require_once __DIR__ . '/vendor/autoload.php';
    use PhpAmqpLibConnectionAMQPStreamConnection;
    use PhpAmqpLibMessageAMQPMessage;
    

      然后我们就可以建立一个到服务器的连接:

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

      这个连接抽象于套接字连接,为我们负责协议版本的协商和认证等等。从 localhost 可以看出这里我们连接的是本地机器上的一个消息代理。如果我们想连接一个不同机器上的代理,在这里我们只要简单的指定它的计算机名称或IP地址即可。

      下面我们建立一个通道,这是大多数处理事情的API驻留的地方。

      要发送消息,我们就必须为我们定义一个要发送消息到这个队列的队列,然后我们才能发布一条消息到这个队列。

    $channel->queue_declare('hello', false, false, false, false);
    
    $msg = new AMQPMessage('Hello World!');
    $channel->basic_publish($msg, '', 'hello');
    
    echo " [x] Sent 'Hello World!'
    ";
    

      定义一个队列,如果这个队列不存在,才会被创建。消息的内容是字节数组,所以在这里你能够编码成任何你想要的内容。

      最后,我们关闭通道和连接。

    $channel->close();
    $connection->close();
    

      这里是完整的send.php类文件

    发送不成功!

    如果这是你第一次使用RabbitMQ并且没有看到发送的信息,那么你可能会挠着头在想什么地方弄错了。也许是代理被启动而没有足够的磁盘空间(默认需要至少200MB的剩余空间)而拒绝接收消息。要在必要时检查代理的日志文件确认并减少限制。配置文件文档会告诉你怎样设置disk_free_limit。

      接收

      这就是我们的发布者。我们的接收者被推送来自于RabbitMQ的消息,因此不像发布者那样发布消息,我们将保持它运行并监听消息而后打印它们。

      [|||] -> (C)

      receive.php 里的代码有和发送相同的包含和用法:

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

      设置是和发布者相同的。我们打开一个连接和一个通道,然后定义一个打算从中消费的队列。注意这要和发送的队列相匹配。

    $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
    $channel = $connection->channel();
    
    $channel->queue_declare('hello', false, false, false, false);
    
    echo ' [*] Waiting for messages. To exit press CTRL+C', "
    ";
    

      需要注意的是我们在这里也要定义队列。因为我们可能在启动发布者之前启动消费者,在我们试图从中消费消息之前,要确定队列是存在的。

      我们将告诉服务器从队列中传递给我们消息。我们将定义一个 PHP callable 用来接收来自服务器发送的消息。记住消息被异步的从服务器发送至客户端。

    $callback = function($msg) {
      echo " [x] Received ", $msg->body, "
    ";
    };
    
    $channel->basic_consume('hello', '', false, true, false, false, $callback);
    
    while(count($channel->callbacks)) {
        $channel->wait();
    }
    

      当我们的$channel有回调时,代码将阻塞。每当我们接收消息的时候,我们的$callback函数将被传递这条被接收的消息。

      这是完整的receive.php类文件

      把它放在一起

      现在我们能够运行这两个脚本。在终端运行消费者(接收者):

    php receive.php
    

      然后运行发布者(发送者):

    php send.php
    

      消费者将打印它通过RabbitMQ中获得的消息。接收者将保持运行,等候消息(使用 Ctrl-C 结束),因此试着在另一个终端运行第二个发送者。

    列出队列

    你可能想要看RabbitMQ已有的队列和在这些队列中有多少条消息。你(有权限的用户)能使用rabbitmqctl工具实现。

    sudo rabbitmqctl list_queues

    在windows系统下,省略sudo:

    rabbitmqctl.bat list_queues

      在下一课,我们将建立一个简单的工作队列。

      原文:http://www.rabbitmq.com/tutorials/tutorial-one-php.html

  • 相关阅读:
    10.并发包阻塞队列之ArrayBlockingQueue
    【PHP】最详细PHP从入门到精通(三)——PHP中的数组
    新随笔222
    新随笔
    iOS常用加密算法介绍和代码实践
    5.在MVC中使用泛型仓储模式和工作单元来进行增删查改
    Directx11学习笔记【二十】 使用DirectX Tool Kit加载mesh
    什么是Dagger2
    嗯嗯

  • 原文地址:https://www.cnblogs.com/penrodsheh/p/8575246.html
Copyright © 2011-2022 走看看