一、RabbitMQ安装

  1. windows安装

下载地址:
https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.3/rabbitmq-server-3.8.3.exe
https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.3/rabbitmq-server-windows-3.8.3.zip
2.linux安装

下载地址:

Debian, Ubuntu

https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.3/rabbitmq-server_3.8.3-1_all.deb

Centos8:

https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.3/rabbitmq-server-3.8.3-1.el8.noarch.rpm

Centos7:

https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.3/rabbitmq-server-3.8.3-1.el7.noarch.rpm

Centos6:

https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.3/rabbitmq-server-3.8.3-1.el6.noarch.rpm

OpenSUSE:

https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.3/rabbitmq-server-3.8.3-1.suse.noarch.rpm

SLEX 11x:

https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.3/rabbitmq-server-3.8.3-1.sles11.noarch.rpm

二、RabbitMQ配置

  1. 下载Erlang并安装

Erlang下载地址:https://www.erlang.org/downloads

按照你的自己的环境,下载合适的版本并安装即可。

windows相对来说安装比较简单,和普通软件的安装没有区别,按照提示向下进行即可。

Linux安装:需要下载源码,并进行编译安装,这个会在另外的文章中进行说明

三、RabbitMQ原理与消息队列

  1. 消息:是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。
  2. 消息队列:消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。消息发布者只管把消息发布到消息队列中而不用管谁来取,消息使用者只管从消息队列中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在。
  3. 用途:在不同的进程或线程之间进行通讯。
  4. 主流的消息队列:
    RabbitMQ、ActiveMq、ZeroMq、kafka、RocketMQ(阿里开源)

本文主要介绍RabbitMQ。

RabbitMQ是应用程序之间通讯的一种方法,是建立在AMQP协议基础上的,使用Erlang语言开发的,完整且可复制的企业消息系统。

支持系统:windows,linux,macOX等。

开发语言支持:ruby,python,java,php,. net,C/C++,Node.js等。

AMQP:Advanced Message Queue Protocol(高级消息队列协议),是一个提供统一消息服务的应用层标准高级消息队列协议。

四、RabbitMQ特性

RabbitMQ起源于金融系统,用于在分布式系统中存储并转发消息,在易用性、扩展性、高可用性等方面表现不俗。

具体特性包括:

  1. 可靠性(Reliability):使用一些机制来保证可靠性,如:持久化,传输确认,发布确认等。
  2. 灵活的路由(Flexible Routing):在消息进入队列之前,通过exchange来路由消息。RabbitMQ默认再系统中提供了一些路由以供使用,对于复杂的路由可以将多个exchange绑在一起,也通过插件机制来实现自己的路由。
  3. 高可用(Highly Available Queues):队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。
  4. 多种协议(Multi-protocol):RabbitMQ 支持多种消息队列协议,比如 STOMP、MQTT 等等。
  5. 多语言客户端(Many Clients):RabbitMQ 几乎支持所有常用语言,比如 Java、.NET、Ruby 等等。
  6. 管理界面(Management UI):RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker 的许多方面。
  7. 跟踪机制(Tracing):如果消息异常,RabbitMQ 提供了消息跟踪机制,使用者可以找出发生了什么。
  8. 插件机制(Plugin System):RabbitMQ 提供了许多插件,来从多方面进行扩展,也可以编写自己的插件。

五、RabbitMQ基本概念:

AMQP:Advanced Message Queue Protocol(高级消息队列协议),是一个提供统一消息服务的应用层标准高级消息队列协议。

Exchange:交换机,用来接收生成者消息,并路由给与交换机绑定的队列。

Queue:消息队列,用来存储和消息,并对消息进行顺序排列的队列,是消息的容器,也是消息的终点,消费者将消息存储到消息队列后即可返回。消费者,从这里取用消息。

Broker:消息队列服务器实体(这里可以理解为实体机)

Virtual Host:虚拟主机,一个虚拟机里可以存在多个交换机,和消息队列,他可以共享服务器的加密信息和鉴权认证等,也就是说鉴权和加密是以虚拟机为单位的,不能单独对队列进行这些操作。

Connection:链接:一个网络连接

Channel:通道或信道多路复用连接中的一条独立的双向数据流通道,是建立在真实的TCP连接内地虚拟连接,可以安排每隔进程分配一个信道,也可以安排每隔线程分配一个信道。

Binding:绑定,即exchange与queue之间的绑定关系

Consumer:消费者,这里是指对队列内容进行消费(取出消息,并进行相应的处理)的应用程序,可以是一个进程,也可以是一个线程。

Publisher:生成者,这里是指产生消息的应用程序,可以是进程,也可以是线程

Message:消息,这里是指生产者产生并存储于队列的数据。

六、RabbitMQ在PHP中的应用

  1. AMQP扩展安装

扩展下载地址:http://pecl.php.net/package/amqp

注意事项:

  1. windows系统请点击 DLL
  2. linux下载后需要编译安装
  3. Windows下下载dll之前请检查php的相应版本,并下载对应的版本,否则会出现无法使用的问题
  4. Window下需要在php.ini下加入:

