安装
- 首先需要erlang环境
- 安装rabbitmq环境
- 在php上使用需要rabbitmq-c 以及amqp扩展
erlang环境
- 下载解压 wget http://erlang.org/download/otp_src_21.1.tar.gz
- tar -zxvf otp_src_21.1.tar.gz
- cd otp_src_21.1
- 这里要新建一个erlang文件夹,因为erlang编译安装默认是装在/usr/local下的bin和lib中,这里我们将他统一装到/usr/local/erlang中,方便查找和使用。mkdir -p /usr/local/erlang
- 在编译之前,必须安装以下依赖包 yum install -y make gcc gcc-c++ m4 openssl openssl-devel ncurses-devel unixODBC unixODBC-devel java java-devel
- ./configure --prefix=/usr/local/erlang
- make && make install
- 环境变量vim /etc/profile PATH=$PATH:/usr/local/erlang/bin
- source /etc/profile
rabbit server安装
步骤
- wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.8/rabbitmq-server-generic-unix-3.7.8.tar.xz
- 安装肖战 yum install -y xz 第一次解压 xz -d rabbitmq-server-generic-unix-3.7.8.tar.xz
- 解压移入到local tar -xvf rabbitmq-server-generic-unix-3.7.8.tar.xz -C /usr/local/
- 环境变量vim /etc/profile PATH=$PATH:/usr/local/rabbitmq_server-3.7.8/sbin
- source /etc/profile
- web管理工具 rabbitmq-plugins enable rabbitmq_management
- 这一步貌似不需要 官网找到conf文件 放到 安装目录/etc/rabbitmq下
- rabbitmq-server -detached (好像会报错,但无所谓使用 rabbitmq-server start 也行)
- 开启防火墙 5672(client端通讯) 15672 (web管理) 25672(server通讯) 4369(erlang发现口)
- firewall-cmd --zone=public --add-port=4369/tcp --permanent 永久开启端口的意思
- firewall-cmd --reload 重载
- firewall-cmd --zone=public --list-ports 查看目前的开放端口
- 访问管理页面 http://你的ip:15672/
其他命令
插件管理:
插件列表: rabbitmq-plugins list
启动插件: rabbitmq-plugins enable XXX (XXX为插件名)
停用插件: rabbitmq-plugins disable XXX
用户管理:
添加用户: rabbitmqctl add_user username password
删除用户: rabbitmqctl delete_user username
修改密码: rabbitmqctl change_password username newpassword
设置用户角色: rabbitmqctl set_user_tags username tag
列出用户: rabbitmqctl list_users
权限管理:
列出所有用户权限: rabbitmqctl list_permissions
查看制定用户权限: rabbitmqctl list_user_permissions username
清除用户权限: rabbitmqctl clear_permissions [-p vhostpath] username
设置用户权限: rabbitmqctl set_permissions [-p vhostpath] username conf write read
conf: 一个正则匹配哪些资源能被该用户访问
write:一个正则匹配哪些资源能被该用户写入
read:一个正则匹配哪些资源能被该用户读取
出现问题
- 版本问题 使用的版本erlang尽量21-23最新的 rabbitmq也是3.7.8以上 现在已经到3.10了吧
- 出现启动不成功的问题 提示信息是已存在node点 这时候可以使用 rabbitmqctl stop_app 先结束正在使用的node
php安装amqp
安装amqp-c
- wget https://github.com/alanxz/rabbitmq-c/releases/download/v0.8.0/rabbitmq-c-0.8.0.tar.gz
- tar -zxvf rabbitmq-c-0.8.0.tar.gz
- cd rabbitmq-c-0.8.0
- ./configure --prefix=/usr/local/rabbitmq-c
- make && make install
安装amqp拓展 (我php7.3 使用的一开始1.9.3 结果出了问题 尝试安装1.9.4就好了)
-
tar zxf amqp-1.9.4.tgz
-
cd amqp-1.9.4
-
phpize
-
./configure --with-php-config=/www/server/php/73/bin/php-config --with-amqp --with-librabbitmq-dir=/usr/local/rabbitmq-c-0.8.0
-
make && make install
-
添加php。ini的扩展 vi /usr/local/php/etc/php.ini extension = /usr/local/php/lib/php/extensions/no-debug-non-zts-20181012/amqp.so
-
systemctl restart php-fpm
-
php -m 已经出现了扩展
介绍
适用于队列使用,负载较大的情况
AMQP协议图解:
生产者producter发送消息
消费者consumer接收处理消息
队列queue 存储消息的缓存
消息message生产者通过rabbitmq发送给消费者的信息,消息存储在队列
连接connection连接rabbitmq和应用服务的tcp连接
通道 channel连接里的一个虚拟通道
交换机 exchange 生产者发送消息要先发送到交换机,再由交换机发送保存到队列
绑定 binding队列与交换机的关联连接
路由键 :routekey 是供交换机查看并根据键来决定如何分发消息到队列的一个键,是消息的目的地址
用户 Users :指定用户连接rabbitmq,每个用户权限和配置的不同
特性
生产者写入到队列,消费者从队列消费。ack机制是生产者写入消息的写入确定机制。放入到队列的失败或者成功的回调机制防止生产者推送失败的情况)。
幂等性:处理同一消息多次消费者处理的问题,可以使用指纹码 唯一码
return机制: 生产者推送消息到不存在的路由键的情况下,使用returnlitener监听到
限流机制:限流api 方法 basic_qos 消息任务分组,消费者basic_ack之后mq才会推送下一组任务。
重回队列 nack(true)
ttl 生存时间 ($arg->set('x-message-ttl',10000)十秒后清除)消息设置超时时间,入队列之后超过多久清除掉。(eg:向大众用户(100万)推送消息,半小时内还没推送到这个活动(活动都快过期了),就不在推送了)
死信列机制DLX:息在一个队列中成死信,可以在另一个交换机新pubilsh到,就是回收站机制。
需要设置死信队列交换机,死信路由键绑定到普通的队列(普通队列需要设置死信交换机)中,过期消息会来到死信队列
rabbitmq延迟消息队列,使用死信
我看了这个人的案例:rabbitmq延迟队列之php实现
项目使用demo
当时直接找的例子