RebbitMQ

RebbitMQ学习

RebbitMQ是什么?

RebbitMQ是消息队列,消息中间件,

RebbitMQ使用场景

服务解耦

假设有这样一个场景,服务A产生数据,而服务B,C,D需要这些数据,那么我们可以在A服务中直接调用B,C,D服务,把数据传递到下游服务即可。
,但是随着我们的应用规模不断扩大,会有更多的服务需要A的数据,如果服务过多维护会很困难。这是由于服务之间耦合度过于紧密。
这时候用到rabbitMQ,作为一个消息中间接件,来达到服务解耦的效果。

流量削峰

假设我们有一个应用,平均访问量是每秒300请求,那么一台服务器可以轻松应对,而在高峰期,访问量翻了10倍,达到每秒30000次请求,那么单台服务器 无法应对,这时增加服务器,但是会浪费服务器。
这种情况,我们就可以使用RabbitMQ来进行流量削峰。

异步调用

考虑订外卖支付情况。
支付后要发送支付成功的通知,在寻找外卖小哥来进行配送,而寻找外卖小哥的过程非常耗时,尤其是高峰期,客户要等待好久
在这里插入图片描述

这种情况,我们可以使用 RabbitMQ来进行流量削峰,高峰情况下,瞬间出现的大量数据请求数据,先发送到消息队列服务器,排队等待处理,在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

rabbitmq

RabbitMQ是一种消息中间件,用于处理来自客户端的异步消息。服务端将要发送的消息放入到队列池中,接收端可以根据RabbitMQ配置的转发机制接收服务器发来的消息。RabbitMQ依据指定的转发规则进行消息的转发,缓冲,和持久化操作。主要用在多服务器间或但服务器的子系统间进行通信,是分布式系统标准的配置。
在这里插入图片描述

Exchange

接受生产者发送的消息,并根据Binding规则将消息路由给服务器中的队列,ExchangeType决定了Exchange路由消息的行为。在RebbitMQ中,ExchangeType常用的direct,Fanout和Topic
在这里插入图片描述

Message Queue

消息队列。我们发送给RabbitMQ消息最后都会到达各种queue,并且存储在其中

Binding Key

它表示的是Exchange与Message Queue是通过binding key进行联系的,这个关系是固定的

Routing Key

生产者在将消息发送给Exchange的时候,一定会指定一个routing key,来指定这个消息的路由规则。

RabbitMQ安装
Docker 启动RabbitMQ

下载镜像,
关闭防火墙
systemctl stop firewalld
启动docker系统服务
systemctl restart docker

RabbitMQ六种工作模式

简单模式

简单模式,只有一个消费者
RabbitMQ是一个消息中间件,你可以想象它是一个邮局,一个邮箱,一个邮递员。

生产者发送消息

package rabbitmq.simple;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class Test1 {
   
	public static void main(String[] args) throws Exception {
   
		//创建连接工厂,并设置连接信息
		ConnectionFactory f = new ConnectionFactory();
		f.setHost("192.168.64.140");
		f.setPort(5672);//可选,5672是默认端口
		f.setUsername("admin");
		f.setPassword("admin");

		/*
		 * 与rabbitmq服务器建立连接,
		 * rabbitmq服务器端使用的是nio,会复用tcp连接,
		 * 并开辟多个信道与客户端通信
		 * 以减轻服务器端建立连接的开销
		 */
		Connection c = f.newConnection();
		//建立信道
		Channel ch = c.createChannel();

		/*
		 * 声明队列,会在rabbitmq中创建一个队列
		 * 如果已经创建过该队列,就不能再使用其他参数来创建
		 * 
		 * 参数含义:
		 *   -queue: 队列名称
		 *   -durable: 队列持久化,true表示RabbitMQ重启后队列仍存在
		 *   -exclusive: 排他,true表示限制仅当前连接可用
		 *   -autoDelete: 当最后一个消费者断开后,是否删除队列
		 *   -arguments: 其他参数
		 */
		ch.queueDeclare("helloworld", false,false,false,null);

		/*
		 * 发布消息
		 * 这里把消息向默认交换机发送.
		 * 默认交换机隐含与所有队列绑定,routing key即为队列名称
		
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值