RabbitMQ是一个消息代理。它的核心原理非常简单:接收和发送消息。你可以把它想像成一个邮局:你把信件放入邮箱,邮递员就会把信件投递到你的收件人处。在这个比喻中,RabbitMQ是一个邮箱、邮局、邮递员。RabbitMQ和邮局的主要区别是,它处理的不是纸,而是接收、存储和发送二进制的数据——消息。一般提到RabbitMQ和消息,都用到一些专有名词。
- 生产(Producing)意思就是发送。发送消息的程序就是一个生产者(producer)。我们一般用”P”来表示:
- 队列(queue)就是邮箱的名称。消息通过你的应用程序和RabbitMQ进行传输,它们能够只存储在一个队列(queue)中。 队列(queue)没有任何限制,你要存储多少消息都可以——基本上是一个无限的缓冲。多个生产者(producers)能够把消息发送给同一个队列,同样,多个消费者(consumers)也能攻从一个队列(queue)中获取数据。队列可以化城这样(图上是队列的名称):
- 消费(Consuming)和获取消息是一样的意思。一个消费者(consumer)就是一个等待获取消息的程序。我们把它画作”C”:
Hello World!
(使用pika 0.9.5 Python客户端)
我们的“Hello world”不会很复杂——仅仅发送一个消息,然后获取它并输出到屏幕。这样以来我们需要两个程序,一个用作发送消息,另一个接受消息并打印消息内容
我们大体的设计是这样的:
生产者(Producer)把消息发送到一个名为“hello”的队列中。消费者(consumer)从这个队列中获取消息。
RabbitMQ库
RabbitMQ使用的是AMQP协议。要使用她你就必须需要一个使用同样协议的库。几乎所有的编程语言都有可选择的库。
python也是一样,可以从以下几个库中选择:在这一系列教程中,我们打算使用PHP 的AMQP扩展。详细教程请查看:
发送消息
我们第一个程序send.php会发送一个消息到队列中。首先要做的事情就是建立一个到RabbitMQ服务器的连接。
1 |
$connection = new AMQPConnection( array ( 'host' => '127.0.0.1' , 'port' => '5672' , 'vhost' => '/' , 'login' => 'guest' , 'password' => 'guest' )); |
现在我们已经连接上服务器了,那么,在发送消息之前我们需要确认队列是存在的。如果我们把消息发送到一个不存在的队列,RabbitMQ会丢弃这条消息。我门先创建一个名为hello的队列,然后把消息发送到这个队列中。
1 |
$queue = new AMQPQueue( $channel ); |
2 |
$queue ->setName( $queueName ); |
这时候我们就可以发送消息了,我们第一条消息只包含了 Hello World!字符串,我们打算把它发送到我们的hello队列。
在RabbitMQ中,消息是不能直接发送到队列,它需要发送到交换器(exchange)中。我们不打算在这里深入讨论它——你可以通过教程的第三部分了解更多。现在我们所需要了解的是如何使用默认的交换器(exchange),它使用一个空字符串来标识。交换器允许我们指定某条消息需要投递到哪个队列,$$routeKey参数必须指定为队列的名称:
1 |
$exchange ->publish( $message , $routeKey ); |
2 |
var_dump( "[x] Sent 'Hello World!'" ); |
在退出程序之前,我们需要确认网络缓冲已经被刷写、消息已经投递到RabbitMQ。完成这些事情(正确的关闭连接)是很简单的。
1 |
$connection ->disconnect(); |