消息中间件就是在消息的传输过程中保存消息的容器。消息中间件再将消息从它的源中继到它的目标时充当中间人的作用。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功的传递它为止,当然,消息队列保存消息也是有期限点的。

一、消息中间件特点:

1.1、采用异步处理模式

消息发送者可以发送一个消息而无须等待响应。消息发送者将消息发送到一条虚拟的通道(主题或队列)上,消息接受者则订阅或是监听该通道。一条消息可能最终转发给一个或多个消息接受者,这些接受者都无须对消息发送者做出同步回应。整个过程是异步的。比如用户消息注册,注册完毕后过段时间发送邮件或者短息

1.2、应用程序和应用程序调用关系为松耦合关系

发送者和接受者不必了解对方、只需要确认消息

发送者和接受者不必同时在线

比如在线交易系统为了保证数据的最终一致,在支付系统处理完成后会把支付结果放到消息中间件里通过订单系统修改订单支付状态。两个系统通过 消息中间件解耦

二、消息传递服务模型:

2.1、消息中间件的传递模型:

2.1.1、点对点模型(PTP)

点对点模型用于消息生产者和消息消费者之间点对点的通信。消息生产者将消息发动到由某个名字标识的特定消费者。这个名字实际上对应于消息服务中的一个队列(Queue),在消息传送给消费者之前它被存储在这个队列中。队列消息可以放在内存中也可以是持久的,以保证在消息服务出现故障时扔然能够传递消息

点对点模型特点:

(1)、每个消息只用一个消费者

(2)、发送者和接受者没有时间依赖

(3)、接受者确认消息接受和处理成功

2.1.2、发布-订阅模型(Pub/Sub)

发布者/订阅者模型支持向一个特定的消息主题生产消息。0或多个订阅者可能对接收来自特定消息主题的消息感兴趣。在这种模型下,发布者和订阅者彼此不知道对方。这种模式好比是匿名公告板。

这种模式被概括为:多个消费者可以获得消息。在发布者和订阅者之间存在时间依赖性。发布者需要建立一个订阅(subscription),以便能够消费者订阅。订阅者必须保持持续的活动状态以接受消息,除非订阅者建立了持久的订阅。在这种情况下,在订阅者未连接时发布的消息将在订阅者重新连接时重新发布。

发布/订阅模型特性:

(1)、每个消息可以有多个订阅者

(2)、客户端只有订阅后才能接收到消息

(3)、持久订阅和非持久订阅

发布/订阅模型特点:

(1)、发布者和订阅者有时间依赖

接收者和发布者只有建立订阅关系才能收到消息

(2)、持久订阅

订阅关系建立后,消息就不会消失,不管订阅者是否都在线

(3)、非持久订阅

订阅者为了接收消息、必须一直在线,当只有一个订阅者时约等于点对点模式

2.2、消息中间件分类:

2.2.1、(push)推消息模型:消息生产者将消息发送给消息传递服务,消息传递服务又将消息推送给消息消费者。

2.2.2、(pull)拉消息模型:消费者请求消息服务接收消息,消息生产者从消息中间件拉该消息。

Metaq

Rabbitmq是一个在AMQP协议标准基础上完整的,可复用的企业消息系统。采用Erlang实现的工业级的消息队列(MQ)服务器。

AMQP(高级消息队列协议)是一个异步消息传递所使用的应用层协议规范,作为线路层协议,而不是API(例如JMS),AMQP客户端能够无视消息的来源任意发送和接收信息。AMQP的原始用途只是为金融界提供一个可以彼此协作的消息协议,而现在的目标则是为通用消息队列架构提供通用构建工具。因此,面向消息的中间件(MOM)系统,例如发布/订阅队列,没有作为基本元素实现。反而通过发送简化的AMQ实体,用户被赋予了构建例如这些实体的能力。这些实体也是规范的一部分,形成了在线路层协议顶端的一个层级:AMQP模型。这个模型统一了消息模式,诸如之前提到的发布/订阅,队列,事务以及流数据,并且添加了额外的特性,例如更易于扩展,基于内容的路由。

安装Rabbitmq:

[root@linux-node3 ~]# wget http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm

[root@linux-node3 ~]# rpm -ivh epel-release-6-8.noarch.rpm

[root@linux-node3 ~]# yum install -y rabbitmq-server

[root@linux-node3 ~]# /etc/init.d/rabbitmq-server start

[root@linux-node3 ~]# chkconfig rabbitmq-server on

[root@linux-node3 ~]# /usr/lib/rabbitmq/bin/rabbitmq-plugins list  ##列出所有的插件

[root@linux-node3 ~]# /usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management ##启用web监控插件

The following plugins have been enabled:

mochiweb

webmachine

rabbitmq_web_dispatch

amqp_client

rabbitmq_management_agent

rabbitmq_management

Plugin configuration has changed. Restart RabbitMQ for changes to take effect.

[root@linux-node3 ~]# /etc/init.d/rabbitmq-server restart

Restarting rabbitmq-server: SUCCESS

rabbitmq-server.

[root@linux-node3 ~]# netstat -lntup|grep 5672

