消息中间件RocketMQ知识汇总


什么是消息中间件?

消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。对于消息中间件,常见的角色大致也就有Producer(生产者)、Consumer(消费者)例如:寄快递。
在这里插入图片描述


常见消息中间件比较

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

RocketMQ

RocketMQ是阿里巴巴开源的分布式消息中间件,现在是Apache的一个顶级项目。在阿里内部使用非常广泛,已经经过了"双11"这种万亿级的应用场景考验。

1.RocketMQ的架构及概念

在这里插入图片描述
如上图所示,整体可以分成4个角色,分别是:NameServer,Broker,Producer,Consumer
为了方便理解,我们将整套RocketMQ可以理解成为一套完整的快递业务:

  1. Broker(邮递员):Broker是RocketMQ的核心,负责消息的接收,存储,投递等功能
  2. NameServer(邮局):消息队列的协调者,Broker向它注册路由信息,同时Producer和Consumer向其获取路由信息
  3. Producer(寄件人):消息的生产者,需要从NameServer获取Broker信息,然后与Broker建立连接,向Broker发送消息
  4. Consumer(收件人):消息的消费者,需要从NameServer获取Broker信息,然后与Broker建立连接,从Broker获取消息
  5. Topic(地区):用来区分不同类型的消息,发送和接收消息前都需要先创建Topic,针对Topic来发送和接收消息
  6. Message Queue(邮件):为了提高性能和吞吐量,引入了Message Queue,一个Topic可以设置一个或多个MessageQueue,这样消息就可以并行往各个Message Queue发送消息,消费者也可以并行的从多个Message Queue读取消息
  7. Message:Message 是消息的载体。

2.RocketMQ消息发送和接收演示

  1. 启动RocketMQ
    在解压缩后的bin目录中启动cmd命令窗口:
    输入指令:start mqnamesrv.cmd(启动NameServer)
    输入指令:start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnable=true
    如果弹出框提示‘错误: 找不到或无法加载主类 xxxxxx’。在bin下找到并打开runbroker.cmd,然后将‘%CLASSPATH%’加上英文双引号
    在这里插入图片描述
  2. 项目中加入RocketMQ依赖坐标:
<dependency>
	<groupId>org.apache.rocketmq</groupId>
	<artifactId>rocketmq-client</artifactId>
	<version>4.4.0</version>
</dependency>
  1. 发送同步消息(创造消息生产者
/**
 * @author 杨树林
 * @version 1.0
 * @since 14/8/2023
 */
//同步消息发送
public class RocketMQSendTest1 {
    public static void main(String[] args) throws MQClientException, RemotingException, InterruptedException, MQBrokerException {
        //1.创建消息生产者,指定生产者所属的组名
        DefaultMQProducer defaultMQProducer = new DefaultMQProducer("myproducer-group");
        //2.指定Nameserver地址
        defaultMQProducer.setNamesrvAddr("localhost:9876");
        //3.启动生产者
        defaultMQProducer.start();
        //4.创建消息对象,指定主题,标签和消息体
        for (int i = 0; i <10 ; i++) {
            Message message = new Message("myTopic","myTag",("十行代码九个错误八个警告竟敢说七天精通六天学会五湖四海也不见如此三心二意之程序简直一等下流"+i).getBytes());
            //5.发送消息
            SendResult sendResult = defaultMQProducer.send(message);
            System.out.println(sendResult);
        }
        //6.关闭生产者
        defaultMQProducer.shutdown();
    }
}
  1. 接收消息(创造消息消费者
/**
 * @author 杨树林
 * @version 1.0
 * @since 14/8/2023
 */
public class RocketMQReceiveTest1 {
    public static void main(String[] args) throws MQClientException {
        //1.创建消费者并分组
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("myconsumer-group");
        //2.指定nameserver地址
        consumer.setNamesrvAddr("localhost:9876");
        //3.指定消费者订阅主题和标签
        consumer.subscribe("myTopic","*");
        //均衡模式:多个消费者瓜分生产者的消息
//        consumer.setMessageModel(MessageModel.CLUSTERING);
        //广播模式:多个消费者都拿到全部的生产者消息
        consumer.setMessageModel(MessageModel.BROADCASTING);
        //4.设置回调函数,编写处理消息的方法
        consumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
                //获取传输数据
                System.out.println(new String(list.get(0).getBody()));
                //返回消费状态
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        //5.启动消费者
        consumer.start();
        System.out.println("Consumer Starting!");
    }
}
  1. 发送方式除了同步发送以外,还有异步发送和单向发送两种

异步发送:异步消息通常用在对响应时间敏感的业务场景,即发送端不能容忍长时间地等待Broker的响应。

public class RocketMQSendTest2 {
    public static void main(String[] args) throws MQClientException, RemotingException, InterruptedException {
        //1.创建消息生产者
        DefaultMQProducer producer = new DefaultMQProducer("myproducer-group");
        //2.指定nameserver
        producer.setNamesrvAddr("localhost:9876");
        //3.启动生产者
        producer.start();
        for (int i = 0; i <10 ; i++) {
            Message message = new Message("myTopic","MyTag2","三二一".getBytes());
            producer.send(message,new SendCallback(){
               @Override
                public void onSuccess(SendResult sendResult) {
                    System.out.println("发送成功"+sendResult);
                }
                @Override
                public void onException(Throwable throwable) {
                    System.out.println("发送失败"+throwable);
                }
            });
            TimeUnit.SECONDS.sleep(3);
        }
        //关闭生产者
        producer.shutdown();
    }
}

单向发送:这种方式主要用在不特别关心发送结果的场景,例如日志发送。

//单向消息发送
public class RocketMQSendTest3 {
    public static void main(String[] args) throws MQClientException, RemotingException, InterruptedException, MQBrokerException {
        //1.创建消息生产者,指定生产者所属的组名
        DefaultMQProducer defaultMQProducer = new DefaultMQProducer("myproducer-group");
        //2.指定Nameserver地址
        defaultMQProducer.setNamesrvAddr("localhost:9876");
        //3.启动生产者
        defaultMQProducer.start();
        //4.创建消息对象,指定主题,标签和消息体
        for (int i = 0; i <10 ; i++) {
            Message message = new Message("myTopic", "myTag", "十行代码九个错误八个警告竟敢说七天精通六天学会五湖四海也不见如此三心二意之程序简直一等下流".getBytes());
            //5.发送消息,没有返回值,只管发送,不管接收
            defaultMQProducer.sendOneway(message);
        }
        //6.关闭生产者
        defaultMQProducer.shutdown();
    }
}
  1. 三种发送方式的区别:
    在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值