PHP开发程序员php

php| 初探 rabbitmq

2018-09-05  本文已影响137人  daydaygo

date: 2018-09-03 21:30:23
title: php| 初探 rabbitmq
description: 零零散散折腾了 rabbitmq 几次, 归纳总结一下先

经常看到消息队列( MQ ), 实战中比较少, 说说我的一些粗线的理解:

当然, 实践出真知, 还是希望能在业务中多实战, 或者参与相关的开源项目~

相关教程

老生常谈, 生命周期思维方式, 想一想消息是怎么在整个消息队列系统中流动的.

应用场景: 冗余 解耦 流量削峰 异步通信 扩展新 排序保证 -> 队列结构的中间件
队列介质: mysql redis 消息队列服务(rabbitmq kafka)
触发机制: 死循环while 定时脚本cron 守护进程daemon(fpm)
场景一 订单系统/配送系统解耦: 订单系统 -> 队列表 -> 配送系统
场景二 流量削峰: redis list类型实现定长队列, 请求先入队列, 超出队列长度后的请求丢弃
rabbitmq架构和原理: 完整实现AMQP 集群简化 持久化 跨平台

基于 AMQP(advanced message queue protocol, 高级消息队列协议)
集群模式: 表达式配置 HA模式 镜像队列模式
保证数据不丢失/高可靠/高可用

安装 rabbitmq

老生常谈, 直接上 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 aux
USER       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

更多配置, 可以访问 rabbitmq镜像官网 进行查看

快速开始

rabbitmq 官方文档 非常完善与清晰, 值得花时间看看

新手快速入门文档, 代码 - rabbitmq/rabbitmq-tutorials

rabbitmq 支持多种语言的 client, 这里说明支持的 php client:

queue-interop 按下不表, 还没进入 PSR.

官方的快速入门手册:

消息队列最基础的三个概念, 生产者producer + 消息队列MQ + 消费者consumer

image

如果 消费者的消费能力不足 怎么办? 多开几个 consumer 呗. 多个 consumer 怎么分担 MQ 中的消息呢? 所以在 消息队列MQ 和 消费者consumer 之间进行 负载均衡LB. LB并不是准去的说法, 通常的说法是消费者 订阅 消息队列的内容. 在我看来, LB 更有表现力 -- 消费能力不足导致需要多个消费者, 怎么和 web server 并发不够, 加机器加 LB 有些像呢?

这里我使用的 LB 这样的概念, 目的在于 LB 在服务器领域太常见了, 包含很多内容, 需要细细体会

image

发布订阅, 看起来像多个 hello world, 注意图里多了一个 rabbitmq 中的新概念 交换器exchange(图中简写为 X), 在 生产者producer 和 消息队列MQ 之间, 由 exchange 来决定消息 分发 到哪个 MQ 中

image

两个新的概念, 路由功能主体订阅 功能, 而这些都和 交换器exchange 有关, 涉及到的配置: 交换器类型(exchange type) + 路由key(routing key) + 绑定key(binding key). 为啥会这么复杂呢? 干嘛要这么多配置?

一言以蔽之, 决定 生产者producer 产生的消息, 投递到哪个 消息队列MQ 中, 最终又由哪个 consumer 消费

routing
topic

新玩法, 通过消息队列实现 远程过程调用RPC 的效果

image

我在这里并没有贴具体代码, 一则因为官方给的代码确实适合上手, 更重要是因为, 理解 rabbitmq 究竟是个什么玩意 更重要

rabbitmq 究竟是啥

放几张图辅助理解:

amqp模型 rabbitmq模型 rabbitmq消息流转

写在最后

正儿八经(准确说, 这叫 专业) 的消息队列, 架构设计上确实有一定的复杂性, 而且为了满足高性能, 还会有很多性能优化的点 -- 学习消息队列, 长路漫漫, 可以好好折腾一番了~

上一篇下一篇

猜你喜欢

热点阅读