zoukankan      html  css  js  c++  java
  • Rabbitmq在Centos安装与使用

    安装

    • 首先需要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

    安装amqp拓展 (我php7.3 使用的一开始1.9.3 结果出了问题 尝试安装1.9.4就好了)

    • wget -c http://pecl.php.net/get/amqp-1.9.4.tgz

    • 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

    当时直接找的例子

    PHP使用RabbitMQ实例

    高山仰止,景行行止,虽不能至,心向往之。
  • 相关阅读:
    MVC+EasyUI 菜单导航的实现
    MVC4 +EasyUI 使用TreeGrid 方法
    MYSQL 内存报错 Use 'mysqld --thread_stack=#' to specify a bigger stack.
    System.Data.EntityState”在未被引用的程序集中定义
    android 学习第一天 了解事件机制,页面跳转等常用操作
    EasyUI TreeGrid DataTable转换数据实现案例
    王慧文清华大学的演讲的观点摘要
    《自由选择》
    优秀的工程师
    【mark】Windows Exploitation, post exploitation sites for reference
  • 原文地址:https://www.cnblogs.com/yudubujue/p/15702469.html
Copyright © 2011-2022 走看看