tcp        0      0 0.0.0.0:15672   0.0.0.0:*      LISTEN      2939/beam.smp

tcp        0      0 0.0.0.0:55672   0.0.0.0:*      LISTEN      2939/beam.smp

tcp        0      0 :::5672       :::*         LISTEN      2939/beam.smp

[root@linux-node3 ~]# rabbitmqctl add_vhost test ##创建vhost:test

Creating vhost "test" ...

...done.

[root@linux-node3 ~]# rabbitmqctl list_vhosts   ##遍历所有虚拟主机信息

Listing vhosts ...

/

test

...done.

[root@linux-node3 ~]# rabbitmqctl add_user test 123456   ##添加用户及密码

Creating user "test" ...

...done.

[root@linux-node3 ~]# rabbitmqctl set_user_tags test administrator  ##设置用户test的角色

Setting tags for user "test" to [administrator] ...

...done.

[root@linux-node3 ~]#rabbitmqctl set_permissions -p test test ".*" ".*" ".*" ##绑定权限,并且具备读写的权限

Setting permissions for user "test" in vhost "test" ...

...done.

[root@linux-node3 ~]# rabbitmqctl list_queues  ##显示所有队列

Listing queues ...

...done.

[root@linux-node3 ~]# /etc/init.d/rabbitmq-server restart   ##一定要restart

Restarting rabbitmq-server: SUCCESS

rabbitmq-server.

常用命令:

/etc/init.d/rabbitmq-server start|restart|stop|reload

rabbitmqctl add_vhost vhostname  创建vhost

rabbitmqctl delete_vhost vhostname 删除vhost

rabbitmqctl list_vhosts   遍历所有虚拟主机信息

rabbitmqctl add_user username password  添加用户及密码

rabbitmqctl change_password username newpassword 修改用户密码

rabbitmqctl set_user_tags username administrator 设置username的角色(administrator)

rabbitmqctl set_permissions -p vhost user ".*" ".*" ".*"  绑定权限,并且具备读写的权限

rabbitmqctl list_queues  显示所有队列

注:不管能否解决你遇到的问题,欢迎相互交流,共同提高!

###############################################################################################

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 # 显示所有队列

  

#######################################################################################

 

[root@rabbitmq ~]# cat /etc/redhat-release
CentOS release 6.8 (Final)
[root@rabbitmq ~]# uname -r
2.6.32-642.el6.x86_64

#基础环境配置hostname
sed -i "2c HOSTNAME=rabbitmq" /etc/sysconfig/network
hostname rabbitmq #sysctl
cat >> /etc/sysctl.conf <<EOF
net.ipv4.tcp_fin_timeout = 5
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
EOF
sysctl -p #设置连接数最大值
echo '* - nofile 65535' >>/etc/security/limits.conf
ulimit -SHn 65535 #selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
getenforce #chkconfig
export LANG=en
for zsq in `chkconfig --list|grep "3:on"|awk '{print $1}'|grep -vE "crond|network|rsyslog|sshd"`
do
chkconfig $zsq off
done
/etc/init.d/iptables stop #date
yum -y install ntpdate
\cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime echo "#time sync by zsq at $(date +%F)" >> /var/spool/cron/root
echo "*/10 * * * * /usr/sbin/ntpdate 10.10.88.1 &>/dev/null" >>/var/spool/cron/root #Install rabbitmq
yum install wget vim -y
cd /usr/local/src/ wget http://www.rabbitmq.com/releases/erlang/erlang-18.3.4.4-1.el6.x86_64.rpm
rpm -ivh erlang-18.3.4.4-1.el6.x86_64.rpm wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
#安装出错可以替换下YUM链接
# sed -i -e '3 s/^#//' /etc/yum.repos.d/epel.repo
# sed -i -e '4 s/^/#/' /etc/yum.repos.d/epel.repo
yum install socat -y wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.6/rabbitmq-server-3.6.6-1.el6.noarch.rpm
rpm -ivh rabbitmq-server-3.6.6-1.el6.noarch.rpm cd /etc/rabbitmq
cp /usr/share/doc/rabbitmq-server-3.6.6/rabbitmq.config.example /etc/rabbitmq/ mv rabbitmq.config.example rabbitmq.config
touch rabbitmq-env.conf
cat >> rabbitmq-env.conf << eof
RABBITMQ_LOG_BASE=/home/rabbitmq/log
eof
mkdir /home/rabbitmq/log -p
chown rabbitmq.rabbitmq -R /home/rabbitmq
/etc/init.d/rabbitmq-server start
chkconfig rabbitmq-server on #Add user
rabbitmqctl add_user admin admin #创建用户
rabbitmqctl set_user_tags admin administrator
rabbitmq-plugins enable rabbitmq_management #开启管理界面 #rabbitmq.config文件
sed -i '64 d' rabbitmq.config
sed '63 a {loopback_users, []},' -i rabbitmq.config
sed '218 a{vm_memory_high_watermark, 0.9}' -i rabbitmq.config #内存设置 #rabbitmq数据是根据当前hostname作为node节点作为数据名保存、重启会丢失用户信息
echo 'NODENAME=rabbit@q' | sudo tee -a /etc/rabbitmq/rabbitmq-env.conf
echo '127.0.0.1 q' | sudo tee -a /etc/hosts
查看rabbitmq的数据保存路径 cat /var/lib/rabbitmq/mnesia/

