• RabbitMQ(一)——简介


    RabbitMQ(一)

    ——简介

     

    (转载请附上本文链接——linhxx)

     

    一、概述

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

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

    二、关键词

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

    1、生产者(producer)

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

    2、消费者(consumer)

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

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

    3、交换机(exchange)

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

    4、队列(queue)

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

    5、绑定(bind)

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

    6、路由键(routing key)

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

    7、vhost

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

    8、通道(channel)

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

    三、工作模式

    rabbitmq有五种工作模式,分别是工作队列(work queues)、发布订阅(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.phar install即可。如果已经有composer.json,则是在require里面添加这一行内容,然后运行updat命令即可。

    2、文件引用

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

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

    use PhpAmqpLibConnectionAMQPStreamConnection;

    use PhpAmqpLibMessageAMQPMessage;

    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, " ";

    };

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

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

        $channel->wait();

    }

    7、运行

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

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

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

    ——written by linhxx

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

    博客园这边,我会定期批量发布文章,如果想要实时看到最新的文章,欢迎关注微信公众号"决胜机器学习",里面有我最新的文章。linhxx
  • 相关阅读:
    java反射机制简介
    StringBuffer类总结
    java中的断言
    Tomcat禁止外网访问
    InnoDB引擎数据存放位置
    MySQL中的事务
    InnoDB与MyISAM引擎区别
    linux之LVS简介(转自南非的蚂蚁)
    CentOS6.5自带Python2.6.6升级至Python2.7
    利用Rsync在windows和linux之间同步数据
  • 原文地址:https://www.cnblogs.com/linhxx/p/8434163.html
Copyright © 2020-2023  润新知