消息列队
简介
“消息队列”是在消息的传输过程中保存消息的容器。
理论讲解
rabbitmq:AMQP advance message queuing protocol
Redis:10k大小是分水岭
MemcacheQ:支持多条列队/并发性能好
MSMQ:最大的数据体积4M,能承载任何消息的请求
zeroMQ:最快的消息列队,高吞吐量/低延迟---在金融界应用的非常多,缺点就是非持久化列队
Kafka:能将消息分散到不同的节点上,高吞吐量可达到10万每秒。
ActiveMQ:java世界的中坚力量,消耗低,中间件中的瑞士军刀
exchange:消息交换机,指定消息按照什么规则路由到哪个列队
Queue:消息的载体每个消息都会被投入到一个或多个列队中
binding:绑定,把Exchange和Queue按照一定的规则绑定起来
Routingkey:路由关键字,exchange根据这个关键字进行消息投递
Connection:是一个TCP的连接
Channel:虚拟连接,在Connection建立之后建立。真正传输消息
Vhost:虚拟主机,划分权限,且每个vhost之间时独立的。
1、客户端用一个TCP建立连接,然后打开一个channel
2、客户端声明了一个Exchange,并设置相关属性
3、客户端声明一个Queue,并设置相关属性
4、客户端使用Routing key 在exchange和queue之间绑定关系
5、客户端投递消息到exchange
做持久化要求:
exchange、queue、message三个同时开启持久化才生效
client:
生产消息producerA producerB
订阅消息consumerA consumerB
消息ACK机制:
什么时真确的接收?通过ACK
1、每个message都要被ACK(只保证一个人准确无误的收到消息,不保证所有人)
2、如果有message消息没有被ACK则被投递到下一个consumer
3、如果一次未恢复ACK,则不会再次收到message
4、ACK机制可以起到限流的作用
实验步骤
首先要一个lnmp环境
先安装rabbitmq-c并编译
tar -zxvf rabbitmq-c-0.7.1.tar.gz
cd rabbitmq-c-0.7.1
./configure --prefix=/usr/local/rabbitmq-c
make && make install
之后打amqp模块
gunzip amqp-1.6.1.tgz
tar xvf amqp-1.6.1.tar
cd amqp-1.6.1
安装依赖
yum -y install autoconf
phpize #不打这个命令不能用 ./configure 命令
./configure --with-php-config=/usr/local/php/bin/php-config --with-amqp --with-librabbitmq-dir=/usr/local/rabbitmq-c/
make && make install
添加模块
vim /usr/local/php/php.ini
extension=amqp.so
重启php
service php-fpm restart
写入phpinfo主页
vim /usr/local/nginx/html/index.php
<?php
phpinfo();
?>
访问查看添加成功没有
firefox 192.168.1.1/index.php
单机安装rabbit
rpm -qa | grep erlang #假如有这个服务就rpm -e nodeps卸载
按顺序安装
yum -y localinstall erlang-solutions-1.0-1.noarch.rpm
yum -y localinstall erlang-18.1-1.el6.x86_64.rpm
yum -y localinstall socat-1.7.2.3-1.el6.x86_64.rpm
yum -y localinstall rabbitmq-server-3.6.6-1.el6.noarch.rpm
启动服务
service rabbitmq-server start
Chkconfig --add rabbitmq-server
chkconfig rabbitmq-server on
chkconfig rabbitmq-server --list
rabbitmqctl add_user admin redhat #这个是设置用户名密码 admin用户 redhit密码
rabbitmqctl set_user_tags admin administrator #将你创建的用户admin加入管理员组
rabbitmq-plugins enable rabbitmq_management #启动rabbitmq的管理功能
第二节点
Rabbitmqctl stop_app
Rabbitmqctl join_cluster --ram rabbit@rabbit1
Rabbitmqctl start_app
第三节点
Rabbitmqctl stop_app
Rabbitmqctl join_cluster --ram rabbit@rabbit1
Rabbitmqctl start_app
第一节点
Rabbitmqctl cluster_status
rabbitmqctl add_user admin redhat #这个是设置用户名密码 admin用户 redhit密码
rabbitmqctl set_user_tags admin administrator #将你创建的用户admin加入管理员组
rabbitmq-plugins enable rabbitmq_management #启动rabbitmq的管理功能
Rabbitmqctl cluster——status #查看群集节点的状态
RabbitMQ的群集
完全依赖erlang的cluster,erlang.cookie权限必须是400
集群方式:
1、普通模式:
2、镜像模式:
ha-mode
all:数据镜像到所有节点
exactly:数据镜像到随机节点
nodes:数据镜像到指定节点
集群节点:
1、内存节点:对外提供服务
2、磁盘节点:做持久化更好
多台主机安装rabbitMQ搭建集群:
清除防火墙
vim /etc/hosts
192.168.1.10 rabbitmq1
192.168.1.20 rabbitmq2
192.168.1.30 rabbitmq3
确保主机名必须能够ping通
创建erlang的cookie
vim /var/lib/rabbitmq/.erlang.cookie #三台主机的cookie值必须一样。
必须手动重启 重启之后修改的主机名生效
主节点:
rabbitmqctl stop_app
ra… reset
... start_app (返回节点地址)
.... cluster_status 查看集群状态(只有主节点能够查看)
client:客户端加入集群
rabb... stop_app
.... reset
.... join_cluster --ram(内存模式,不加默认为磁盘模式) 节点地址 加入集群
..... start_app
图形化管理
创建集群用户
... add_user admin 123.com
.... set_user_tags admin administrator
rabbit-plugins enable rabbitmq_management
client:
rabbit-plugins enable rabbitmq_management
访问验证
firefox http://192.168.1.20:15672
登录rabbitmq
添加vhost
添加策略
添加列队
推送消息
查看消息是否镜像
ls /var/lib/rabbitmq/mnesia/rabbit\@rabbitmq1/queues
HECKMQIQFCQCVEIFPVTH