查看原文
其他

浅谈Rabbitmq

小李 运维研习社 2022-11-05

        RabbitMQ是一种实现AMQP的消息队列协议的消息中间件,用于在分布式系统中存储转发消息,主要用作组件之间解耦,消息生产者和使用者都无需知道对方存在。它是一种典型的消费-生产者模型,producer往消息队列中不断写入消息,consumer读取或订阅队列中的消息。

        RabbitMQ最核心的组件是Exchange和Queue,简单架构如下:

几个基本概念:

Queue

        消息队列,提供了FIFO的处理机制,具有缓存消息的能力。rabbitmq中,队列消息可以设置为持久化,临时或者自动删除。

  • 设置为持久化的队列,queue中的消息会在server本地硬盘存储一份,防止系统crash,数据丢失

  • 设置为临时队列,queue中的数据在系统重启之后就会丢失

  • 设置为自动删除的队列,当不存在用户连接到server,队列中的数据会被自动删除

Exchange

        Exchange类似于数据通信网络中的交换机,提供消息路由策略。rabbitmq中,producer不是通过信道直接将消息发送给queue,而是先发送给Exchange。一个Exchange可以和多个Queue进行绑定,producer在传递消息的时候,会传递一个ROUTING_KEY,Exchange会根据这个ROUTING_KEY按照特定的路由算法,将消息路由给指定的queue。和Queue一样,Exchange也可设置为持久化,临时或者自动删除。

Exchange有4种类型:direct(默认),fanout, topic, 和headers,不同类型的Exchange转发消息的策略有所区别:

  • Direct
    直接交换器,工作方式类似于单播,Exchange会将消息发送完全匹配ROUTING_KEY的Queue

  • fanout
    广播是式交换器,不管消息的ROUTING_KEY设置为什么,Exchange都会将消息转发给所有绑定的Queue。

  • topic
    主题交换器,工作方式类似于组播,Exchange会将消息转发和ROUTING_KEY匹配模式相同的所有队列,比如,ROUTING_KEY为user.stock的Message会转发给绑定匹配模式为 * .stock,user.stock, * . * 和#.user.stock.#的队列。( * 表是匹配一个任意词组,#表示匹配0个或多个词组)

  • headers
    消息体的header匹配(ignore)

Binding

        所谓绑定就是将一个特定的 Exchange 和一个特定的 Queue 绑定起来。Exchange 和Queue的绑定可以是多对多的关系。

virtual host

        在rabbitmq server上可以创建多个虚拟的message broker,又叫做virtual hosts (vhosts)。每一个vhost本质上是一个mini-rabbitmq server,分别管理各自的exchange,和bindings。vhost相当于物理的server,可以为不同app提供边界隔离,使得应用安全的运行在不同的vhost实例上,相互之间不会干扰。producer和consumer连接rabbit server需要指定一个vhost。
在centos上安装:

1、rabbitmq是erlang语言开发的,安装前首先需要安装erlang

# yum install erlang -y // 直接安装可能报错,

# yum install ncurses-devel // 安装依赖

官方下载erlang包

# wget http://erlang.org/download/otp_src_19.0.tar.gz

解压安装erlang

# tar xzvf otp_src_19.0.tar.gz

# cd otp_src_19.0

# ./configure

# make && make install

安装完毕后测试运行一下:

#erl

1>1+2.

3

2>halt(). // 退出


2、安装rabbitmq,yum安装

# rpm -Uvh http://mirrors.sohu.com/fedora-epel/5/x86_64/epel-release-5-4.noarch.rpm

# rpm --import http://www.rabbitmq.com/rabbitmq-signing-key-public.asc

# yum install rabbitmq-server -y

官方下载: wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.5/rabbitmq-server-3.6.5.zip

解压安装

# tar xzvf rabbitmq-server-3.6.5.zip

# cd rabbitmq-server-3.6.5

# make