service rabbitmq-server restart 其它命令:
rabbitmqctl list_users #查看用户信息
rabbitmqctl list_queues #显示队列
rabbitmqctl change_password API API123.. #修改用户API密码 rabbitmq配置
一般情况下,RabbitMQ的默认配置就足够了。如果希望特殊设置的话,有两个途径:
一个是环境变量的配置文件 /etc/rabbitmq/rabbitmq-env.conf ;
一个是配置信息的配置文件 /etc/rabbitmq/rabbitmq.conf;
注意,这两个文件默认是没有的,如果需要必须自己创建。
管理web界面登陆
在浏览器中输入http://127.0.0.1:15672/
输入用户名和密码(默认为guest)
 

学习RabbitMQ(五)的更多相关文章

  1. openresty 学习笔记五:访问RabbitMQ消息队列

    openresty 学习笔记五:访问RabbitMQ消息队列 之前通过比较选择,决定采用RabbitMQ这种消息队列来做中间件,目的舒缓是为了让整个架构的瓶颈环节.这里是做具体实施,用lua访问Rab ...

  2. 官网英文版学习——RabbitMQ学习笔记(十)RabbitMQ集群

    在第二节我们进行了RabbitMQ的安装,现在我们就RabbitMQ进行集群的搭建进行学习,参考官网地址是:http://www.rabbitmq.com/clustering.html 首先我们来看 ...

  3. 官网英文版学习——RabbitMQ学习笔记(一)认识RabbitMQ

    鉴于目前中文的RabbitMQ教程很缺,本博主虽然买了一本rabbitMQ的书,遗憾的是该书的代码用的不是java语言,看起来也有些不爽,且网友们不同人学习所写不同,本博主看的有些地方不太理想,为此本 ...

  4. 从零开始学习jQuery (五) 事件与事件对象

    本系列文章导航 从零开始学习jQuery (五) 事件与事件对象 一.摘要 事件是脚本编程的灵魂. 所以本章内容也是jQuery学习的重点. 本文将对jQuery中的事件处理以及事件对象进行详细的讲解 ...

  5. 前端学习 第五弹: CSS (一)

    前端学习 第五弹: CSS (一) 创建css: <link rel="stylesheet" type="text/css" href="my ...

  6. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

  7. Android Animation学习(五) ApiDemos解析:容器布局动画 LayoutTransition

    Android Animation学习(五) ApiDemos解析:容器布局动画 LayoutTransition Property animation系统还提供了对ViewGroup中的View改变 ...

  8. 六、Android学习第五天——Handler的使用(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 六.Android学习第五天——Handler的使用 注意:有很多功能是不 ...

  9. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

  10. java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

随机推荐

  1. windev中编辑表单确认按钮的code规范建议

    编辑表单的确认操作,是一个常规操作,根据过往经验,建议按以下规范代码来撸.案例如下所示(主子表保存): //填报规范:必填项目 IF COMBO_招聘职位 = "" OR COMB ...

  2. 细述kubernetes开发流程

    本文介绍如何对kubernetes进行二次开发,仓库如何管理,git分支如何管理,怎样利用CI去编译与发布以及如何给社区贡献代码等,结合实际例子,望对大家有所帮助. 开发环境构建 Fork 把gith ...

  3. Delegate 委托细说

    目录 委托的申明 委托的赋值 委托实例方法的使用C#Invoke\BeginInvoke\Endinoke  系统自带的委托Action.Action<T>.Func<T>.P ...

  4. Qt:QTableWidgetItem

    0.说明 QTableWidgetItem指明QTableWidget中的一个Item.Item通常包含文本.图标.checkbox. 最常用的构造Item的方式是:不指定该Item所在的TableW ...

  5. Python:格式化字符串的几种方式

    1.% 'abc%s'%'123' 'abc123' 'abc%s%s'%('123','456') 'abc123456' 当变量v是一个Tuple.List且其中元素数量和字符串中%数量相同时,可 ...

  6. adb常用命令大全——查看手机设备信息

    查看手机型号 adb shell getprop ro.product.model 查看电池状况 adb shell dumpsys battery 其中 scale 代表最大电量,level 代表当 ...

  7. Chapter09 项目

    Chapter09 项目 房屋出租系统(面向对象中级) 9.1 房屋出租系统-需求 9.1.1项目需求说明 实现基于文本界面的<房屋出租软件>. 能够实现对房屋信息的添加.修改和删除(用数 ...

  8. 『德不孤』Pytest框架 — 10、setUp()和tearDown()函数

    目录 1.setUp()和tearDown()函数介绍 2.setUp()和tearDown()函数作用 3.setUp()和tearDown()函数说明 4.示例 (1)方法级 (2)类级 (3)函 ...

  9. laravel 返回统一的json数据

    laravel 在Api接口开发中,可以使用 response()->json(["code"=>200,"msg"=>"ok&qu ...

  10. jQuery Validatede 结合Ajax 表单验证提交

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...