RabbitMQ基础学习

  1. 什么是mq?

mq简称消息队列(也叫消息中间件),通过生产者消费者模型实现系统间的解耦。生产者不断的向消息队列中去写一下信息,消息队列接收到消息会依次把消息放到队列中,日后通过消费者去消费生产者往队列中生产的消息。生产者无需关心消息是否被消费,消费者无需关心生产者有没有正常运行,整个过程没有任何api的侵入。整个过程是异步的。跨系统通信时首选消息队列。

  1. 市场上主流的消息中间件

老牌的Apache下的ActiveMQ、RabbitMQ、Apache下炙手可热的Kafka,阿里巴巴自主开发RocketMQ等。

  1. 不同MQ特点

1.ActiveMQ

ActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线,它是一个完全支持JMS规范的消息中间件。丰富的API,多种集群架构模式让ActiveMQ在业界成为老牌的消息中间件,在中小型企业颇受欢迎!

2.Kafka

Kafka是LinkedIn开源的分布式发布-订阅消息系统,目前归属于Apache顶级项目。Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输,0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格要求,追求产生大量数据的互联网服务的数据收集业务。

3.RocketMQ

RocketMQ是阿里开源的消息中间件,它是纯java开发,具有高吞吐量、高可用性,适合大规模分布式系统应用的特点。RocketMQ思路起源于Kafka,但并不是Kafka的一个Copy,它对消息的可靠传输及事务性做了优化,目前在阿里集团被广泛应用于交易、充值、流计算,消息推送、日志流式处理、binglog分发等场景。

4.RabbitMQ

RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。

RabbitMQ比Kafka可靠,kafka更适合IO高吞吐的处理,一般应用在大数据日志处理或对实时性(少量延迟),可靠性(少量丢数据)要求稍低的场景使用,比如ELK日志收集。

AMQP协议

AMQP(advanced message queuing protocol)在2003年时被提出,最早用于解决金融领域不同平台之间的消息传递交互问题。顾名思义,AMQP是一种协议,更准确的说是一种binary wire-level protocol(链接协议)。这是其和JMS的本质差别,AMQP不从API层进行限定,而是直接定义网络交换的数据格式。这使得实现了AMQP的provider天然性就是跨平台的。以下是AMQP协议类型:

------------Server----------------

Virtual  host(基本一个应用一个虚拟主机,类似于关系型数据库中的库,虚拟主机需要与用户进行绑定)

----------------------------------

----------------------------------------               Exchange

Publisher application---------生产消息------------>  +-----------------------+

----------------------------------------            +-----------------------+

----------------------------------------              Message Queue

Consumer application<--------消费消息-----------  +-----------------------+

----------------------------------------    +-----------------------+

以下协议可以理解为生产者先把消息发给Server(可以理解rabbitmq的一个节点,也就是一个rabbitmq服务器),生产者通过虚拟主机把消息发给交换机,交换机与队列之间进行绑定关系(点对点(一对一)、路由、发布订阅),消费者直接从队列中消费消息。

  1. rabbitmq安装
  1. 将rabbitmq安装包上传到linux系统中

erlang-22.0.7-1.el7.x86_64.rpm

rabbitmq-server-3.7.18-1.el7.noarch.rpm

  1. 安装erlang依赖包

rpm -ivh erlang-22.0.7-1.el7.x86_64.rpm

  1. 安装rabbitmq安装包(需要联网)

yum install -y rabbitmq-server-3.7.18-1.el7.noarch.rpm

注意:默认安装完成后配置文件模板在:/usr/share/doc/rabbitmq-server-3.7.18/rabbitmq.

config.example目录中,需要将配置文件复制到/etc/rabbitmq/目录中,并修改名称为rabbitmq

.config

  1. 复制配置文件

cp /usr/share/doc/rabbitmq-server-3.7.18/rabbitmq.config.example  /etc/rabbitmq/rabbit

mq.config

  1. 查看配置文件位置

ls /etc/rabbitmq/rabbitmq.config

  1. 修改配置文件(参见下图:)

vim /etc/rabbitmq/rabbtmq.config

61 行 %%{loopback_users, []},

去掉%%,以及最后的,逗号,修改为{loopback_users, []}

  1. 执行如下命令,启动rabbitmq中的插件管理

