php rabbitmq的开发体验
Posted 贽殿遮那
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php rabbitmq的开发体验相关的知识,希望对你有一定的参考价值。
一、前言
为了公司的推送任务,监听用户后台的操作在不影响用户的操作速度,尽快的在用户的网站上更新用户的更改,需要保证消息的稳定性和可恢复性。所以我用了消息队列,具有
-
解耦
-
冗余
-
扩展性
-
灵活性 & 峰值处理能力
-
可恢复性
-
顺序保证
-
-
异步通信
很满足我的需求,然后研究了线上很火的消息队列,https://www.cnblogs.com/Terry-Wu/p/7644279.html这篇文章对消息队列介绍的很全面,我采用了rabbitmq更考虑消息的准确性,并且感觉并发量不大,还不至于到Kafka的高吞吐地步,rabbitmq也可以集群化来为以后的高流量问题解决。
二、RabbitMq 安装与运行
本人开发环境是Ubuntu 18.04,
apt-get install erlang-nox # 安装erlang erl # 查看relang语言版本,成功执行则说明relang安装成功
wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | sudo apt-key add -
apt-get update
apt-get install rabbitmq-server #安装成功自动启动
systemctl status rabbitmq-server #Active: active (running) 说明处于运行状态
# service rabbitmq-server status 用service指令也可以查看,同systemctl指令
service rabbitmq-server start # 启动 service rabbitmq-server stop # 停止 service rabbitmq-server restart # 重启
rabbitmq-plugins enable rabbitmq_management # 启用插件
service rabbitmq-server restart # 重启
rabbitmqctl list_users
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这个博客主的介绍页面。本文不作更具体的介绍。大家可以先对第三块有概念上的了解后再看界面功能理解更快。
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的开发体验的主要内容,如果未能解决你的问题,请参考以下文章