1.消息中间件简介
消息中间件是在消息的传输过程中保存消息的容器。消息中间件在将消息从它的源中继到它的目标时充当中间人的作用。队列的主要目的是提供路由并保证消息的传递,如果发送消息时接受者不可用,消息队列会保留消息,知道可以成功传递它为止,当然,消息队列保持消息也是有期限的。
2.消息中间件特点
- 采用异步处理模式
消息发送者可以发送一个消息而无须等待响应。消息发送者将消息发送到一条虚拟的通道(主题或队列
上,消息接受者则订阅或是监听通道。
- 应用程序和应用程序调用关系为松耦合关系
发送者和接受者不必了解对方、只需要确认消息
发送者和接受者不必同时在线
3.消息传递服务模型
4.消息队列的作用
解耦,异步,缓冲,收集,队列,存储
5.消息中间件的传递模型
- 点对点模型(PTP)
每个消息只用一个消费者
发送者和接受者没有时间依赖
接受者确认消息接受和处理成功
- 发布-订阅模型(Pub/Sub)
每个消息可以有多个订阅者
客户端只有订阅后才能接收消息
持久订阅和非持久订阅
6.发布-订阅模型特点
- 发布者和订阅者有时间依赖:接受者和发布者只有建立订阅关系才能收到消息
- 持久订阅:订阅关系建立后,消息就不会消失,不管订阅者是否都在线
- 非持久订阅:订阅者为了接受消息,必须一直在线,当只有一个订阅时约等于点对点模式
7. 互联网消息中间件应用场景
1.网站用户注册,注册成功后会发送邮件确认或短信(异步)
填写注册信息--用户注册服务--消息中间件--邮件服务|短信服务
2.日志进行集中收集,用于计算PV,用户行为分析
应用服务|应用服务|--消息中间件--pv分析服务|行为分析服务
3.数据复制
将数据从源头复制到多个目的地,一般是要求顺序或者保证因果序列
用于跨机房数据传输、搜索、离线数据计算
DB--DB Sync--Broker--Search|hadoop|DB
4. 延迟消息发布和暂存
把消息中间件当成可靠的消息暂存地
定时进行消息投递,比如模拟用户秒杀访问,进行系统性能压测
5.消息广播
缓存数据同步更新
往应用推送数据
8.消息中间件分类
1.推消息模型(push):消息生产者将消息发送给消息传递服务,消息传递服务又将消息推给消费者--场景:交易,注册
2.拉消息模型(pull):消费者请求消息服务接受消息,消息生产者从消息中间拉该消息--场景:行为分析,PV计算
9.metaq消息中间件(pull)
metaq是一款完全的队列模型消息中间件,服务器使用java语言编写,可在多种软硬件平台上部署。客户端支持java/c++编程语言。单台服务器可支持1万以上各消息队列,通过扩容服务器,队列数几乎可任意横向扩展。每个队列都是持久化,长度无限(取决于磁盘空间大小),并且可从队列任意位置开始消费
官网:http://metaq.taobao.org
10.metaq特点
1.生产者、服务器和消费者都可分布式
2.消息存储顺序读写
3.性能极高,吞吐量大
4.支持消息顺序
5.客户端pull,随机读,批量拉数据
6.数据迁移,扩容对用户透明
7.消费状态保存在客户端
11.rabbitMQ
是一个在AMQP协议标准基础上完整的,采用Erlang实现的工业级的消息队列MQ服务器
12.rabbitMQ架构--运行原理
13.rabbitMQ重要术语
1.sever(broker):接受客户端连接,实现AMQP消息队列路由功能的进程
2.Virtual Host:其实是一个虚拟概念,类似于权限控制组,一个Virtual Host里面可以有若干个Exchange 和Quece,但是权限控制的最小粒度是Virtual Host
3.Exchang:接受生产者发送的消息,并根据Binding规则江消息路由给服务器中的队列,Exchange Type 决定了Exchange路由消息的行为,例如:在Rabbitmq中,
Exchange Type有direct ,fanout和topic三种,不用类型的exchange路由的行为是不一样的
4.Message Queue:消息队列,用于存储还未被消费者消费的消息
5.Message:由Header和Body组成,Header是由生产者添加的各种属性的集合,包括Message是否被持久化,由那个Message Queue接受,优先级是多少等,而Body是真正需要传输的APP数据
6.Binding key:所谓绑定就是将一个特定的exchange 和一个特定的queue绑定起来,绑定关键字为bindinkey
14.rabbitMQ常用配置介绍
一般情况下,rabbitMQ的默认配置就足够了,如果希望特殊配置的话,有2个途径
1.环境变量的配置文件rabbitmq-env.conf
2.配置信息的配置文件rabbitmq.config
注意,这2个文件默认是没有的,如果需要必须自己创建
1.rabbitmq-env.conf这个文件的位置是确定和不能改变的,位于:/etc/rabbitmq目录下,这个目录需要自己创建
1
2
3
4
|
rabbitmq_node_ip_address:指定ip地址
rabbitmq_node_port:指定端口号,more5672
rabbitmq_config_file:配置文件的路径,注意配置文件后缀必须是.config
rabbitmq_log_base:日志文件路径
|
2.rabbitmq.config这是一个标准的erlang配置文件,它必须符合erlang配置文件的标准。erlangtuple,结构为{key,value},key为atm类型,value为一个term,其中关键参数为:
1
2
3
|
1.tcp_listerners设置rabbimq的监听端口,默认为5672
2.disk_free_limit磁盘低水位线,鄀磁盘容量低于指定值则停止接收数据
3.vm_memory_high_watemark,设置内存低水位线,若低于该水位线,则开启流控机制,默认值是0.4,即内存总量的40%
|
15.rabbitMQ安装
1
2
3
4
5
6
7
8
9
10
11
12
13
|
wget http:
//mirrors
.ustc.edu.cn
/fedora/epel/6/x86_64/epel-release-6-8
.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
yum
install
rebbitmq-server -y
/usr/lib/rabbitmq/bin/rabbitmq-plugins
list
/usr/lib/rabbitmq/bin/rabbitmq-plugins
enable
rabbitmq_management
/etc/init
.d
/rabbitmq-server
start
rabbitmqctl add_vhost
test
# 创建vhost
rabbitmqctl delete_vhost
test
# 删除vhost
rabbitmqctl list_vhosts
# 遍历所有虚拟主机信息
rabbitmqctl add_user
test
test
# 添加用户及密码
rabbitmqctl set_permissions -p
test
test
test
".*"
".*"
".*"
# 绑定权限,并且具备读写的权限
rabbitmqctl list_queues -p
test
# 显示所有队列
|