php rabbitmq的开发体验

Posted 贽殿遮那

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php rabbitmq的开发体验相关的知识,希望对你有一定的参考价值。

一、前言

为了公司的推送任务,监听用户后台的操作在不影响用户的操作速度,尽快的在用户的网站上更新用户的更改,需要保证消息的稳定性和可恢复性。所以我用了消息队列,具有

  • 解耦

  • 冗余

  • 扩展性

  • 灵活性 & 峰值处理能力

  • 可恢复性

  • 顺序保证

  • 缓冲

  • 异步通信

很满足我的需求,然后研究了线上很火的消息队列,https://www.cnblogs.com/Terry-Wu/p/7644279.html这篇文章对消息队列介绍的很全面,我采用了rabbitmq更考虑消息的准确性,并且感觉并发量不大,还不至于到Kafka的高吞吐地步,rabbitmq也可以集群化来为以后的高流量问题解决。

二、RabbitMq 安装与运行

本人开发环境是Ubuntu 18.04,

安装RabbitMq
可以参照RabbitMq官网的安装教程(Installing on Debian and Ubuntu),来进行安装。
这里我们使用apt-get来安装,就简单的几条命令:
 
1.由于rabbitMq需要erlang语言的支持,在安装rabbitMq之前需要安装erlang,执行命令:
 
apt-get install erlang-nox # 安装erlang
erl # 查看relang语言版本,成功执行则说明relang安装成功
 
2.添加公钥
 
wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | sudo apt-key add -
 
3.更新软件包
 
apt-get update

 

4.安装 RabbitMQ
 
apt-get install rabbitmq-server #安装成功自动启动
 
5.查看 RabbitMq状态
 
systemctl status rabbitmq-server #Active: active (running) 说明处于运行状态
 
# service rabbitmq-server status 用service指令也可以查看,同systemctl指令
 
6.启动、停止、重启
 
service rabbitmq-server start # 启动
service rabbitmq-server stop # 停止
service rabbitmq-server restart # 重启

 

执行了上面的步骤,rabbitMq已经安装成功。
 
7.启用 web端可视化操作界面,我们还需要配置Management Plugin插件(注:我发现已经开启了,没有开启的话可以通过以下操作)
 
rabbitmq-plugins enable rabbitmq_management # 启用插件
service rabbitmq-server restart # 重启

 

此时,应该可以通过 http://localhost:15672 查看,使用默认账户guest/guest 登录。
注意:RabbitMQ 3.3 及后续版本,guest 只能在服务本机登录。
瞄了一眼官方文档,说的是默认会创建guest用户,但是只能服务器本机登录,建议创建其他新用户,授权,用来做其他操作。
 
8.查看用户
 
rabbitmqctl list_users

 

9.添加管理用户
 
rabbitmqctl add_user admin yourpassword # 增加普通用户
rabbitmqctl set_user_tags admin administrator # 给普通用户分配管理员角色

 ok,你可以在你的浏览器上输入:http://服务器Ip:15672/ 来访问你的rabbitmq监控页面。使用刚刚添加的新用户登录。我们可以通过代码也可以通过界面操作rabbitmq,页面操作相当于linux的图形画界面更显性和直接。具体的界面功能介绍可以通过https://www.cnblogs.com/BNTang/articles/13777477.html这个博客主的介绍页面。本文不作更具体的介绍。大家可以先对第三块有概念上的了解后再看界面功能理解更快。

 
10.继续安装完 rabbitmq后,安装最新 php amqp扩展 
apt-cache search rabbitmq
apt-get install php5.6-amqp #我本地php环境5.6可能有点老了 大家需要根据自己的php版本安装对应扩展
/etc/init.d/apache2 restart 重启php 我本地apache2重启带动关联的php

 

三、AMQP协议

提到RabbitMQ,就不得不提AMQP协议。AMQP协议是具有现代特征的二进制协议。是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。

先了解一下AMQP协议中间的几个重要概念:很重要,至少脑海里有这些概念和逻辑图,面试可以谈,毕竟面试又不上机。

  • Server:接收客户端的连接,实现AMQP实体服务。
  • Connection:连接,应用程序与Server的网络连接,TCP连接。
  • Channel:信道,消息读写等操作在信道中进行。客户端可以建立多个信道,每个信道代表一个会话任务。
  • Message:消息,应用程序和服务器之间传送的数据,消息可以非常简单,也可以很复杂。有Properties和Body组成。Properties为外包装,可以对消息进行修饰,比如消息的优先级、延迟等高级特性;Body就是消息体内容。
  • Virtual Host:虚拟主机,用于逻辑隔离。一个虚拟主机里面可以有若干个Exchange和Queue,同一个虚拟主机里面不能有相同名称的Exchange或Queue。
  • Exchange:交换器,接收消息,按照路由规则将消息路由到一个或者多个队列。如果路由不到,或者返回给生产者,或者直接丢弃。RabbitMQ常用的交换器常用类型有direct、topic、fanout、headers四种,后面详细介绍。
  • Binding:绑定,交换器和消息队列之间的虚拟连接,绑定中可以包含一个或者多个RoutingKey。
  • RoutingKey:路由键,生产者将消息发送给交换器的时候,会发送一个RoutingKey,用来指定路由规则,这样交换器就知道把消息发送到哪个队列。路由键通常为一个“.”分割的字符串,例如“com.rabbitmq”。
  • Queue:消息队列,用来保存消息,供消费者消费。

我们完全可以直接使用 Connection 就能完成信道的工作,为什么还要引入信道呢?

试想这样一个场景, 一个应用程序中有很多个线程需要从 RabbitMQ 中消费消息,或者生产消息,那么必然需要建立很多个 Connection,也就是许多个 TCP 连接。然而对于操作系统而言,建立和销毁 TCP 连接是非常昂贵的开销,如果遇到使用高峰,性能瓶颈也随之显现。 RabbitMQ 采用 TCP 连接复用的方式,不仅可以减少性能开销,同时也便于管理 。

下图是AMQP的协议模型:

正如图中所看到的,AMQP协议模型有三部分组成:生产者、消费者和服务端。

生产者是投递消息的一方,首先连接到Server,建立一个连接,开启一个信道;然后生产者声明交换器和队列,设置相关属性,并通过路由键将交换器和队列进行绑定。同理,消费者也需要进行建立连接,开启信道等操作,便于接收消息。

接着生产者就可以发送消息,发送到服务端中的虚拟主机,虚拟主机中的交换器根据路由键选择路由规则,然后发送到不同的消息队列中,这样订阅了消息队列的消费者就可以获取到消息,进行消费。

最后还要关闭信道和连接。

RabbitMQ是基于AMQP协议实现的,其结构如下图所示,和AMQP协议简直就是一模一样

 

以上是关于php rabbitmq的开发体验的主要内容,如果未能解决你的问题,请参考以下文章

Java开发 - 消息队列之RabbitMQ初体验

PHP必用代码片段

超级有用的9个PHP代码片段

超实用的php代码片段

Docker下RabbitMQ四部曲之一:极速体验(单机和集群)

Docker下RabbitMQ四部曲之三:细说java开发