MQ(仅供自己参考)

news2024/11/30 11:52:22

同步通讯的优缺点:

优点:时效高,数据一致,过程简单

缺点:耦合度高。性能下降。CPU等待资源的浪费。级联失败。

2、异步通讯:异步调用常见的实现就是事件驱动模式

异步的优缺点:

优点:耦合度低 ,吞吐量提升 ,故障隔离(不在联机发生失败) ,流量削峰(Broker缓存事件,让其他服务慢慢来执行)

缺点:依赖于Broker的可靠性、安全性、吞吐量

架构复杂,没有明显的流程线,不好追踪管理

一般的项目都是使用同步通讯,因为需要拿到其他服务的返回结果,而异步通讯只是通知他有事情要做,而不需要他返回结果。

三、RabbitMq:

是一个开源的消息代理软件,广泛用于实现消息传递和异步处理。它基于消息队列的设计理念,允许不同的应用程序或服务之间进行通信,而无需它们直接相互依赖。

主要特点:

  1. 可靠性:RabbitMQ 提供消息确认机制,确保消息在处理过程中不会丢失。

  2. 灵活的路由:通过交换机和队列的配置,RabbitMQ 支持多种消息路由模式,包括点对点和发布/订阅。

  3. 多协议支持:支持多种消息协议,如 AMQP、STOMP 和 MQTT。

  4. 高可用性:通过集群和镜像队列功能,可以实现高可用性和负载均衡。

  5. 管理界面:提供用户友好的管理界面,便于监控和管理消息队列。

几种模式:

AMQP:

AMQP(Advanced Message Queuing Protocol)是一种开放标准的消息传递协议,旨在支持消息的可靠传递和异步通信。它允许不同的应用程序通过消息代理进行通信,无论这些应用程序使用的编程语言或平台如何。

AMQP 的主要特点包括:

  1. 消息队列:支持将消息存储在队列中,允许消费者异步处理消息。
  2. 发布/订阅模式:支持多种消息传递模式,包括点对点和发布/订阅。
  3. 可靠性:提供消息确认机制,确保消息不会丢失。
  4. 灵活性:支持不同的消息传递场景,适用于多种分布式系统。
  5. 跨平台:由于其开放性,AMQP 可以在不同的操作系统和语言之间进行互操

RabbitMQ的依赖,yml配置:

   <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>




spring:
  rabbitmq:
    host: 192.168.136.128   #地址
    port: 5672                #端口
    username: root        #用户账号
    password: root        #用户密码
    virtual-host: /        

RabbitMQ:发送和接收:

发送

package org.example;

import org.junit.jupiter.api.Test;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class RabbitMQTest {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void sendMessage()
    {
        rabbitTemplate.convertAndSend("simple.cc","hello,RabbitMq");
    }

}

接收

package org.example.listener;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class SimpleQueueListener {

    @RabbitListener(queues = "simple.cc")
    public void getMessage(String message)
    {
        log.info(message);
    }
}

2、workqueue:

代码:workqueue有预取机制,当一个没有设置预取上限,那么两个消费者会均分消息,即使不能立即处理也会将消息拿到。当设置prefetch的值那么就会按这个上限那取一定数量的消息,将消息处理完成之后,再从队列中拿消息。

package org.example;

import org.junit.jupiter.api.Test;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class RabbitMQTest {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void sendWorkQueue()
    {
        for (int i = 0; i < 50; i++) {
            rabbitTemplate.convertAndSend("simple.cc","hello,--"+ i);
            try {
                Thread.sleep(20);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }

}




package org.example.listener;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class SimpleQueueListener {

    //@RabbitListener(queues = "simple.cc")
    //public void getMessage(String message)
    //{
    //    log.info(message);
    //}

    @RabbitListener(queues = "simple.cc")
    public void getWorkQueueMessage(String message)
    {
        log.info(message);
        try {
            Thread.sleep(20);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    @RabbitListener(queues = "simple.cc")
    public void getWorkQueueMessages2(String message) {
        log.error(message);
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}




3、发布订阅模式:

4、Fanout交换机:将消息路由到每一个队列,缺点是exchange只是转发消息,而不保存,如果路由的时候丢失消息那么消息就直接丢失了。

代码:

    @RabbitListener(queues = "fanout.queue1")
    public void getFanoutMessage(String message)
    {
        log.info(message);
    }

    @RabbitListener(queues = "fanout.queue2")
    public void getFanoutMessage1(String message)
    {
        log.info(message);
    }



package org.example.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FanoutConfig {

    @Bean
    public FanoutExchange fanoutExchange()
    {
        return new FanoutExchange("cc.fanout");
    }

    @Bean
    public Queue fanoutQueue1()
    {
        return new Queue("fanout.queue1");
    }

    @Bean
    public Queue fanoutQueue2()
    {
        return new Queue("fanout.queue2");
    }

    @Bean
    public Binding binding(Queue fanoutQueue1,FanoutExchange fanoutExchange)
    {
        return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);
    }

    @Bean
    public Binding binding2(Queue fanoutQueue2,FanoutExchange fanoutExchange)
    {
        return BindingBuilder.bind(fanoutQueue2).to(fanoutExchange);
    }
}




    @Test
    public void sendFanoutMessage()
    {
        rabbitTemplate.convertAndSend("cc.fanout","","hello,fanout");
    }

5、Direct:可以通过key与相应的queue绑定,绑定之后相应的key只能发送到相应的queue上。当然一个queue可以绑定多个key,那么就可以实现广播(fanout)

代码:

   @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "direct.queue1"),
            exchange = @Exchange(name = "cc.direct",type = ExchangeTypes.DIRECT),
            key = {"blue","red"}
    ))
    public void getDirectMessage1(String message)
    {
        log.info(message);
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "direct.queue2"),
            exchange = @Exchange(name = "cc.direct",type = ExchangeTypes.DIRECT),
            key = {"yellow","red"}
    ))
    public void getDirectMessage2(String message)
    {
        log.info(message);
    }



  @Test
    public void sendFanoutMessage()
    {
        rabbitTemplate.convertAndSend("cc.direct","red","hello,direct");
        rabbitTemplate.convertAndSend("cc.direct","blue","hello,direct,blue");
        rabbitTemplate.convertAndSend("cc.direct","yellow","hello,direct,yellow");
    }