# make TARGET_DIR=/usr/local/rabbitmq SBIN_DIR=/usr/local/rabbitmq/sbin MAN_DIR=/usr/rabbitmq/man DOC_INSTALL_DIR=/usr/local/rabbitmq/doc install

3、安装完成后需要配置:

/usr/local/rabbitmq/sbin目录下文件说明:

rabbitmq-env // 环境配置

rabbitmq-defaults // 默认参数设置

rabbitmqctl // 管理工具

rabbitmq-plugins // 插件管理工具

rabbitmq-server // rabbitmq服务

3.1、添加自定义配置文件

RABBITMQ_NODE_IP_ADDRESS=192.168.2.2 // 自定义地址

RABBITMQ_NODE_PORT=3333 // 自定义端口号


3.2、启动:

# rabbitmq-server -detached

报错:ERROR: epmd error for host "bogon": timeout (timed out)

修改/etc/hosts

127.0.0.1 bogon

重启即可。

3.3、启用rabbitmq web管理插件,安装sbin目录下:

./rabbitmq-plugins enable rabbitmq_management

然后重启rabbitmq-server

登录web管理页面

http://192.168.2.2:15672

登录用户:guest/guest

3.4、列出所有插件

# ./rabbitmq-plugins list

3.5、安装php的rabbitmq扩展:

# yum install librabbitmq-devel.x86_64 -y

# wget http://pecl.php.net/get/amqp-1.7.1.tgz

# tar zxvf amqp-1.7.1.tgz

# cd amqp-1.7.1

# /usr/local/php/bin/phpize

# ./configure --with-php-config=/usr/local/php/bin/php-config --with-amqp

# make

# make install

# vim /usr/local/php/etc/php.ini

extension=amqp.so

重启php-fpm

# /usr/local/php/sbin/php-fpm -y /usr/local/php/etc/php-fpm.conf

php操作demo

1. 创建队列

<?php

//连接RabbitMQ

$conn_args = array( 'host'=>'192.168.2.2' , 'port'=> '3333', 'login'=>'guest' , 'password'=> 'guest','vhost' =>'/');

$conn = new \AMQPConnection($conn_args);

$conn->setTimeout(1);

$conn->connect();

//创建exchange名称和类型

$channel = new \AMQPChannel($conn);

$ex = new \AMQPExchange($channel);

$ex->setName('ttlsa_exchange');

$ex->setType(AMQP_EX_TYPE_DIRECT);

$ex->setFlags(AMQP_DURABLE | AMQP_AUTODELETE);

$ex->declare();

//创建queue名称,使用exchange,绑定routingkey

$q = new \AMQPQueue($channel);

$q->setName('ttlsa_queue');

$q->setFlags(AMQP_DURABLE | AMQP_AUTODELETE);

$q->declare();

$q->bind('ttlsa_exchange', 'ttlsa_routingkey');

//消息发布

$channel->startTransaction();

$message = json_encode(array('Hello World!','DIRECT'));

$ex->publish($message, 'ttlsa_routingkey');

$channel->commitTransaction();

$conn->disconnect();

?>


2. 获取队列信息:

<?php

//连接RabbitMQ

$conn_args = array( 'host'=>'192.168.2.2' , 'port'=> '3333', 'login'=>'guest' , 'password'=> 'guest','vhost' =>'/');

$conn = new \AMQPConnection($conn_args);

$conn->connect();

//设置queue名称,使用exchange,绑定routingkey

$channel = new \AMQPChannel($conn);

$q = new \AMQPQueue($channel);

$q->setName('ttlsa_queue');

$q->setFlags(AMQP_DURABLE | AMQP_AUTODELETE);

$q->declare();

$q->bind('ttlsa_exchange', 'ttlsa_routingkey');

//消息获取

$messages = $q->get(AMQP_AUTOACK) ;

if ($messages){

var_dump(json_decode($messages->getBody(), true ));

}

$conn->disconnect();

?>

以上是对rabbitmq的简单理解及应用,如有错误轻喷,欢迎共同探讨!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存