rabbitmq-plugins  enable  rabbitmq.management

出现如下说明:

Enabling plugins on node rabbit@localhost:

     Rabbitmq_management

The following plugins have been configured:

Rabbitmq_management

Rabbitmq_management_agent

Rabbitmq-web_dispatch

  Applying plugin configuration to rabbit@localhost...

The following plugins have been enabled:

Rabbitmq_management

Rabbitmq_management_agent

Rabbitmq_web_dispatch

Set 3 plugins.

Offline change: changes will take effect at broker restart.

  1. 启动rabbitmq的服务

启动:systemctl start rabbitmq-server

重启:systemctl restart rabbitmq-server

停止:systemctl stop rabbitmq-server

  1. 查看服务状态

systemctl start rabbitmq-server

  1. 关闭防火墙服务

从开机启动服务列表移除:systemctl disable firewalld

停止防火墙:systemctl stop firewalld

  1. 访问web管理界面

http://10.15.0.8:15672/

默认用户名/密码:guest/guest

  1. rabbitmq配置

1.服务启动相关

systemctl start|restart|stop|status rabbimq-server

  1. 管理命令行 用来在不使用web管理界面情况下命令Rabbitmq

rabbitmqctl help 可以查看更多命令

  1. 插件命令行

Rabbitmq-plugins enable|list|disable

  1. Rabbitmq的第一个程序
  1. AMQP协议的回顾

AMQP(advanced message queuing protocol)在2003年时被提出,最早用于解决金融领域不同平台之间的消息传递交互问题。顾名思义,AMQP是一种协议,更准确的说是一种binary wire-level protocol(链接协议)。这是其和JMS的本质差别,AMQP不从API层进行限定,而是直接定义网络交换的数据格式。这使得实现了AMQP的provider天然性就是跨平台的。以下是AMQP协议类型:

------------Server----------------

Virtual  host(基本一个应用一个虚拟主机,类似于关系型数据库中的库,虚拟主机需要与用户进行绑定)

----------------------------------

----------------------------------------               Exchange

Publisher application---------生产消息------------>  +-----------------------+

----------------------------------------            +-----------------------+

----------------------------------------              Message Queue

Consumer application<--------消费消息-----------  +-----------------------+

----------------------------------------     +-----------------------+

以下协议可以理解为生产者先把消息发给Server(可以理解rabbitmq的一个节点,也就是一个rabbitmq服务器),生产者通过虚拟主机把消息发给交换机,交换机与队列之间进行绑定关系(点对点(一对一)、路由、发布订阅),消费者直接从队列中消费消息。

  1. RabbitMQ支持的消息模型

  1. 引入依赖

<dependency>

<groupId>com.rabbitmq</groupId>

<artifactId>amqp-client</artifactId>

<version>5.7.2</version>

</dependency>

  1. 第一种模式(直连,也就是点对点,使用rabbitmq默认交换机(代码里面是空字符串),生产者直接与队列绑定关系,这种模式一次只允许一个消费者消费,适用于登陆注册功能,比如注册成功之后啊,可能要在注册的过程中发短信,可以把业务代码放在当前系统,发短信放到消息队列中,由另外一个短信系统完成短信发送服务。

在rabbitmq页面创建虚拟主机,然后创建相应用户,再把虚拟主机与用户进行绑定。

在上面的模型中,有以下概念:

  1. P:生产者,也就是要发送消息的程序;
  1. C:消费者:消费的接收者,会一直等到消息到来;
  2. queue: 消息队列,图中红色部分,类似一个邮箱,可以缓存消息;生产者向其中投递消息,消费者从中取出消息;
  3. 生产者与消费者绑定的队列及其属性需要一模一样

channel.queueDeclare(hello,false,false,false,null);

不好的地方:消费者消费太慢,生产者不停的生产消息,消费者来不及及时处理,会导致队列里面的消息堆积。

1.开发生产者

//创建连接mq的连接工厂对象

ConnectionFactory connectionFactory = new ConnectionFactory();

//设置连接rabbitmq主机

connectionFactory.setHost(“10.15.0.9”);

//设置端口号

connectionFactory.setPort(5672);

//设置连接哪个虚拟主机

connectionFactory.setVirtualHost(“/ems”);

connectionFactory.setUsername(“ems”);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值