6、Topic:通过通配符来匹配某一类消息,通过key的匹配来选择不需要的某一类消息

代码:

    @Test
    public void sendTopicMessage()
    {
        rabbitTemplate.convertAndSend("cc.topic","china.cc","hello,china,cc");
        rabbitTemplate.convertAndSend("cc.topic","china.news","china,weather");
        rabbitTemplate.convertAndSend("cc.topic","japan.news","japan,weather");
    }
  @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "topic.queue1"),
            exchange = @Exchange(name = "cc.topic",type = ExchangeTypes.TOPIC),
            key = "china.#"
    ))
    public void getTopicMessage1(String message)
    {
        log.info(message);
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "topic.queue2"),
            exchange = @Exchange(name = "cc.topic",type = ExchangeTypes.TOPIC),
            key = "*.news"
    ))
    public void getTopicMessage2(String message)
    {
        log.info(message);
    }

7、SpringAMQP:消息转换器,默认使用jdk的序列化

引依赖:

<!--json-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.14.0</version>
        </dependency>

添加配置,覆盖原本的序列化方式:

 @Bean
    public MessageConverter messageConverter()
    {
        return new Jackson2JsonMessageConverter();
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2191637.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

隐喻的使用及误用

Larry Constantine 著&#xff0c;whoisred 译 长期以来&#xff0c;在图形用户界面设计中&#xff0c;隐喻&#xff08;metaphor&#xff09;一直很流行。但是&#xff0c;虽然有少数简单的隐喻——如文件夹及垃圾箱——令人击节叫好&#xff0c;可事实上&#xff0c;大多数隐…

去噪扩散模型

Denoising Diffusion Probabilistic Models 图像扩散模型是一种生成模型&#xff0c;它基于概率扩散过程来生成新的图像。 核心步骤包括&#xff1a;&#xff08;1&#xff09;前向扩散过程&#xff1b;&#xff08;2&#xff09;逆向扩散过程 前向扩散过程&#xff08;正向过…

第十五周:机器学习笔记

第十五周周报 摘要Abstract一、机器学习1. 各式各样神奇的自注意力机制1.1 Local Attention/Truncated Attention&#xff08;截断注意力机制&#xff09;1.2 Stride Attention&#xff08;跨步注意力机制&#xff09;1.3 Global Attention&#xff08;全局注意力机制&#xff…

Jenkins pipeline配置示例

前提条件&#xff1a;已经安装Jenkins并能正常启动 如果Jenkins安装启动遇到问题可以参考&#xff1a; 1.创建pipeline 点击新建项目&#xff1a; 输入名称&#xff0c;选择pipeline&#xff1a; 进入配置页面&#xff0c;如果要配置GitHub Webhook要勾选&#xff1a;<fo…

k8s 中的金丝雀发布(灰度发布)

目录 1 什么是金丝雀发布 2 Canary 发布方式 3 Canary 两种发布方式实操 3.1 准备工作 3.1.1 将 nginx 命名两个版本 v1 与 v2 3.1.2 暴露端口并指定微服务类型 3.1.3 进入 pod 修改默认发布文件 3.1.4 测试 service 是否正常 3.2 基于权重的灰度发布 3.2.1 创建 Igress 资源类…

Uncaught TypeError: 0 is not a function的解决方法

好久不见&#xff0c;我胡汉三又回来了。 是的&#xff0c;我又发现问题了。 写JS的时候&#xff0c;发现了一堆原则性的问题&#xff0c;但是这些问题又刚好是别人没怎么遇到的。 是的&#xff0c;我用ChatGPT了。 (function frame() {window.requestAnimationFrame(frame)…

NVIDIA网卡系列之ConnectX-3规格信息(10G-PCIe 3.0x4-PF?VF?-2013年发布)

背景 NVIDIA ConnectX-3系列的网卡&#xff0c;早期还在Mellanox未被NVIDIA收购的时候就发布了&#xff0c;支持10G&#xff0c;PCIe3.0&#xff0c;最大x8通道lanes。 是10G级别的一代&#xff08;10G-CX3&#xff0c;50G-CX4&#xff0c;100G-CX5&#xff0c;200G-CX6&#…

Linux线程(七)线程安全详解

当我们编写的程序是一个多线程应用程序时&#xff0c;就不得不考虑到线程安全的问题&#xff0c;确保我们编写的程序是一个线程安全&#xff08;thread-safe&#xff09;的多线程应用程序&#xff0c;什么是线程安全以及如何保证线程安全&#xff1f;带着这些问题&#xff0c;本…

光伏项目管理如何更高效化?

一、项目规划与启动阶段的优化 1、智能规划工具&#xff1a;光伏管理软件通常配备有智能项目规划模块&#xff0c;能够根据地理位置、气候条件、政策补贴等因素&#xff0c;自动计算最佳装机容量、预测发电量及收益&#xff0c;帮助项目团队快速制定合理的项目方案。这大大缩短…

大数据毕业设计选题推荐-NBA球员数据分析系统-Python数据可视化-Hive-Hadoop-Spark

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇…

知识图谱入门——9: spaCy中命名实体识别(NER)任务中的预定义标签详解及案例(GPE、MONEY、PRODUCT、LAW、FAC、NORP是什么?)

命名实体识别&#xff08;NER, Named Entity Recognition&#xff09;是自然语言处理&#xff08;NLP&#xff09;中的重要任务之一&#xff0c;旨在从文本中识别出特定的实体&#xff0c;如人名、地名、时间等。spaCy 是一个广泛使用的 NLP 库&#xff0c;它提供了预训练的模型…

数据结构之排序(5)

摘要&#xff1a;本文主要讲各种排序算法&#xff0c;注意它们的时间复杂度 概念 将各元素按关键字递增或递减排序顺序重新排列 评价指标 稳定性: 关键字相同的元素经过排序后相对顺序是否会改变 时间复杂度、空间复杂度 分类 内部排序——数据都在内存中 外部排序——…

涂色问题 乘法原理(2024CCPC 山东省赛 C)

//*下午打得脑子连着眼睛一起疼 很多很基础的题目都没有做出来&#xff0c;规律题也找得很慢。比如下面这题&#xff0c;一定要多做&#xff0c;下次看到就直接写。 原题链接&#xff1a;https://codeforces.com/group/w6iGs8kreW/contest/555584/problem/C C. Colorful Segm…

LabVIEW光偏振态检测系统

开发一套LabVIEW的高精度光偏振态检测系统&#xff0c;采用机械转动法结合光电探测器和高性能数据采集硬件&#xff0c;能快速、准确地测量光的偏振状态。该系统广泛应用于物理研究、激光技术和光学工业中。 系统组成 该光偏振态检测系统主要由以下硬件和软件模块构成&#xf…

无人机+无人车+机器狗+无人船:大规模组网系统技术详解

无人机、无人车、机器狗和无人船的大规模组网系统技术&#xff0c;是实现海陆空全空间无人设备协同作业的关键。这种组网系统技术通过集成先进的通信、控制、感知和决策技术&#xff0c;使得不同类型的无人平台能够高效、准确地完成各种复杂任务。以下是对该技术的详细解析&…

SysML案例-呼吸机

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>> 图片示例摘自intercax.com&#xff0c;作者是Intercax公司总裁Dirk Zwemer博士。

【项目安全设计】软件系统安全设计规范和标准(doc原件)

1.1安全建设原则 1.2 安全管理体系 1.3 安全管理规范 1.4 数据安全保障措施 1.4.1 数据库安全保障 1.4.2 操作系统安全保障 1.4.3 病毒防治 1.5安全保障措施 1.5.1实名认证保障 1.5.2 接口安全保障 1.5.3 加密传输保障 1.5.4终端安全保障 资料获取&#xff1a;私信或者进主页。…

将列表中的各字符串sn连接成为一个字符串s使用;将各sn间隔开os.pathsep.join()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 将列表中的各字符串sn 连接成为一个字符串s 使用;将各sn间隔开 os.pathsep.join() [太阳]选择题 下列说法中正确的是? import os paths ["/a", "/b/c", "/d&q…

Android开发修改为原生主题(在Android Studio开发环境下)

结构如下图&#xff1a; 修改方法&#xff1a;在Android模式目录下&#xff0c;将res下的values文下的themes.xml文件中的 &#xff1a; parent"Theme.Material3.DayNight.NoActionBar" 修改为&#xff1a; parent"Theme.MaterialComponents.DayNight.Bridge&…

Meta 推出Movie Gen

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…