RabbitMQ(一)简介

RabbitMQ(一)——简介

(原创内容,转载请注明来源,谢谢)

一、概述

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

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

二、关键词

rabbitmq中有一些关键词,如下:

1、生产者(producer)

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

2、消费者(consumer)

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

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

3、交换机(exchange)

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

4、队列(queue)

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

5、绑定(bind)

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

6、路由键(routingkey)

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

7、vhost

类似于数据库的账号,一个rabbitmq可以由多个用户操作,不同的用户可以用不同的vhost和密码,用于区分不同用户的队列。

8、通道(channel)

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

三、工作模式

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

1、工作队列

2、发布订阅

3、路由

4、主题

5、远程

四、使用方式

1、安装

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

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

在命令行中运行composer.pharinstall即可。如果已经有composer.json,则是在require里面添加这一行内容,然后运行updat命令即可。

2、文件引用

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

require_once__DIR__ . '/vendor/autoload.php';
usePhpAmqpLib\Connection\AMQPStreamConnection;
usePhpAmqpLib\Message\AMQPMessage;

3、创建连接和channel

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

4、关闭连接

每次执行完后,生产者和消费者都需要关闭连接,如下:

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

5、生产者

假设文件名为producer.php

发送一段最基础的内容给消费者,比较简单,因为exchange可以采用默认的,因此甚至可以不用定义exchange,直接定义队列即可。

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

$channel->queue_declare('hello',false, false, false, false);
$msg= new AMQPMessage('Hello World!');
$channel->basic_publish($msg,'', 'hello');

6、消费者

假设文件名为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();
}

7、运行

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

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

因此,为了保证消费者一直在后台运行,通常要有一个守护进程监视消费者,当其挂掉,则需要重新唤醒。

——written by linhxx 2017.08.19

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-08-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java技术分享

浅谈spring的事务管理作用

事务就是对一系列的数据库操作进行统一的提交或回滚操作,比如说做一个转账功能,要更改帐户两边的数据,这时候就必须要用事务才能算是严谨的做法。要么成功,要么失败,保...

1996
来自专栏python3

python 文件操作

新建一个txt文件,内容是《Yesterday When I Was Young》一首歌的歌词

712
来自专栏Java技术

收集的MySQL的面试题分享给大家

在缺省模式下,MYSQL是autocommit模式的,所有的数据库更新操作都会即时提交,所以在缺省情况下,mysql是不支持事务的。

603
来自专栏java学习

java基础笔记1

Java基础 | 数据库 | Android | 学习视频 | 学习资料下载 最新通知 按照我去培训机构的学习经历,给初学还有自学Java 的同学一个基本的学习...

3197
来自专栏章鱼的慢慢技术路

牛客网_Go语言相关练习_p判断&选择题(5)

使用第三方库时,先将源码编译成.a文件放到临时目录下,然后去链接这个.a文件,而不是go install安装的那个.a文件;

552
来自专栏Bug生活2048

Python自学之路-list、tuple、dict和set

上一篇「Python自学之路-数据类型和变量」主要简单说明了下数据类型和变量,这一篇主要和大家介绍下list、tuple、dict和set。相信后期在实战中会经...

852
来自专栏开源项目

Git 项目推荐 | 基于go+protobuff 实现的分布式

eQ ? 基于go+protobuff实现的多种持久化方案的mq框架 Client For KiteQ Go: https://github.com/b...

42114
来自专栏大数据和云计算技术

HBase运维实践-聊聊RIT的那点事

相信长时间运维HBase集群的童鞋肯定都会对RIT(Region-In-Transition,很多参考资料误解为Region-In-Transaction,需要...

1024
来自专栏匠心独运的博客

消息中间件—RocketMQ消息消费(一)

文章摘要:在发送消息给RocketMQ后,消费者需要消费。消息的消费比发送要复杂一些,那么RocketMQ是如何来做的呢? 在RocketMQ系列文章的前面几...

1383
来自专栏肖力涛的专栏

Spark踩坑记:初试

Apache Spark是一个围绕速度、易用性和复杂分析构建的大数据处理框架。本系列文将通过初试、Hbase+Mysql 、Spark Streaming+ka...

1.1K2

扫码关注云+社区