需要先将php_amqp.dll复制到php/ext目录下

[amqp]

extension=php_amqp.dll

然后在httpd.conf下加入:

需要先将rabbitmq.4.dll复制到配置目录下

# rabbitmq

LoadFile  "d:/xampp/php/rabbitmq.4.dll"

这两个dll文件存在于下载的扩展中

  1. 一个关于RabbitMQ的php封装,此封装经过本人测试是可以使用的,但是有关信道和交换机这块因为本人仅仅是为了设置,所以在分配逻辑上做太多考虑,如果需要使用该方法可以在这方面做出相应的修改。

<?php

/**

* RabbitMQ消息队列封装

*/

namespace common\lib;

/**

* RabbitMQ消息队列生产者

*/

class RabbitMQ {

const HOST = '127.0.0.1';

const PORT = '5672';

const USER = 'zhangxugang810';

const PASSWORD = '132133';

const VHOST = 'huaweiQueue';

private $isTransaction = true;

private $exchangeName = 'ex_huawei';

private $queueName = 'queue_huawei';

private $routeKey = 'route_huawei';

private $cn;

private $ch;

private $ex;

private $queue;

public function __construct() {

$this->connect();

}

/**

* 组装参数

*/

private function connectParams() {

return ['host' => static::HOST, 'port' => static::PORT, 'login' => static::USER, 'password' => static::PASSWORD, 'vhost' => static::VHOST];

}

/**

* 连接队列服务器并创建channel

*/

private function connect() {

$params = $this->connectParams();

$this->cn = new \AMQPConnection($params);

if (!$this->cn->connect()) {

die("不能连接这个BROCKER\n");

}

$this->channel();

}

private function channel(){

$this->ch = new \AMQPChannel($this->cn);

}

/**

* 创建交换机

*/

private function exchange() {

$this->ex = new \AMQPExchange($this->ch);

$this->ex->setName($this->exchangeName);

date_default_timezone_set("Asia/Shanghai");

}

/**

* 创建队列并绑定交换机

*/

private function queue() {

//使用哪个信道

$this->queue = new \AMQPQueue($this->ch);

$this->queue->setName($this->queueName);

$this->queue->setFlags(AMQP_DURABLE);

//        echo "Message Total:".$this->queue->declare()."\n";

//        $this->queue->bind($this->exchangeName, $this->routeKey);

}

/**

* 生产者方法 - 单条

* @param type $msg

* @return type

*/

public function sendOne($msg){

$this->exchange();

return $this->ex->publish($msg, $this->routeKey);

}

/**

* 生产者方法 - 多条

* @param type $msgs

* @return type

*/

public function sendMultiple($msgs){

$this->exchange();

if ($this->isTransaction) {//如果启用事务

$this->ch->startTransaction(); //开始事务

}

$result = [];

foreach($msgs as $k => $msg){

$result[$k] = $this->ex->publish($msg, $this->routeKey);

}

if ($this->isTransaction) {//如果启用事务

$this->ch->commitTransaction(); //开始事务

}

return $result;

}

/**

* 消费者方法

* 这里需要根据相应的业务逻辑进行修改

*/

public function run() {

$this->queue();

echo "Message:\n";

while (True) {

$this->queue->consume(function($envelope, $queue) {

//此处调用业务逻辑处理方法

static::processMessage($envelope, $queue);

});

//$q->consume('processMessage', AMQP_AUTOACK); //自动ACK应答

}

$this->disconnect();

}

/**

* 消费者业务逻辑

* 此处只是示例方法

* @param type $envelope

* @param type $queue

*/

public static function processMessage($envelope, $queue) {

//此处是业务逻辑处理

$msg = $envelope->getBody();

echo $msg . "\n"; //处理消息

$queue->ack($envelope->getDeliveryTag()); //手动发送ACK应答

}

}

七、RabbitMQ单点问题与高可用

这里为了高可用性可以考虑一个问题,如果我们只部署一个单点RabbitMQ服务器用于生产环境,那么一但这个RabbitMQ出现问题,则所有调用该消息队列的应用都将出现问题,为了解决这个问题,就产生了RabbitMQ集群,具体的集群搭建,另做讲解。

八、踩坑提示

    1. windows安装时,请注意安装路径不要带空格
    2. 配置完成后直接运行程序,结果是队列消息无法加入,请检查所对应的虚拟主机是否存在,exchange是否存在,队列是否存在,exchange和队列是否绑定好了,如果未绑定成

