当前位置: 首页 > news >正文

【SpringCloud】什么是MQ

RabbitMQ

1.什么是MQ

1.1 同步和异步通信

微服务间通讯有同步和异步两种方式:

  • 同步通讯:就例如打电话一样,需要实时响应
  • 异步通讯:就例如发邮件一样,不需要马上回复
1.1.1同步通讯

Feign的远程调用就属于同步通讯,虽然可以得到实时响应,但是也存在一些问题

同步调用的优点:时效性较强,可以立即得到结果

同步调用的问题:

  • 耦合度高
  • 性能和吞吐能力下降
  • 有额外的资源消耗
  • 有级联失败问题
1.1.2异步通讯

异步调用可以避免同步调用出现的问题,发布方和接收方两者不是直接通信,而是有一个中间件,它就像数据总线一样,所有的服务要接收数据和发送数据都发到这个总线上,它让服务见的通讯变得标准和可控。

优点:

  • 吞吐量提升:无需等待订阅者处理完成,响应更快速
  • 故障隔离:服务没有直接调用,不存在级联失败问题
  • 调用间没有阻塞:不会造成无效的资源占用
  • 耦合度极低:每个服务都可以灵活插拔,可替换
  • 流量削峰:不管发布事件的流量波动多大,都由Broker接收,订阅者可以按照自己的速度去处理事件

缺点:

  • 架构复杂化,业务没有明显的流程先,不好管理
  • 需要依赖于Broker的可靠、安全、性能

1.2 技术对比

MQ,中文是消息队列(MessageQueue),字面来看就是存放消息的队列。也就是事件驱动架构中的Broker。

比较常见的MQ实现:

  • ActiveMQ
  • RabbitMQ
  • RocketMQ
  • Kafka

几种常见MQ的对比:

RabbitMQActiveMQRocketMQKafka
公司/社区RabbitApache阿里Apache
开发语言ErlangJavaJavaScala&Java
协议支持AMQP,XMPP,SMTP,STOMPOpenWire,STOMP,REST,XMPP,AMQP自定义协议自定义协议
可用性一般
单机吞吐量一般非常高
消息延迟微秒级毫秒级毫秒级毫秒以内
消息可靠性一般一般

追求可用性:Kafka、 RocketMQ 、RabbitMQ

追求可靠性:RabbitMQ、RocketMQ

追求吞吐能力:RocketMQ、Kafka

追求消息低延迟:RabbitMQ、Kafka

2.快速入门

MQ基本结构:

RabbitMQ中的一些角色:

  • publisher:生产者
  • consumer:消费者
  • exchange:交换机,负责消息路由
  • queue:队列,存储消息
  • virtualHost:虚拟主机,隔离不同租户的exchange、queue、消息的隔离
2.1RabbitMQ消息模型

RabbitMQ官方提供了5个不同的示例,对应了不同的消息模型:

  • 基本消息队列(BasicQueue)
  • 工作消息队列(WorkQueue)
  • 发布订阅,又根据交换机类型不同分为三种:
    • Fanout Exchange:广播
    • Direct Exchange:路由
    • Topic Exchange:主题

2.4.1.publisher实现

简单队列模式的模型图:
在这里插入图片描述

步骤:

  • 建立连接
  • 创建Channel
  • 声明队列
  • 发送消息
  • 关闭连接和channel

代码实现:

package com.example.mq.helloworld;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import org.junit.Test;import java.io.IOException;
import java.util.concurrent.TimeoutException;public class PublisherTest {@Testpublic void testSendMessage() throws IOException, TimeoutException {// 1.建立连接ConnectionFactory factory = new ConnectionFactory();// 1.1.设置连接参数,分别是:主机名、端口号、vhost、用户名、密码factory.setHost("192.168.150.101");factory.setPort(5672);factory.setVirtualHost("/");factory.setUsername("haojiale");factory.setPassword("123321");// 1.2.建立连接Connection connection = factory.newConnection();// 2.创建通道ChannelChannel channel = connection.createChannel();// 3.创建队列String queueName = "simple.queue";channel.queueDeclare(queueName, false, false, false, null);// 4.发送消息String message = "hello, rabbitmq!";channel.basicPublish("", queueName, null, message.getBytes());System.out.println("发送消息成功:【" + message + "】");// 5.关闭通道和连接channel.close();connection.close();}
}

2.4.2.consumer实现

步骤:

  • 建立连接
  • 创建Channel
  • 声明队列
  • 订阅消息

代码实现:

package com.example.mq.helloworld;import com.rabbitmq.client.*;import java.io.IOException;
import java.util.concurrent.TimeoutException;public class ConsumerTest {public static void main(String[] args) throws IOException, TimeoutException {// 1.建立连接ConnectionFactory factory = new ConnectionFactory();// 1.1.设置连接参数,分别是:主机名、端口号、vhost、用户名、密码factory.setHost("192.168.150.101");factory.setPort(5672);factory.setVirtualHost("/");factory.setUsername("haojiale");factory.setPassword("123321");// 1.2.建立连接Connection connection = factory.newConnection();// 2.创建通道ChannelChannel channel = connection.createChannel();// 3.创建队列String queueName = "simple.queue";channel.queueDeclare(queueName, false, false, false, null);// 4.订阅消息channel.basicConsume(queueName, true, new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag## 标题, Envelope envelope,AMQP.BasicProperties properties, byte[] body) throws IOException {// 5.处理消息String message = new String(body);System.out.println("接收到消息:【" + message + "】");}});System.out.println("等待接收消息。。。。");}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux内核编程(十二)热插拔
  • Linux云计算 |【第二阶段】OPERATION-DAY2
  • CSS 伪类和伪元素
  • 5款好用的录屏软件大测评!2024最新视频录制软件排行榜
  • 8款必备人事管理系统,助力企业高效运营
  • 算法:最长递增子序列
  • docker数据卷、资源控制
  • Java中Spring基础知识理解
  • 如何用剪映自动批量生成左右分屏的视频?
  • 080:vue+mapbox中interpolate 的详细解释
  • 【深度学习】【语音】TTS,MeloTTS代码讲解
  • 图像识别,图片线条检测
  • SpringBoot优雅开发REST API最佳实践
  • Socks5代理IP在跨境电商和网络爬虫领域的实战应用
  • 八种排序算法的复杂度(C语言)
  • Android Volley源码解析
  • angular组件开发
  • Docker: 容器互访的三种方式
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • jquery ajax学习笔记
  • MQ框架的比较
  • node入门
  • React中的“虫洞”——Context
  • Redis中的lru算法实现
  • text-decoration与color属性
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • vue.js框架原理浅析
  • 给新手的新浪微博 SDK 集成教程【一】
  • 回顾 Swift 多平台移植进度 #2
  • 面试总结JavaScript篇
  • 浅谈web中前端模板引擎的使用
  • 微信小程序--------语音识别(前端自己也能玩)
  • 字符串匹配基础上
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • Java性能优化之JVM GC(垃圾回收机制)
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • %@ page import=%的用法
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (SpringBoot)第七章:SpringBoot日志文件
  • (zhuan) 一些RL的文献(及笔记)
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (含笔试题)深度解析数据在内存中的存储
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (算法)前K大的和
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计
  • .Net core 6.0 升8.0
  • .Net Core与存储过程(一)
  • .Net 基于MiniExcel的导入功能接口示例
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .net解析传过来的xml_DOM4J解析XML文件
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • @EnableConfigurationProperties注解使用
  • @html.ActionLink的几种参数格式