date: 2018-09-03 21:30:23
title: php| 初探 rabbitmq
description: 零零散散折腾了 rabbitmq 几次, 归纳总结一下先
经常看到消息队列( MQ ), 实战中比较少, 说说我的一些粗线的理解:
引入消息队列, 使系统之间解耦 -> 当然还有很多 小型项目 使用 重项目 的方式(系统拆分, 不存在的!); 解耦这部分的内容, 后来还会讲到
通过将流程 异步化, 增加每部分的吞吐能力, 从而实现最终增加系统性能, 这一点有点类似服务器领域的 同步 -> 异步/协程, 可以参考 swoole| swoole 协程初体验
当然, 实践出真知, 还是希望能在业务中多实战, 或者参与相关的开源项目~
相关教程
老生常谈, 生命周期思维方式, 想一想消息是怎么在整个消息队列系统中流动的.
RabbitMQ与AMQP协议详解: 强烈推荐, 理解基础概念非常好的一篇文章
PHP消息队列实现及应用: 简单入门级, 不用纠结代码, 关注应用场景和解决方式
应用场景: 冗余 解耦 流量削峰 异步通信 扩展新 排序保证 -> 队列结构的中间件
队列介质: mysql redis 消息队列服务(rabbitmq kafka)
触发机制: 死循环while 定时脚本cron 守护进程daemon(fpm)
场景一 订单系统/配送系统解耦: 订单系统 -> 队列表 -> 配送系统
场景二 流量削峰: redis list类型实现定长队列, 请求先入队列, 超出队列长度后的请求丢弃
rabbitmq架构和原理: 完整实现AMQP 集群简化 持久化 跨平台
基于 AMQP(advanced message queue protocol, 高级消息队列协议)
集群模式: 表达式配置 HA模式 镜像队列模式
保证数据不丢失/高可靠/高可用
安装 rabbitmq
老生常谈, 直接上 docker:
docker环境快速安装: 阿里云提供, 安装/加速 全搞定
docker-compose, 使用 rabbitmq 官方镜像:
version: '3'services: rabbitmq: # https://hub.docker.com/_/rabbitmq/ image: rabbitmq:3.7.7-management-alpine hostname: myrabbitmq ports: - "5672:5672" # mq - "15672:15672" # admin
就这么几行, rabbitmq 就配置好了, 使用 docker-compose up -d rabbit
启动, 大功告成
这里使用的 management
版本的 rabbitmq, 管理控制台地址 http://localhost:15672
, 初始密码 guest/guest
进入容器内部看看:
# 进入容器docker-compose exec rabbitmq bash # 查看启动的服务bash-4.4# ps auxUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND rabbitmq 1 0.0 0.0 1612 1012 ? Ss 06:25 0:00 /bin/sh /opt/rabbitmq/sbin/rabbitmq-server rabbitmq 90 0.0 0.0 1068 660 ? S 06:25 0:00 /usr/lib/erlang/erts-9.3/bin/epmd -daemon rabbitmq 158 0.5 3.9 1707624 81152 ? Sl 06:25 0:37 /usr/lib/erlang/erts-9.3/bin/beam.smp -W w -A 64 -MBas ageffcbf -MHas ageffcbf -MBlmbcs 512 -MHlmbcs 512 -MMmcs 30 -P 1048576 -t 5000000 -s rabbitmq 265 0.0 0.0 752 536 ? Ss 06:25 0:00 erl_child_setup 1048576 rabbitmq 306 0.0 0.0 772 4 ? Ss 06:25 0:00 inet_gethost 4 rabbitmq 307 0.0 0.0 772 32 ? S 06:25 0:00 inet_gethost 4 root 3258 0.0 0.0 6364 2004 pts/0 Ss 07:25 0:00 bash root 6813 0.0 0.0 5696 628 pts/0 R+ 08:23 0:00 ps aux# rabbitmq 相关命令行命令bash-4.4# rabbitmq rabbitmq-defaults rabbitmq-diagnostics rabbitmq-env rabbitmq-plugins rabbitmq-server rabbitmqadmin rabbitmqctl
rabbitmqctl: rabbitmq control
rabbitmq-plugins: 也可以通过 rabbitmq-plugins 来开启管理控制台
更多配置, 可以访问 rabbitmq镜像官网 进行查看
快速开始
rabbitmq 官方文档 非常完善与清晰, 值得花时间看看
新手快速入门文档, 代码 - rabbitmq/rabbitmq-tutorials
rabbitmq 支持多种语言的 client, 这里说明支持的 php client:
php-amqplib: compoer package, 入门 rabbitmq 最简单的方式,
composer require
即可完成安装ext-amqp: PHP扩展, 需要安装
ext-amqp
扩展, 性能更优
queue-interop
按下不表, 还没进入 PSR.
官方的快速入门手册:
hello world
消息队列最基础的三个概念, 生产者producer + 消息队列MQ + 消费者consumer
image
work queues
如果 消费者的消费能力不足 怎么办? 多开几个 consumer 呗. 多个 consumer 怎么分担 MQ 中的消息呢? 所以在 消息队列MQ 和 消费者consumer 之间进行 负载均衡LB. LB并不是准去的说法, 通常的说法是消费者 订阅 消息队列的内容. 在我看来, LB 更有表现力 -- 消费能力不足导致需要多个消费者, 怎么和 web server 并发不够, 加机器加 LB 有些像呢?
这里我使用的 LB 这样的概念, 目的在于 LB 在服务器领域太常见了, 包含很多内容, 需要细细体会
image
pub/sub
发布订阅, 看起来像多个 hello world
, 注意图里多了一个 rabbitmq 中的新概念 交换器exchange
(图中简写为 X), 在 生产者producer 和 消息队列MQ 之间, 由 exchange 来决定消息 分发 到哪个 MQ 中
image
routing/topic
两个新的概念, 路由功能 和 主体订阅 功能, 而这些都和 交换器exchange 有关, 涉及到的配置: 交换器类型(exchange type)
+ 路由key(routing key)
+ 绑定key(binding key)
. 为啥会这么复杂呢? 干嘛要这么多配置?
一言以蔽之, 决定 生产者producer 产生的消息, 投递到哪个 消息队列MQ 中, 最终又由哪个 consumer 消费
routing
topic
RPC
新玩法, 通过消息队列实现 远程过程调用RPC 的效果
image
我在这里并没有贴具体代码, 一则因为官方给的代码确实适合上手, 更重要是因为, 理解 rabbitmq 究竟是个什么玩意 更重要
rabbitmq 究竟是啥
首先是 MQ 最基础的概念: 生产者producer + 消息队列MQ(狭义指存储消息的队列类型的数据结构) + 消费者consumer
consumer 怎么从 MQ 中获取消息 + consumer获取消息后确认(ack): 可以近似理解 MQ 和 consumer 之间需要一层 LB
producer 怎么投递消息到 MQ 中: exchange + exchange type + routing key + binding key -> 消息路由/主题订阅
怎么扩展 MQ 的性能呢: 集群, 涉及到集群, 又会新增很多概念了
放几张图辅助理解:
amqp模型
实际使用过程中, 还需要 tcp 连接相关的概念: connection + channel
rabbitmq模型
这张图可以看到消息msg 的 生命周期
rabbitmq消息流转
作者:daydaygo
链接:https://www.jianshu.com/p/6bbdcce31663
共同学习,写下你的评论
评论加载中...
作者其他优质文章