消息队列RabbitMQ的安装配置与PHP中的使用的更多相关文章

  1. 持久化消息队列memcacheq的安装配置

    MemcacheQ 是一个基于 MemcacheDB 的消息队列服务器. 一.memcacheq介绍 特性: 1.简单易用 2.处理速度快 3.多条队列 4.并发性能好 5.与memcache的协议兼 ...

  2. (三)RabbitMQ消息队列-Centos7下安装RabbitMQ3.6.1

    原文:(三)RabbitMQ消息队列-Centos7下安装RabbitMQ3.6.1 如果你看过前两章对RabbitMQ已经有了一定了解,现在已经摩拳擦掌,来吧动手吧! 用什么系统 本文使用的是Cen ...

  3. 消息队列rabbitmq rabbitMQ安装

    消息队列rabbitmq   12.1 rabbitMQ 1. 你了解的消息队列 生活里的消息队列,如同邮局的邮箱, 如果没邮箱的话, 邮件必须找到邮件那个人,递给他,才玩完成,那这个任务会处理的很麻 ...

  4. C#中使用消息队列RabbitMQ

    在C#中使用消息队列RabbitMQ 2014-10-27 14:41 by qy1141, 745 阅读, 2 评论, 收藏, 编辑 1.什么是RabbitMQ.详见 http://www.rabb ...

  5. CentOS7下RabbitMQ服务安装配置

    参考文档: CentOS7下RabbitMQ服务安装配置 http://www.linuxidc.com/Linux/2016-03/129557.htm 在linux下安装配置rabbitMQ详细教 ...

  6. 消息队列--RabbitMQ(一)

    1.消息队列概述 可以理解为保存消息的一个媒介/或者是个容器,与之相关有两个概念(即生产者(Publish)与消费者(Consumer)).所谓生产者,就是生产创造消息的一方,那么,消费者便是从队列中 ...

  7. (二)RabbitMQ消息队列-RabbitMQ消息队列架构与基本概念

    原文:(二)RabbitMQ消息队列-RabbitMQ消息队列架构与基本概念 没错我还是没有讲怎么安装和写一个HelloWord,不过快了,这一章我们先了解下RabbitMQ的基本概念. Rabbit ...

  8. 消息队列rabbitmq/kafka

    12.1 rabbitMQ 1. 你了解的消息队列 rabbitmq是一个消息代理,它接收和转发消息,可以理解为是生活的邮局.你可以将邮件放在邮箱里,你可以确定有邮递员会发送邮件给收件人.概括:rab ...

  9. openstack (共享服务) 消息队列rabbitmq服务

    云计算openstack共享组件——消息队列rabbitmq(3)   一.MQ 全称为 Message Queue, 消息队列( MQ ) 是一种应用程序对应用程序的通信方法.应用程序通过读写出入队 ...

随机推荐

  1. 第三方库PyYAML

    建议参考PyYAML Documentation来源:http://pyyaml.org/wiki/PyYAMLDocumentation:http://blog.csdn.net/conquer07 ...

  2. Eclipse插件svn和TortoiseSvn版本对应关系

    2019独角兽企业重金招聘Python工程师标准>>> 先说一下今天碰到问题,自己在建svn仓库和导入,导出时因为版本不一致导致的错误. 因此一定要保证Eclipse中svn插件版本 ...

  3. mac OS 卸载node.js及npm

    通过homebrew安装的 输入卸载命令 brew uninstall node 通过官网下载pkg安装包的 输入卸载命令 sudo rm -rf /usr/local/{bin/{node,npm} ...

  4. mybatis if test标签的使用

    2019独角兽企业重金招聘Python工程师标准>>> 在使用mybatis 有时候需要进行判断的. 而我们知道mybatis获取值有两种方式 #{}和${}的. 那么,在mybat ...

  5. ACM-ICPC 2019 山东省省赛总结

    五题手快拿银,不然拿铜,甚至不拿,从结果上来看拿了铜牌对第一年的我们来说算好的,也不算太好. 从拿奖后的第一天,我想写这篇博客,但是我忍了下来,那时候被喜悦冲昏了头脑,当 冷静下来,我开始打算写这篇博 ...

  6. centos安装libconfig

    安装很简单,生成的.so文件会被安装到/usr/local/lib目录,记得修改/etc/profile. 安装过程会出现两个错误: What is makeinfo, and how do I ge ...

  7. redis-py中的坑

    今天发现,使用redis-py从redis中获取的数据竟然是加密的. conn = redis.Redis(host='redis_serverip', port=6379, password='re ...

  8. D. Caesar's Legions

    \(状态很容易设计\) \(设dp[i][j][u][v]表示放了i个1兵种和j个2兵种\) \(然后u不会0说明末尾放了连续u个1兵种,v不为0说明末尾放了连续v个2兵种\) #include &l ...

  9. 扩欧(exgcd讲解)

    注意本文的证明都来源于这位大大大大大大大牛 知识点.扩展欧几里得求逆元 看完下面的证明后建议联系一下这题同余方程 可以对exgcd的用途和写法有有初步了解. \(问题描述:对于三个自然数 a,b,c ...

  10. E. Marbles 状压dp

    E. Marbles 这个是一个状压dp 题目大意是:给你一个数组,数组的数在1到20之间,有一个操作就是交换相邻的两个数,问 让所有相同的数相邻的最小操作次数 dp[s] 表示s状态下的操作次数,w ...